[netfilter-cvslog] r3247 -
trunk/patch-o-matic-ng/CLUSTERIP/linux-2.6/net/ipv4/netfilter
/C=DE/ST=Berlin/L=Berlin/O=Netfilter
/C=DE/ST=Berlin/L=Berlin/O=Netfilter
Thu Oct 21 16:18:42 CEST 2004
Author: /C=DE/ST=Berlin/L=Berlin/O=Netfilter Project/OU=Development/CN=laforge/emailAddress=laforge at netfilter.org
Date: 2004-10-21 16:18:41 +0200 (Thu, 21 Oct 2004)
New Revision: 3247
Modified:
trunk/patch-o-matic-ng/CLUSTERIP/linux-2.6/net/ipv4/netfilter/ipt_CLUSTERIP.c
Log:
untested port to seq_file API
Modified: trunk/patch-o-matic-ng/CLUSTERIP/linux-2.6/net/ipv4/netfilter/ipt_CLUSTERIP.c
===================================================================
--- trunk/patch-o-matic-ng/CLUSTERIP/linux-2.6/net/ipv4/netfilter/ipt_CLUSTERIP.c 2004-10-20 22:49:19 UTC (rev 3246)
+++ trunk/patch-o-matic-ng/CLUSTERIP/linux-2.6/net/ipv4/netfilter/ipt_CLUSTERIP.c 2004-10-21 14:18:41 UTC (rev 3247)
@@ -10,6 +10,7 @@
*
*/
#include <linux/module.h>
+#include <linux/config.h>
#include <linux/proc_fs.h>
#include <linux/jhash.h>
#include <linux/skbuff.h>
@@ -18,6 +19,8 @@
#include <linux/udp.h>
#include <linux/icmp.h>
#include <linux/if_arp.h>
+#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
#include <net/checksum.h>
@@ -27,7 +30,7 @@
#include <linux/netfilter_ipv4/ipt_CLUSTERIP.h>
#include <linux/netfilter_ipv4/ip_conntrack.h>
-#define CLUSTERIP_VERSION "0.5"
+#define CLUSTERIP_VERSION "0.6"
#define DEBUG_CLUSTERIP
@@ -68,13 +71,6 @@
#ifdef CONFIG_PROC_FS
static struct file_operations clusterip_proc_fops;
static struct proc_dir_entry *clusterip_procdir;
-static int clusterip_proc_open(struct inode *inode, struct file *file);
-static int clusterip_proc_release(struct inode *inode, struct file *file);
-static int clusterip_proc_read(char *buffer, char **start, off_t offset,
- int length, int *eof, void *data);
-static int clusterip_proc_write(struct file *file, const char *input,
- unsigned long size, void *data);
-
#endif
static inline void
@@ -154,16 +150,13 @@
#ifdef CONFIG_PROC_FS
/* create proc dir entry */
sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(ip));
- c->pde = create_proc_entry(buffer, 0, clusterip_procdir);
+ c->pde = create_proc_entry(buffer, S_IWUSR|S_IRUSR, clusterip_procdir);
if (!c->pde) {
kfree(c);
return NULL;
}
- c->pde->owner = THIS_MODULE;
+ c->pde->proc_fops = &clusterip_proc_fops;
c->pde->data = c;
- c->pde->read_proc = clusterip_proc_read;
- c->pde->write_proc = clusterip_proc_write;
- c->pde->proc_fops = &clusterip_proc_fops;
#endif
WRITE_LOCK(&clusterip_lock);
@@ -578,56 +571,107 @@
#ifdef CONFIG_PROC_FS
-static int clusterip_proc_open(struct inode *inode, struct file *file)
+static void *clusterip_seq_start(struct seq_file *s, loff_t *pos)
{
- struct proc_dir_entry *pde = PDE(inode);
+ struct proc_dir_entry *pde = s->private;
struct clusterip_config *c = pde->data;
+ unsigned int *nodeidx;
- clusterip_config_get(c);
+ READ_LOCK(&clusterip_lock);
+ if (*pos >= c->num_local_nodes)
+ return NULL;
- return 0;
+ nodeidx = kmalloc(sizeof(unsigned int), GFP_KERNEL);
+ if (!nodeidx)
+ return ERR_PTR(-ENOMEM);
+
+ *nodeidx = *pos;
+ return nodeidx;
}
-static int clusterip_proc_release(struct inode *inode, struct file *file)
+static void *clusterip_seq_next(struct seq_file *s, void *v, loff_t *pos)
{
- struct proc_dir_entry *pde = PDE(inode);
+ struct proc_dir_entry *pde = s->private;
struct clusterip_config *c = pde->data;
+ unsigned int *nodeidx = (unsigned int *)v;
- clusterip_config_put(c);
+ *pos = ++(*nodeidx);
+ if (*pos >= c->num_local_nodes) {
+ kfree(v);
+ return NULL;
+ }
+ return nodeidx;
+}
+static void clusterip_seq_stop(struct seq_file *s, void *v)
+{
+ kfree(v);
+
+ READ_UNLOCK(&clusterip_lock);
+}
+
+static int clusterip_seq_show(struct seq_file *s, void *v)
+{
+ struct proc_dir_entry *pde = s->private;
+ struct clusterip_config *c = pde->data;
+ unsigned int *nodeidx = (unsigned int *)v;
+
+ if (nodeidx != 0)
+ seq_putc(s, ',');
+ seq_printf(s, "%u", c->local_nodes[*nodeidx]);
+
+ if (*nodeidx == c->num_local_nodes-1)
+ seq_putc(s, '\n');
+
return 0;
}
-static int
-clusterip_proc_read(char *buffer, char **start, off_t offset, int length,
- int *eof, void *data)
+static struct seq_operations clusterip_seq_ops = {
+ .start = clusterip_seq_start,
+ .next = clusterip_seq_next,
+ .stop = clusterip_seq_stop,
+ .show = clusterip_seq_show,
+};
+
+static int clusterip_proc_open(struct inode *inode, struct file *file)
{
- struct clusterip_config *c = data;
- int i, len = 0;
+ int ret = seq_open(file, &clusterip_seq_ops);
- READ_LOCK(&clusterip_lock);
- for (i = 0; i < c->num_local_nodes; i++) {
- len += sprintf(buffer+len, "%u,", c->local_nodes[i]);
+ if (!ret) {
+ struct seq_file *sf = file->private_data;
+ struct proc_dir_entry *pde = PDE(inode);
+ struct clusterip_config *c = pde->data;
+
+ sf->private = pde;
+
+ clusterip_config_get(c);
}
- READ_UNLOCK(&clusterip_lock);
- if (len >= 1)
- *(buffer+len-1) = '\n';
-
- if (length >= len)
- *eof = 1;
+ return ret;
+}
- return len;
+static int clusterip_proc_release(struct inode *inode, struct file *file)
+{
+ struct proc_dir_entry *pde = PDE(inode);
+ struct clusterip_config *c = pde->data;
+ int ret;
+
+ ret = seq_release(inode, file);
+
+ if (!ret)
+ clusterip_config_put(c);
+
+ return ret;
}
-static int
-clusterip_proc_write(struct file *file, const char *input,
- unsigned long size, void *data)
+static ssize_t clusterip_proc_write(struct file *file, const char *input,
+ size_t size, loff_t *ofs)
{
- #define PROC_WRITELEN 10
+#define PROC_WRITELEN 10
char buffer[PROC_WRITELEN+1];
- struct clusterip_config *c = data;
- unsigned long nodenum;
+ struct proc_dir_entry *pde = PDE(file->f_dentry->d_inode);
+ struct clusterip_config *c = pde->data;
+ unsigned long nodenum;
if (copy_from_user(buffer, input, PROC_WRITELEN))
return -EFAULT;
@@ -637,7 +681,7 @@
if (clusterip_add_node(c, nodenum))
return -ENOMEM;
} else if (*buffer == '-') {
- nodenum = simple_strtoul(buffer+1, NULL, 10);
+ nodenum = simple_strtoul(buffer+1, NULL,10);
if (clusterip_del_node(c, nodenum))
return -ENOENT;
} else
@@ -645,6 +689,16 @@
return size;
}
+
+static struct file_operations clusterip_proc_fops = {
+ .owner = THIS_MODULE,
+ .open = clusterip_proc_open,
+ .read = seq_read,
+ .write = clusterip_proc_write,
+ .llseek = seq_lseek,
+ .release = clusterip_proc_release,
+};
+
#endif /* CONFIG_PROC_FS */
static int init_or_cleanup(int fini)
@@ -665,10 +719,6 @@
}
#ifdef CONFIG_PROC_FS
- memcpy(&clusterip_proc_fops, &proc_file_operations, sizeof(clusterip_proc_fops));
- clusterip_proc_fops.owner = THIS_MODULE;
- clusterip_proc_fops.open = clusterip_proc_open;
- clusterip_proc_fops.release = clusterip_proc_release;
clusterip_procdir = proc_mkdir("ipt_CLUSTERIP", proc_net);
if (!clusterip_procdir) {
printk(KERN_ERR "CLUSTERIP: Unable to proc dir entry\n");
More information about the netfilter-cvslog
mailing list