netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH] af_netlink - convert to seq_file
  2003-09-02 18:58 [PATCH] af_netlink - convert to seq_file Stephen Hemminger
@ 2003-09-02 18:57 ` David S. Miller
  0 siblings, 0 replies; 2+ messages in thread
From: David S. Miller @ 2003-09-02 18:57 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

On Tue, 2 Sep 2003 11:58:00 -0700
Stephen Hemminger <shemminger@osdl.org> wrote:

> Convert af_netlink to use seq_file interface.
> Tested on 2.6.0-test4 bk latest.

Applied, thanks Stephen.

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [PATCH] af_netlink - convert to seq_file
@ 2003-09-02 18:58 Stephen Hemminger
  2003-09-02 18:57 ` David S. Miller
  0 siblings, 1 reply; 2+ messages in thread
From: Stephen Hemminger @ 2003-09-02 18:58 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev

Convert af_netlink to use seq_file interface.
Tested on 2.6.0-test4 bk latest.

diff -Nru a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
--- a/net/netlink/af_netlink.c	Tue Sep  2 11:56:11 2003
+++ b/net/netlink/af_netlink.c	Tue Sep  2 11:56:11 2003
@@ -40,6 +40,7 @@
 #include <linux/netdevice.h>
 #include <linux/rtnetlink.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 #include <linux/smp_lock.h>
 #include <linux/notifier.h>
 #include <linux/security.h>
@@ -964,62 +965,108 @@
 
 #endif
 
-
 #ifdef CONFIG_PROC_FS
-static int netlink_read_proc(char *buffer, char **start, off_t offset,
-			     int length, int *eof, void *data)
+static struct sock *netlink_seq_socket_idx(struct seq_file *seq, loff_t pos)
 {
-	off_t pos=0;
-	off_t begin=0;
-	int len=0;
 	int i;
 	struct sock *s;
 	struct hlist_node *node;
-	
-	len+= sprintf(buffer,"sk       Eth Pid    Groups   "
-		      "Rmem     Wmem     Dump     Locks\n");
-	
+	loff_t off = 0;
+
 	for (i=0; i<MAX_LINKS; i++) {
-		read_lock(&nl_table_lock);
 		sk_for_each(s, node, &nl_table[i]) {
-			struct netlink_opt *nlk = nlk_sk(s);
+			if (off == pos) {
+				seq->private = (void *) i;
+				return s;
+			}
+			++off;
+		}
+	}
+	return NULL;
+}
 
-			len+=sprintf(buffer+len,"%p %-3d %-6d %08x %-8d %-8d %p %d",
-				     s,
-				     s->sk_protocol,
-				     nlk->pid,
-				     nlk->groups,
-				     atomic_read(&s->sk_rmem_alloc),
-				     atomic_read(&s->sk_wmem_alloc),
-				     nlk->cb,
-				     atomic_read(&s->sk_refcnt)
-				     );
+static void *netlink_seq_start(struct seq_file *seq, loff_t *pos)
+{
+	read_lock(&nl_table_lock);
+	return *pos ? netlink_seq_socket_idx(seq, *pos - 1) : (void *) 1;
+}
+
+static void *netlink_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+{
+	struct sock *s;
+
+	++*pos;
 
-			buffer[len++]='\n';
+	if (v == (void *) 1) 
+		return netlink_seq_socket_idx(seq, 0);
 		
-			pos=begin+len;
-			if(pos<offset) {
-				len=0;
-				begin=pos;
-			}
-			if(pos>offset+length) {
-				read_unlock(&nl_table_lock);
-				goto done;
+	s = sk_next(v);
+	if (!s) {
+		int i = (int) seq->private; 
+
+		while (++i < MAX_LINKS) {
+			s = sk_head(&nl_table[i]);
+			if (s) {
+				seq->private = (void *) i;
+				break;
 			}
 		}
-		read_unlock(&nl_table_lock);
 	}
-	*eof = 1;
+	return s;
+}
 
-done:
-	*start=buffer+(offset-begin);
-	len-=(offset-begin);
-	if(len>length)
-		len=length;
-	if(len<0)
-		len=0;
-	return len;
+static void netlink_seq_stop(struct seq_file *seq, void *v)
+{
+	read_unlock(&nl_table_lock);
+}
+
+
+static int netlink_seq_show(struct seq_file *seq, void *v)
+{
+	if (v == (void *)1) 
+		seq_puts(seq,
+			 "sk       Eth Pid    Groups   "
+			 "Rmem     Wmem     Dump     Locks\n");
+	else {
+		struct sock *s = v;
+		struct netlink_opt *nlk = nlk_sk(s);
+
+		seq_printf(seq, "%p %-3d %-6d %08x %-8d %-8d %p %d\n",
+			   s,
+			   s->sk_protocol,
+			   nlk->pid,
+			   nlk->groups,
+			   atomic_read(&s->sk_rmem_alloc),
+			   atomic_read(&s->sk_wmem_alloc),
+			   nlk->cb,
+			   atomic_read(&s->sk_refcnt)
+			);
+
+	}
+	return 0;
 }
+
+struct seq_operations netlink_seq_ops = {
+	.start  = netlink_seq_start,
+	.next   = netlink_seq_next,
+	.stop   = netlink_seq_stop,
+	.show   = netlink_seq_show,
+};
+
+
+static int netlink_seq_open(struct inode *inode, struct file *file)
+{
+	return seq_open(file, &netlink_seq_ops);
+}
+
+static struct file_operations netlink_seq_fops = {
+	.owner		= THIS_MODULE,
+	.open		= netlink_seq_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= seq_release,
+};
+
 #endif
 
 int netlink_register_notifier(struct notifier_block *nb)
@@ -1069,7 +1116,7 @@
 	}
 	sock_register(&netlink_family_ops);
 #ifdef CONFIG_PROC_FS
-	create_proc_read_entry("net/netlink", 0, 0, netlink_read_proc, NULL);
+	proc_net_fops_create("netlink", 0, &netlink_seq_fops);
 #endif
 	/* The netlink device handler may be needed early. */ 
 	rtnetlink_init();
@@ -1079,7 +1126,7 @@
 static void __exit netlink_proto_exit(void)
 {
        sock_unregister(PF_NETLINK);
-       remove_proc_entry("net/netlink", NULL);
+       proc_net_remove("netlink");
 }
 
 core_initcall(netlink_proto_init);

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2003-09-02 18:58 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-09-02 18:58 [PATCH] af_netlink - convert to seq_file Stephen Hemminger
2003-09-02 18:57 ` David S. Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).