Messages in this thread Patch in this message | | | Date | Mon, 7 Oct 2002 03:44:41 -0300 | From | Arnaldo Carvalho de Melo <> | Subject | [BKPATCH] Appletalk: use seq_file for proc stuff |
| |
David,
Please consider pulling from:
master.kernel.org:/home/acme/BK/llc-2.5
This is the only outstanding changeset there.
Tomorrow I'll do the missing bit: the aarp proc stuff will be moved to atalk_proc.c too.
And will also fix the .permission bogosity in IPX and LLC.
- Arnaldo
You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual.
===================================================================
ChangeSet@1.632, 2002-10-07 03:27:57-03:00, acme@conectiva.com.br o Appletalk: use seq_file for proc stuff And also move MODULE_LICENSE from aarp.c to ddp.c, as its there that the module_init/exit is. Also added MODULE_AUTHOR and MODULE_DESCRIPTION.
include/linux/atalk.h | 14 + net/appletalk/Makefile | 2 net/appletalk/aarp.c | 22 -- net/appletalk/atalk_proc.c | 319 +++++++++++++++++++++++++++++++++++++++ net/appletalk/ddp.c | 244 +++++------------------------ net/appletalk/sysctl_net_atalk.c | 7 6 files changed, 385 insertions(+), 223 deletions(-)
diff -Nru a/include/linux/atalk.h b/include/linux/atalk.h --- a/include/linux/atalk.h Mon Oct 7 03:28:22 2002 +++ b/include/linux/atalk.h Mon Oct 7 03:28:22 2002 @@ -198,5 +198,19 @@ #define at_sk(__sk) ((struct atalk_sock *)(__sk)->protinfo) +extern struct sock *atalk_sockets; +extern spinlock_t atalk_sockets_lock; + +extern struct atalk_route *atalk_routes; +extern rwlock_t atalk_routes_lock; + +extern struct atalk_iface *atalk_interfaces; +extern spinlock_t atalk_interfaces_lock; + +extern struct atalk_route atrtr_default; + +extern int atalk_proc_init(void); +extern void atalk_proc_exit(void); + #endif /* __KERNEL__ */ #endif /* __LINUX_ATALK_H__ */ diff -Nru a/net/appletalk/Makefile b/net/appletalk/Makefile --- a/net/appletalk/Makefile Mon Oct 7 03:28:22 2002 +++ b/net/appletalk/Makefile Mon Oct 7 03:28:22 2002 @@ -6,7 +6,7 @@ obj-$(CONFIG_ATALK) += appletalk.o -appletalk-y := aarp.o ddp.o +appletalk-y := aarp.o ddp.o atalk_proc.o appletalk-$(CONFIG_SYSCTL) += sysctl_net_atalk.o appletalk-objs := $(appletalk-y) diff -Nru a/net/appletalk/aarp.c b/net/appletalk/aarp.c --- a/net/appletalk/aarp.c Mon Oct 7 03:28:22 2002 +++ b/net/appletalk/aarp.c Mon Oct 7 03:28:22 2002 @@ -30,34 +30,13 @@ */ #include <linux/config.h> -#include <asm/uaccess.h> -#include <asm/system.h> -#include <asm/bitops.h> -#include <linux/types.h> -#include <linux/kernel.h> -#include <linux/sched.h> -#include <linux/string.h> -#include <linux/mm.h> -#include <linux/socket.h> -#include <linux/sockios.h> -#include <linux/in.h> -#include <linux/errno.h> -#include <linux/interrupt.h> -#include <linux/if_ether.h> -#include <linux/inet.h> -#include <linux/notifier.h> -#include <linux/netdevice.h> -#include <linux/etherdevice.h> #include <linux/if_arp.h> -#include <linux/skbuff.h> -#include <linux/spinlock.h> #include <net/sock.h> #include <net/datalink.h> #include <net/psnap.h> #include <linux/atalk.h> #include <linux/init.h> #include <linux/proc_fs.h> -#include <linux/module.h> int sysctl_aarp_expiry_time = AARP_EXPIRY_TIME; int sysctl_aarp_tick_time = AARP_TICK_TIME; @@ -995,4 +974,3 @@ proc_net_remove("aarp"); } #endif -MODULE_LICENSE("GPL"); diff -Nru a/net/appletalk/atalk_proc.c b/net/appletalk/atalk_proc.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/net/appletalk/atalk_proc.c Mon Oct 7 03:28:22 2002 @@ -0,0 +1,319 @@ +/* + * atalk_proc.c - proc support for Appletalk + * + * Copyright(c) Arnaldo Carvalho de Melo <acme@conectiva.com.br> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, version 2. + */ + +#include <linux/config.h> +#include <linux/init.h> +#include <linux/proc_fs.h> +#include <linux/seq_file.h> +#include <net/sock.h> +#include <linux/atalk.h> + +#ifdef CONFIG_PROC_FS +static __inline__ struct atalk_iface *atalk_get_interface_idx(loff_t pos) +{ + struct atalk_iface *i; + + for (i = atalk_interfaces; pos && i; i = i->next) + --pos; + + return i; +} + +static void *atalk_seq_interface_start(struct seq_file *seq, loff_t *pos) +{ + loff_t l = *pos; + + spin_lock_bh(&atalk_interfaces_lock); + return l ? atalk_get_interface_idx(--l) : (void *)1; +} + +static void *atalk_seq_interface_next(struct seq_file *seq, void *v, loff_t *pos) +{ + struct atalk_iface *i; + + ++*pos; + if (v == (void *)1) { + i = NULL; + if (atalk_interfaces) + i = atalk_interfaces; + goto out; + } + i = v; + i = i->next; +out: + return i; +} + +static void atalk_seq_interface_stop(struct seq_file *seq, void *v) +{ + spin_unlock_bh(&atalk_interfaces_lock); +} + +static int atalk_seq_interface_show(struct seq_file *seq, void *v) +{ + struct atalk_iface *iface; + + if (v == (void *)1) { + seq_puts(seq, "Interface Address Networks " + "Status\n"); + goto out; + } + + iface = v; + seq_printf(seq, "%-16s %04X:%02X %04X-%04X %d\n", + iface->dev->name, ntohs(iface->address.s_net), + iface->address.s_node, ntohs(iface->nets.nr_firstnet), + ntohs(iface->nets.nr_lastnet), iface->status); +out: + return 0; +} + +static __inline__ struct atalk_route *atalk_get_route_idx(loff_t pos) +{ + struct atalk_route *r; + + for (r = atalk_routes; pos && r; r = r->next) + --pos; + + return r; +} + +static void *atalk_seq_route_start(struct seq_file *seq, loff_t *pos) +{ + loff_t l = *pos; + + read_lock_bh(&atalk_routes_lock); + return l ? atalk_get_route_idx(--l) : (void *)1; +} + +static void *atalk_seq_route_next(struct seq_file *seq, void *v, loff_t *pos) +{ + struct atalk_route *r; + + ++*pos; + if (v == (void *)1) { + r = NULL; + if (atalk_routes) + r = atalk_routes; + goto out; + } + r = v; + r = r->next; +out: + return r; +} + +static void atalk_seq_route_stop(struct seq_file *seq, void *v) +{ + read_unlock_bh(&atalk_routes_lock); +} + +static int atalk_seq_route_show(struct seq_file *seq, void *v) +{ + struct atalk_route *rt; + + if (v == (void *)1) { + seq_puts(seq, "Target Router Flags Dev\n"); + goto out; + } + + if (atrtr_default.dev) { + rt = &atrtr_default; + seq_printf(seq, "Default %04X:%02X %-4d %s\n", + ntohs(rt->gateway.s_net), rt->gateway.s_node, + rt->flags, rt->dev->name); + } + + rt = v; + seq_printf(seq, "%04X:%02X %04X:%02X %-4d %s\n", + ntohs(rt->target.s_net), rt->target.s_node, + ntohs(rt->gateway.s_net), rt->gateway.s_node, + rt->flags, rt->dev->name); +out: + return 0; +} + +static __inline__ struct sock *atalk_get_socket_idx(loff_t pos) +{ + struct sock *s; + + for (s = atalk_sockets; pos && s; s = s->next) + --pos; + + return s; +} + +static void *atalk_seq_socket_start(struct seq_file *seq, loff_t *pos) +{ + loff_t l = *pos; + + spin_lock_bh(&atalk_sockets_lock); + return l ? atalk_get_socket_idx(--l) : (void *)1; +} + +static void *atalk_seq_socket_next(struct seq_file *seq, void *v, loff_t *pos) +{ + struct sock *i; + + ++*pos; + if (v == (void *)1) { + i = NULL; + if (atalk_sockets) + i = atalk_sockets; + goto out; + } + i = v; + i = i->next; +out: + return i; +} + +static void atalk_seq_socket_stop(struct seq_file *seq, void *v) +{ + spin_unlock_bh(&atalk_sockets_lock); +} + +static int atalk_seq_socket_show(struct seq_file *seq, void *v) +{ + struct sock *s; + struct atalk_sock *at; + + if (v == (void *)1) { + seq_printf(seq, "Type Local_addr Remote_addr Tx_queue " + "Rx_queue St UID\n"); + goto out; + } + + s = v; + at = at_sk(s); + + seq_printf(seq, "%02X %04X:%02X:%02X %04X:%02X:%02X %08X:%08X " + "%02X %d\n", + s->type, ntohs(at->src_net), at->src_node, at->src_port, + ntohs(at->dest_net), at->dest_node, at->dest_port, + atomic_read(&s->wmem_alloc), atomic_read(&s->rmem_alloc), + s->state, SOCK_INODE(s->socket)->i_uid); +out: + return 0; +} + +struct seq_operations atalk_seq_interface_ops = { + .start = atalk_seq_interface_start, + .next = atalk_seq_interface_next, + .stop = atalk_seq_interface_stop, + .show = atalk_seq_interface_show, +}; + +struct seq_operations atalk_seq_route_ops = { + .start = atalk_seq_route_start, + .next = atalk_seq_route_next, + .stop = atalk_seq_route_stop, + .show = atalk_seq_route_show, +}; + +struct seq_operations atalk_seq_socket_ops = { + .start = atalk_seq_socket_start, + .next = atalk_seq_socket_next, + .stop = atalk_seq_socket_stop, + .show = atalk_seq_socket_show, +}; + +static int atalk_seq_interface_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &atalk_seq_interface_ops); +} + +static int atalk_seq_route_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &atalk_seq_route_ops); +} + +static int atalk_seq_socket_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &atalk_seq_socket_ops); +} + +static struct file_operations atalk_seq_interface_fops = { + .open = atalk_seq_interface_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +static struct file_operations atalk_seq_route_fops = { + .open = atalk_seq_route_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +static struct file_operations atalk_seq_socket_fops = { + .open = atalk_seq_socket_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +static struct proc_dir_entry *atalk_proc_dir; + +int __init atalk_proc_init(void) +{ + struct proc_dir_entry *p; + int rc = -ENOMEM; + + atalk_proc_dir = proc_mkdir("atalk", proc_net); + if (!atalk_proc_dir) + goto out; + + p = create_proc_entry("interface", S_IRUGO, atalk_proc_dir); + if (!p) + goto out_interface; + p->proc_fops = &atalk_seq_interface_fops; + + p = create_proc_entry("route", S_IRUGO, atalk_proc_dir); + if (!p) + goto out_route; + p->proc_fops = &atalk_seq_route_fops; + + p = create_proc_entry("socket", S_IRUGO, atalk_proc_dir); + if (!p) + goto out_socket; + p->proc_fops = &atalk_seq_socket_fops; + + rc = 0; +out: + return rc; +out_socket: + remove_proc_entry("route", atalk_proc_dir); +out_route: + remove_proc_entry("interface", atalk_proc_dir); +out_interface: + remove_proc_entry("atalk", proc_net); + goto out; +} + +void __exit atalk_proc_exit(void) +{ + remove_proc_entry("interface", atalk_proc_dir); + remove_proc_entry("route", atalk_proc_dir); + remove_proc_entry("socket", atalk_proc_dir); + remove_proc_entry("atalk", proc_net); +} + +#else /* CONFIG_PROC_FS */ +int __init atalk_proc_init(void) +{ + return 0; +} + +void __exit atalk_proc_exit(void) +{ +} +#endif /* CONFIG_PROC_FS */ diff -Nru a/net/appletalk/ddp.c b/net/appletalk/ddp.c --- a/net/appletalk/ddp.c Mon Oct 7 03:28:22 2002 +++ b/net/appletalk/ddp.c Mon Oct 7 03:28:22 2002 @@ -40,6 +40,8 @@ * result. * Arnaldo C. de Melo : Cleanup, in preparation for * shared skb support 8) + * Arnaldo C. de Melo : Move proc stuff to atalk_proc.c, + * use seq_file * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -50,41 +52,14 @@ #include <linux/config.h> #include <linux/module.h> -#include <asm/uaccess.h> -#include <asm/system.h> -#include <asm/bitops.h> -#include <linux/types.h> -#include <linux/kernel.h> -#include <linux/sched.h> -#include <linux/string.h> -#include <linux/mm.h> -#include <linux/socket.h> -#include <linux/sockios.h> -#include <linux/in.h> #include <linux/tcp.h> -#include <linux/errno.h> -#include <linux/interrupt.h> -#include <linux/if_ether.h> -#include <linux/notifier.h> -#include <linux/netdevice.h> -#include <linux/inetdevice.h> -#include <linux/route.h> -#include <linux/inet.h> -#include <linux/etherdevice.h> #include <linux/if_arp.h> -#include <linux/skbuff.h> -#include <linux/spinlock.h> #include <linux/termios.h> /* For TIOCOUTQ/INQ */ #include <net/datalink.h> -#include <net/p8022.h> #include <net/psnap.h> #include <net/sock.h> -#include <linux/ip.h> #include <net/route.h> #include <linux/atalk.h> -#include <linux/proc_fs.h> -#include <linux/stat.h> -#include <linux/init.h> #ifdef CONFIG_PROC_FS extern void aarp_register_proc_fs(void); @@ -112,8 +87,8 @@ * * \**************************************************************************/ -static struct sock *atalk_sockets; -static spinlock_t atalk_sockets_lock = SPIN_LOCK_UNLOCKED; +struct sock *atalk_sockets; +spinlock_t atalk_sockets_lock = SPIN_LOCK_UNLOCKED; extern inline void atalk_insert_socket(struct sock *sk) { @@ -244,53 +219,6 @@ } } -/* Called from proc fs */ -static int atalk_get_info(char *buffer, char **start, off_t offset, int length) -{ - off_t pos = 0; - off_t begin = 0; - int len = sprintf(buffer, "Type local_addr remote_addr tx_queue " - "rx_queue st uid\n"); - struct sock *s; - /* Output the AppleTalk data for the /proc filesystem */ - - spin_lock_bh(&atalk_sockets_lock); - for (s = atalk_sockets; s; s = s->next) { - struct atalk_sock *at = at_sk(s); - - len += sprintf(buffer + len, "%02X ", s->type); - len += sprintf(buffer + len, "%04X:%02X:%02X ", - ntohs(at->src_net), at->src_node, at->src_port); - len += sprintf(buffer + len, "%04X:%02X:%02X ", - ntohs(at->dest_net), at->dest_node, - at->dest_port); - len += sprintf(buffer + len, "%08X:%08X ", - atomic_read(&s->wmem_alloc), - atomic_read(&s->rmem_alloc)); - len += sprintf(buffer + len, "%02X %d\n", s->state, - SOCK_INODE(s->socket)->i_uid); - - /* Are we still dumping unwanted data then discard the record */ - pos = begin + len; - - if (pos < offset) { - len = 0; /* Keep dumping into the buffer start */ - begin = pos; - } - if (pos > offset + length) /* We have dumped enough */ - break; - } - spin_unlock_bh(&atalk_sockets_lock); - - /* The data in question runs from begin to begin + len */ - *start = buffer + offset - begin; /* Start of wanted data */ - len -= offset - begin; /* Remove unwanted header data from length */ - if (len > length) - len = length; /* Remove unwanted tail data from length */ - - return len; -} - /**************************************************************************\ * * * Routing tables for the AppleTalk socket layer. * @@ -298,14 +226,14 @@ \**************************************************************************/ /* Anti-deadlock ordering is router_lock --> iface_lock -DaveM */ -static struct atalk_route *atalk_router_list; -static rwlock_t atalk_router_lock = RW_LOCK_UNLOCKED; +struct atalk_route *atalk_routes; +rwlock_t atalk_routes_lock = RW_LOCK_UNLOCKED; -static struct atalk_iface *atalk_iface_list; -static spinlock_t atalk_iface_lock = SPIN_LOCK_UNLOCKED; +struct atalk_iface *atalk_interfaces; +spinlock_t atalk_interfaces_lock = SPIN_LOCK_UNLOCKED; /* For probing devices or in a routerless network */ -static struct atalk_route atrtr_default; +struct atalk_route atrtr_default; /* AppleTalk interface control */ /* @@ -314,10 +242,10 @@ */ static void atif_drop_device(struct net_device *dev) { - struct atalk_iface **iface = &atalk_iface_list; + struct atalk_iface **iface = &atalk_interfaces; struct atalk_iface *tmp; - spin_lock_bh(&atalk_iface_lock); + spin_lock_bh(&atalk_interfaces_lock); while ((tmp = *iface) != NULL) { if (tmp->dev == dev) { *iface = tmp->next; @@ -327,7 +255,7 @@ } else iface = &tmp->next; } - spin_unlock_bh(&atalk_iface_lock); + spin_unlock_bh(&atalk_interfaces_lock); } static struct atalk_iface *atif_add_device(struct net_device *dev, @@ -346,10 +274,10 @@ iface->address = *sa; iface->status = 0; - spin_lock_bh(&atalk_iface_lock); - iface->next = atalk_iface_list; - atalk_iface_list = iface; - spin_unlock_bh(&atalk_iface_lock); + spin_lock_bh(&atalk_interfaces_lock); + iface->next = atalk_interfaces; + atalk_interfaces = iface; + spin_unlock_bh(&atalk_interfaces_lock); out: return iface; out_mem: @@ -466,8 +394,8 @@ * Return a point-to-point interface only if * there is no non-ptp interface available. */ - spin_lock_bh(&atalk_iface_lock); - for (iface = atalk_iface_list; iface; iface = iface->next) { + spin_lock_bh(&atalk_interfaces_lock); + for (iface = atalk_interfaces; iface; iface = iface->next) { if (!fiface && !(iface->dev->flags & IFF_LOOPBACK)) fiface = iface; if (!(iface->dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT))) { @@ -478,12 +406,12 @@ if (fiface) retval = &fiface->address; - else if (atalk_iface_list) - retval = &atalk_iface_list->address; + else if (atalk_interfaces) + retval = &atalk_interfaces->address; else retval = NULL; out: - spin_unlock_bh(&atalk_iface_lock); + spin_unlock_bh(&atalk_interfaces_lock); return retval; } @@ -514,8 +442,8 @@ { struct atalk_iface *iface; - spin_lock_bh(&atalk_iface_lock); - for (iface = atalk_iface_list; iface; iface = iface->next) { + spin_lock_bh(&atalk_interfaces_lock); + for (iface = atalk_interfaces; iface; iface = iface->next) { if ((node == ATADDR_BCAST || node == ATADDR_ANYNODE || iface->address.s_node == node) && @@ -529,7 +457,7 @@ ntohs(net) <= ntohs(iface->nets.nr_lastnet)) break; } - spin_unlock_bh(&atalk_iface_lock); + spin_unlock_bh(&atalk_interfaces_lock); return iface; } @@ -549,8 +477,8 @@ struct atalk_route *net_route = NULL; struct atalk_route *r; - read_lock_bh(&atalk_router_lock); - for (r = atalk_router_list; r; r = r->next) { + read_lock_bh(&atalk_routes_lock); + for (r = atalk_routes; r; r = r->next) { if (!(r->flags & RTF_UP)) continue; @@ -582,7 +510,7 @@ else /* No route can be found */ r = NULL; out: - read_unlock_bh(&atalk_router_lock); + read_unlock_bh(&atalk_routes_lock); return r; } @@ -630,8 +558,8 @@ goto out; /* Now walk the routing table and make our decisions */ - write_lock_bh(&atalk_router_lock); - for (rt = atalk_router_list; rt; rt = rt->next) { + write_lock_bh(&atalk_routes_lock); + for (rt = atalk_routes; rt; rt = rt->next) { if (r->rt_flags != rt->flags) continue; @@ -646,8 +574,8 @@ if (!devhint) { riface = NULL; - spin_lock_bh(&atalk_iface_lock); - for (iface = atalk_iface_list; iface; iface = iface->next) { + spin_lock_bh(&atalk_interfaces_lock); + for (iface = atalk_interfaces; iface; iface = iface->next) { if (!riface && ntohs(ga->sat_addr.s_net) >= ntohs(iface->nets.nr_firstnet) && @@ -659,7 +587,7 @@ ga->sat_addr.s_node == iface->address.s_node) riface = iface; } - spin_unlock_bh(&atalk_iface_lock); + spin_unlock_bh(&atalk_interfaces_lock); retval = -ENETUNREACH; if (!riface) @@ -675,8 +603,8 @@ if (!rt) goto out; - rt->next = atalk_router_list; - atalk_router_list = rt; + rt->next = atalk_routes; + atalk_routes = rt; } /* Fill in the routing entry */ @@ -687,7 +615,7 @@ retval = 0; out_unlock: - write_unlock_bh(&atalk_router_lock); + write_unlock_bh(&atalk_routes_lock); out: return retval; } @@ -695,11 +623,11 @@ /* Delete a route. Find it and discard it */ static int atrtr_delete(struct atalk_addr * addr) { - struct atalk_route **r = &atalk_router_list; + struct atalk_route **r = &atalk_routes; int retval = 0; struct atalk_route *tmp; - write_lock_bh(&atalk_router_lock); + write_lock_bh(&atalk_routes_lock); while ((tmp = *r) != NULL) { if (tmp->target.s_net == addr->s_net && (!(tmp->flags&RTF_GATEWAY) || @@ -712,7 +640,7 @@ } retval = -ENOENT; out: - write_unlock_bh(&atalk_router_lock); + write_unlock_bh(&atalk_routes_lock); return retval; } @@ -722,10 +650,10 @@ */ void atrtr_device_down(struct net_device *dev) { - struct atalk_route **r = &atalk_router_list; + struct atalk_route **r = &atalk_routes; struct atalk_route *tmp; - write_lock_bh(&atalk_router_lock); + write_lock_bh(&atalk_routes_lock); while ((tmp = *r) != NULL) { if (tmp->dev == dev) { *r = tmp->next; @@ -733,7 +661,7 @@ } else r = &tmp->next; } - write_unlock_bh(&atalk_router_lock); + write_unlock_bh(&atalk_routes_lock); if (atrtr_default.dev == dev) atrtr_set_default(NULL); @@ -1013,81 +941,6 @@ return -EINVAL; } -/* Called from proc fs - just make it print the ifaces neatly */ -static int atalk_if_get_info(char *buffer, char **start, off_t offset, - int length) -{ - off_t pos = 0; - off_t begin = 0; - struct atalk_iface *iface; - int len = sprintf(buffer, "Interface Address " - "Networks Status\n"); - - spin_lock_bh(&atalk_iface_lock); - for (iface = atalk_iface_list; iface; iface = iface->next) { - len += sprintf(buffer + len, "%-16s %04X:%02X %04X-%04X %d\n", - iface->dev->name, ntohs(iface->address.s_net), - iface->address.s_node, - ntohs(iface->nets.nr_firstnet), - ntohs(iface->nets.nr_lastnet), iface->status); - pos = begin + len; - if (pos < offset) { - len = 0; - begin = pos; - } - if (pos > offset + length) - break; - } - spin_unlock_bh(&atalk_iface_lock); - - *start = buffer + (offset - begin); - len -= (offset - begin); - if (len > length) - len = length; - return len; -} - -/* Called from proc fs - just make it print the routes neatly */ -static int atalk_rt_get_info(char *buffer, char **start, off_t offset, - int length) -{ - off_t pos = 0; - off_t begin = 0; - int len = sprintf(buffer, "Target Router Flags Dev\n"); - struct atalk_route *rt; - - if (atrtr_default.dev) { - rt = &atrtr_default; - len += sprintf(buffer + len, - "Default %04X:%02X %-4d %s\n", - ntohs(rt->gateway.s_net), rt->gateway.s_node, - rt->flags, rt->dev->name); - } - - read_lock_bh(&atalk_router_lock); - for (rt = atalk_router_list; rt; rt = rt->next) { - len += sprintf(buffer + len, - "%04X:%02X %04X:%02X %-4d %s\n", - ntohs(rt->target.s_net), rt->target.s_node, - ntohs(rt->gateway.s_net), rt->gateway.s_node, - rt->flags, rt->dev->name); - pos = begin + len; - if (pos < offset) { - len = 0; - begin = pos; - } - if (pos > offset + length) - break; - } - read_unlock_bh(&atalk_router_lock); - - *start = buffer + (offset - begin); - len -= (offset - begin); - if (len > length) - len = length; - return len; -} - /**************************************************************************\ * * * Handling for system calls applied via the various interfaces to an * @@ -1991,17 +1844,14 @@ register_netdevice_notifier(&ddp_notifier); aarp_proto_init(); - - proc_net_create("appletalk", 0, atalk_get_info); - proc_net_create("atalk_route", 0, atalk_rt_get_info); - proc_net_create("atalk_iface", 0, atalk_if_get_info); + atalk_proc_init(); #ifdef CONFIG_PROC_FS aarp_register_proc_fs(); #endif /* CONFIG_PROC_FS */ #ifdef CONFIG_SYSCTL atalk_register_sysctl(); #endif /* CONFIG_SYSCTL */ - printk(KERN_INFO "NET4: AppleTalk 0.18a for Linux NET4.0\n"); + printk(KERN_INFO "NET4: AppleTalk 0.20 for Linux NET4.0\n"); return 0; } module_init(atalk_init); @@ -2024,9 +1874,7 @@ #ifdef CONFIG_SYSCTL atalk_unregister_sysctl(); #endif /* CONFIG_SYSCTL */ - proc_net_remove("appletalk"); - proc_net_remove("atalk_route"); - proc_net_remove("atalk_iface"); + atalk_proc_exit(); #ifdef CONFIG_PROC_FS aarp_unregister_proc_fs(); #endif /* CONFIG_PROC_FS */ @@ -2039,3 +1887,7 @@ } module_exit(atalk_exit); #endif /* MODULE */ + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Alan Cox <Alan.Cox@linux.org>"); +MODULE_DESCRIPTION("AppleTalk 0.20 for Linux NET4.0\n"); diff -Nru a/net/appletalk/sysctl_net_atalk.c b/net/appletalk/sysctl_net_atalk.c --- a/net/appletalk/sysctl_net_atalk.c Mon Oct 7 03:28:22 2002 +++ b/net/appletalk/sysctl_net_atalk.c Mon Oct 7 03:28:22 2002 @@ -7,7 +7,6 @@ */ #include <linux/config.h> -#include <linux/mm.h> #include <linux/sysctl.h> extern int sysctl_aarp_expiry_time; @@ -16,7 +15,7 @@ extern int sysctl_aarp_resolve_time; #ifdef CONFIG_SYSCTL -static ctl_table atalk_table[] = { +static struct ctl_table atalk_table[] = { { .ctl_name = NET_ATALK_AARP_EXPIRY_TIME, .procname = "aarp-expiry-time", @@ -52,7 +51,7 @@ { 0 }, }; -static ctl_table atalk_dir_table[] = { +static struct ctl_table atalk_dir_table[] = { { .ctl_name = NET_ATALK, .procname = "appletalk", @@ -62,7 +61,7 @@ { 0 }, }; -static ctl_table atalk_root_table[] = { +static struct ctl_table atalk_root_table[] = { { .ctl_name = CTL_NET, .procname = "net", ===================================================================
This BitKeeper patch contains the following changesets: 1.632 ## Wrapped with gzip_uu ##
begin 664 bkpatch18241 M'XL(`(8IH3T``^U;;7.;2!+^+'[%G%.;DKV6Q#N2O/$EL9RL*HZ=\LM=JBY7 M%(*111D)+2"_U"G__;IG`($$"-G)W9=XLQY@IGN>Z>YYIF'&K\A-2(-^P[*G M5'A%_O3#J-^P_1FU(_?>:MO^M#T*H.+2]Z&B,_&GM(-M.^\_=3S/;LEM38#J M+U9D3\@]#<)^0VHKZ9/H:4[[C<O3CS=G[RX%X<T;<C*Q9K?TBD;DS1LA\H-[ MRW/"MU8T\?Q9.PJL63BE$>MXF39=RJ(HPW^:9"BBIB\E752-I2TYDF2I$G5$ M6>WJJH"XWJYC7],BB:(N*J*JB4O5Z"H]84"DMJ[(1)0[DM@1#2(J?=GH:T8+ M+D21%"HEO^ND)0KOR8\=P(E@$Y^\F\\]T.#=]<DBI"2D?YECUZ-D[`=D'O@V M":/%>`Q-X=^[F4,L+_3)U+^GY//%X.;LU#P;GIR>7YV2<>!/B64%\[8-0(GC MP,4AL4+B1B&))C2@H"&:6!'>@`9GX5'3G;E1ASZZ$7'#=MP)=F`Y#G62'M[= M7/]Y<4FL6?ID<'IU<CG\<CV\.&\+GX@N&K(H?%EY6VCM^",(HB4*Q\7V7\YH MU+$2.W4L_&VB;=IVXF5#U"51T99BMZ<J2\/NCL9=IT>-+M7TD?1"M?I2TWL] MA%<=`'E]X5-H1YX)#TVF.M8:QT5/,Y:*I"K2<BQI/6NDV88DC:@DJ[7`EBCG MD&5#4Y:*HJK='2&SF-E`"=-'6MJ&.N[2'AV/%45QE'HF7>G+`%.[74G9$1@/ MZW5D<D\#E]OR2.GU=,NP-7NDR=UZSEXIS$"3%$TU=H3VV;JC.&$WP'4-25XZ MBC(:R=+(EJ`+4:.UP.549N#)DB)N=ZD[L[V%0SN>.UL\\JAN3W+H5'$IJP80 MD^UH8Z,WHHIH29;8*P%7KC`7;HHN,\HOGU6X!IS3!X)CZU>T$_Y!5*&$WU]* M!6P%$'/\+XE]1:OF?_%G\+]-WKO1)TKG-&`F(87K;:?"3I\(CA&(MZ+-)=DP MP5<B/G9EZ1DD_3.=(NWJ%$7J_9QE^0.1P+2<\R](*WA@_V#\E8;>W9I#D<`8 MA,Z!0`Y((S=36O':OYC/_2!BR4":*$!K)G#BSY\"]W82->U]\BZ8@0E\<F*A M+2:P_D."0#V?_%%HO6.NI'$]<4/LZC:PII`"0!)!(0?QQ]&#%=`C\N0OB&W- M2$`=-XP"=[2(*.03F`IT`!(D$>[X"1Z@JL7,@4#&W"*BP30D_IC=?#R_(1_I MC`:61[XL1IYKDS/7IC/(=2`WF>.3<`*YQN@)FZ.B#XCA*L9`/OB@V(I<?W;( M,DZX('(;VG6$;\*KF)O('YR<8)AC][8].=ZHP42GZ#F:V1R'155)*I:OPP@( M??NN2"+FQF.&;.S0,3FY./\P_&A^N;PX,3]<"6$$([&)"7D72%#3A.PN6-A@ M4.9\=VS9E!SPFUM8V]T9V!(?FJ[SV/3\\=B,R-P/]X7_"(TB4?<(^FY@N#1= M\B:I2[2$1RA,7K\F[A'!>K=U/*./T;[0:+1:4,6D`QHM@ADT$;[#;0SYWG>= M!!D:9H4,&@11,P:3IJ\'<'5(8L0'">3XWH.N#Y+NPKD[,SVPJ#F:-%^O(V8U M^T<I*H_\G939I]7R]DF?-#G6?:GF`-`")?BYT/WF0,IM__OO?&0-=PQ(8,E; MX=DG(-E`NY_?G)T=X36T61\Q.J-1Z#RHN/4AM?<7$5Q_%UBK^R->QJX\$J"V M7^7$8A_Z\VH3\%&CJQ:SK<[*=`F5Q3U._(<Z/1;9&0MFZS(3H\+Y(@J;3-_> M,.FU0<@[QPEH&!)"SFGTX`=W>+F')B?L9^\*<"_";[.]_0U[LQX1`K<ZZR6` M(8WC?GYK27I(?A/5K_W?1/DK89<M_`67#J@\%%@W3$GKV*'WX#-K2@_)+/(G M83-^;G&([1#3^_V\3*;.=]8%H7G8G@5@RR",,K*%C3PK;I.H#MG`]]<"2,QY MLXRX`A\7A@QQL0=;22L6"U:D%:1QS^I6A!4<$:P+*@@KJ)SO'-%+R2J@EK-. M5AQI-5&M[+$327&Q%Q-4SLY;"2HH)"@^2D9.&T[:(*8@GB(9EZW%58&S-GU5 MBY282S9(*>^44D**>WH&&24VC79AHFLK@&@@\<\EJ@@(^>!9MR$9T/MRUD$O M!%%@0DYA+;RH#=P1.RL"$[_.51XE_6:Y:<#K6+]9AFJI#OP.8W**23!FC"!J M'=]:$7VPGA(R(FO/D(0R<E@[QM'PABG#[2<C87"+R7,%JA)B#EW$[)D#MWH4 M8WO&<*I'LA,_8JJ8)4:\Q\2EE!FY0+BBQ#"=;5QVQ8EPA95A!2>&E?02@_D9 M&5R,M9H5,\;8B19CN1?P(K?RBS*V>(1KZ5KBHQ^=JZ6N>D&BMN:34E),^MJ) M%=.XS=-D$O_;63)+!M=/<TK.?-OR3,QX@"KIU`>B9C?7C^9?"[J@/&UK[%TF M]U<1N1D.RD@TC!U@1<Q99GC7Q&SG6R$7,1I*22B3SN7ONWC9_<J1<+%LH@<S M$[=$DC3-`B()`SNFGO2.)7+)';[NYUC+8NP31ADI?IN*L=N,G!7Y4]<V<5UL MO@8(#U,Z-2T/O,[D\Y5!IC(%C5$!RJ\N3CZ9P_.+P6D3'[*HV&\=N^;"=4IY M,`T7?P[O_/C>'A:^`/AS=`AXO\WHAZQFT.;;)2!KXX0A9:VP\I"I\N>EC;"2 M-8*X+F\$E8?"]Z,:8^&Y0^4X,DEGR1A6&5X)_E4N5()]E<+4Q!U/[TK@V96A M!'F&A$N@9SBK!'N&:5+PE:^-,*!9PDDN3@$@<3X3XH><I/!WG!SR99#;8M;$ MBD/RNB0@MV>*/[S_-(AJ$/(/[WP5"?G>,^JV3>/Q*HRPCT:C>%IA'<8`\@ZV M84.':WSF>2&E=\E3=L.;>M0*:=J8W>6C9"M.;MU*C"N__A_PQ0ZH!)AQ_D]# MR+Z".FY@TED4/"6I5O(4VV-`FFR[F&0J\9ZMY=E,8%W9'+,>$`]L&&/K]/SB M\^EGMN[F>X%*=CF]@YOF'JO<.^3/<.V+$[2_Y:7V<RL]*)V#'AL,`TYE;1B( MYEX:BJ#RRAQ>WGR\."1KJI(>YEFEJR"&ZGGKF'\PY@XKY!&LJT+"`FYG%$RJ M$L$JUJMZY]&T<_=<K++_3"SS-Q!TM[C^VF^S!W%C]AS/,A0::`-8:H=BN:R+ M"V73!L7R11&W"BVD1Y:UFB8[+Y'I`>]7LV!79#N9H*AQZM):K0M&B4-[18$V M2.=@;<<"MUGJ3/U\%EC'3M^ARYD#H5;8)VXD%^X[;S]']/S][Y+=S0J%75$5 M%5%4]:6N26J7[6.J&X>+E.I]3$G]=;JHZG01/UJPMA%;Z)3G[,&"-8FD"I#% M4LR5-K_:I&_T21-XMV8OUME7W.2U&IDOKZK@`WGRU31N&#SDU&6^7)9IR^T3 M9C>(RB"N;=%4HUS[F)@V7>6D:P20]IOY9K$VX5'-YN&0Y*#+]DG]DC,WPIWE MOHWF4CM83(+68N:V1KX]64S;#JW4J\FJ#+&G:GBK*\^<W*0E_9K;I7.;'VFJ M/&21..49DWO0(Y(PQ%^INM93H]'HO^'#Y6/U,R';]HO.,''3[!BDNYQ9JW>N M)J.P*QJB(LE:;ZFKLL3/M?9VC4V1M&3Y5W"6!B<_#EA]`H@!>TYH*@J1(&'0 M9"(+`QW6((C67A>*S?AC8]XU_'8XRUDK^C+Z,L$G=WLZ/[VU,S.J7:!&D/X5 M?V7QQT_*5L8?@_.<M$?%N",'C49Z<*R='!EK]!N?T1`K,^'`L\?3#IDD_F1M M"\$,,0UQK&L$&,G0,+(-9-]!5V:_-0*KJ"1AQ5"2="BJ\JW*1`O>+:^^#,_- M,_Q&?7..Q>G@2!A`8D]@T@X44<)>%%%>]5*1BI7G8-#1Y3\WNH&)Q-5KZ^I+ M<[-M25G9B&"!Q%6,%]O3M8$B&:P]*PH/T!PDIU@V#O"@N"PR<5;4/)P%9,:% ME)50C6-"`T7M$17$@`35V@?!TG,LCU'Q(:GU1[CA%G^_J8U,U7OH7]40H:B+ MC!^[BVV[>?2.@R!)@\PX<!=LH'99Q*I=C-@&>QTO.QX&;]M`F$4.3$\(X1BZ M.CJ%%_6'#O2*.#2I^S\;NJ8@/PQYL0-2MG@.-:`=N=;1G)(C1FMGBQ@BX"I$ MQ(I:1TP&NH(PAKJ"S-!X"-R(UH(3;>*)\']$%&4@Z2H+25UC(5G7,2_TC*XS MS_"B4=\UNM%E8(T>`YL,I.#@4/:>#1FE>XQ.>!&;<JOY6?(TY$7A49V#8#5C MDOX'AL@&R(LZ7AL8$@L-7M0$9\A<AA4[@).[7*Q;&YS"YCPO:H*31%B*#0TN M>CT5^1A*MG:LO^QC8\C!5.PA+AMLW_RN^>GT\MP<GG^X('OGI]=JG^=?UR!/ MQ#8L)1B%9_BIAF!U6^2;]*!--B`G`&UR;ZU']NT`VD"=*@&J;T(^,6ON??QR MADIRV51S[YUGS<B)_TC^P*LV7+UEWXC:?G![G&F?R;5`J`[:S<1\\Z^P=LW2 MG_M'8K52]C+EAF2`]T1-72J*K&@L?U=V3=\5TE)_Y>X5'RWQS^\J<_=-]SSG M/5)BKXX2^]+!?N=W]K"'R!IY-*8;=OVO?[/=1EA`V2*G;97"W;R<I,XD]>V2 @@>]'.='TCX7M";7OPL7TC3$:XV=T3?@O_'+2#)X\```` ` end - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |