patch-2.2.8 linux/net/irda/irproc.c

Next file: linux/net/sunrpc/sched.c
Previous file: linux/net/irda/irlpt/irlpt_srvr.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.2.7/linux/net/irda/irproc.c linux/net/irda/irproc.c
@@ -32,11 +32,6 @@
 #include <net/irda/irlap.h>
 #include <net/irda/irlmp.h>
 
-static int proc_irda_lookup(struct inode * dir, struct dentry *dentry);
-
-static int proc_irda_readdir(struct file *filp, void *dirent, 
- 			     filldir_t filldir);
-
 extern int irda_device_proc_read(char *buf, char **start, off_t offset, 
 				 int len, int unused);
 extern int irlap_proc_read(char *buf, char **start, off_t offset, int len, 
@@ -50,9 +45,6 @@
 extern int discovery_proc_read(char *buf, char **start, off_t offset, int len, 
 			       int unused);
 
-static int proc_discovery_read(char *buf, char **start, off_t offset, int len,
-			       int unused);
-
 enum irda_directory_inos {
 	PROC_IRDA_LAP = 1,
 	PROC_IRDA_LMP,
@@ -63,121 +55,26 @@
 	PROC_IRDA_IRIAS
 };
 
-static struct file_operations proc_irda_dir_operations = {
-        NULL,                   /* lseek - default */
-        NULL,                   /* read - bad */
-        NULL,                   /* write - bad */
-        proc_irda_readdir,      /* readdir */
-        NULL,                   /* select - default */
-        NULL,                   /* ioctl - default */
-        NULL,                   /* mmap */
-        NULL,                   /* no special open code */
-        NULL,                   /* no special release code */
-        NULL                    /* can't fsync */
-};
-
-/*
- * proc directories can do almost nothing..
- */
-struct inode_operations proc_irda_dir_inode_operations = {
-        &proc_irda_dir_operations,   /* default net directory file-ops */
-        NULL,                   /* create */
-	proc_irda_lookup, 
-        NULL,                   /* link */
-        NULL,                   /* unlink */
-        NULL,                   /* symlink */
-        NULL,                   /* mkdir */
-        NULL,                   /* rmdir */
-        NULL,                   /* mknod */
-        NULL,                   /* rename */ 
-        NULL,                   /* readlink */
-        NULL,                   /* follow_link */
-        NULL,                   /* readpage */
-        NULL,                   /* writepage */
-        NULL,                   /* bmap */
-        NULL,                   /* truncate */   
-        NULL                    /* permission */
+struct irda_entry {
+	char *name;
+	int (*fn)(char*,char**,off_t,int,int);
 };
 
-struct proc_dir_entry proc_irda = {
-	0, 4, "irda",
-        S_IFDIR | S_IRUGO | S_IXUGO, 2, 0, 0,
-        0, &proc_irda_dir_inode_operations,
-        NULL, NULL,
-        NULL,
-        NULL, NULL
-};
+struct proc_dir_entry *proc_irda;
 
+static struct irda_entry dir[] = {
 #if 0 
-struct proc_dir_entry proc_lpt = {
-	0, 3, "lpt",
-	S_IFREG | S_IRUGO, 1, 0, 0,
-	0, NULL /* ops -- default to array */,
-	&irlpt_proc_read /* get_info */,
-};
+	{"lpt", irlpt_proc_read},
 #endif
-
-struct proc_dir_entry proc_discovery = {
-	0, 9, "discovery",
-	S_IFREG | S_IRUGO, 1, 0, 0,
-	0, NULL /* ops -- default to array */,
-	&discovery_proc_read /* get_info */,
+	{"discovery",	discovery_proc_read},
+	{"irda_device",	irda_device_proc_read},
+	{"irttp",	irttp_proc_read},
+	{"irlmp",	irlmp_proc_read},
+	{"irlap",	irlap_proc_read},
+	{"irias",	irias_proc_read},
 };
 
-struct proc_dir_entry proc_irda_device = {
-	0, 11, "irda_device",
-	S_IFREG | S_IRUGO, 1, 0, 0,
-	0, NULL,
-	&irda_device_proc_read,
-};
-
-struct proc_dir_entry proc_ttp = {
-	0, 5, "irttp",
-	S_IFREG | S_IRUGO, 1, 0, 0,
-	0, NULL /* ops -- default to array */,
-	&irttp_proc_read /* get_info */,
-};
-
-struct proc_dir_entry proc_lmp = {
-	0, 5, "irlmp",
-	S_IFREG | S_IRUGO, 1, 0, 0,
-	0, NULL /* ops -- default to array */,
-	&irlmp_proc_read /* get_info */,
-};
-
-struct proc_dir_entry proc_lap = {
-	0, 5, "irlap",
-	S_IFREG | S_IRUGO, 1, 0, 0,
-	0, NULL /* ops -- default to array */,
-	&irlap_proc_read /* get_info */,
-};
-
-struct proc_dir_entry proc_ias = {
-	0, 5, "irias",
-	S_IFREG | S_IRUGO, 1, 0, 0,
-	0, NULL /* ops -- default to array */,
-	&irias_proc_read /* get_info */,
-};
-
-/*
- * Function proc_delete_dentry (dentry)
- *
- *    Copy of proc/root.c because this function is invisible to the irda
- *    module
- * 
- */
-static void proc_delete_dentry(struct dentry * dentry)
-{
-	d_drop(dentry);
-}
-
-static struct dentry_operations proc_dentry_operations =
-{
-	NULL,			/* revalidate */
-	NULL,			/* d_hash */
-	NULL,			/* d_compare */
-	proc_delete_dentry	/* d_delete(struct dentry *) */
-};
+#define IRDA_ENTRIES_NUM (sizeof(dir)/sizeof(dir[0]))
 
 /*
  * Function irda_proc_register (void)
@@ -186,16 +83,13 @@
  *
  */
 void irda_proc_register(void) {
-	proc_net_register(&proc_irda);
+	int i;
+	proc_irda = create_proc_entry("net/irda", S_IFDIR, NULL);
 #ifdef MODULE
-	proc_irda.fill_inode = &irda_proc_modcount;
+	proc_irda->fill_inode = &irda_proc_modcount;
 #endif /* MODULE */
-	proc_register(&proc_irda, &proc_lap);
-	proc_register(&proc_irda, &proc_lmp);
-	proc_register(&proc_irda, &proc_ttp);
-	proc_register(&proc_irda, &proc_ias);
- 	proc_register(&proc_irda, &proc_irda_device); 
-	proc_register(&proc_irda, &proc_discovery);
+	for (i=0;i<IRDA_ENTRIES_NUM;i++)
+		create_proc_entry(dir[i].name,0,proc_irda)->get_info=dir[i].fn;
 }
 
 /*
@@ -205,116 +99,8 @@
  *
  */
 void irda_proc_unregister(void) {
-	proc_unregister(&proc_irda, proc_discovery.low_ino);
- 	proc_unregister(&proc_irda, proc_irda_device.low_ino);
-	proc_unregister(&proc_irda, proc_ias.low_ino);
-	proc_unregister(&proc_irda, proc_ttp.low_ino);
-	proc_unregister(&proc_irda, proc_lmp.low_ino);
-	proc_unregister(&proc_irda, proc_lap.low_ino);
-	proc_unregister(proc_net, proc_irda.low_ino);
-}
-
-/*
- * Function proc_irda_lookup (dir, dentry)
- *
- *    This is a copy of proc_lookup from the linux-2.2.x kernel
- *
- */
-int proc_irda_lookup(struct inode * dir, struct dentry *dentry)
-{
-	struct inode *inode;
-	struct proc_dir_entry * de;
-	int error;
-
-	error = -ENOTDIR;
-	if (!dir || !S_ISDIR(dir->i_mode))
-		goto out;
-
-	error = -ENOENT;
-	inode = NULL;
-	de = (struct proc_dir_entry *) dir->u.generic_ip;
-	if (de) {
-		for (de = de->subdir; de ; de = de->next) {
-			if (!de || !de->low_ino)
-				continue;
-			if (de->namelen != dentry->d_name.len)
-				continue;
-			if (!memcmp(dentry->d_name.name, de->name, de->namelen)) {
-				int ino = de->low_ino | (dir->i_ino & ~(0xffff));
-				error = -EINVAL;
-				inode = proc_get_inode(dir->i_sb, ino, de);
-				break;
-			}
-		}
-	}
-
-	if (inode) {
-		dentry->d_op = &proc_dentry_operations;
-		d_add(dentry, inode);
-		error = 0;
-	}
-out:
-	return error;
-}
-
-/*
- * Function proc_irda_readdir (filp, dirent, filldir)
- *
- *    This is a copy from linux/fs/proc because the function is invisible
- *    to the irda module
- * 
- */
-static int proc_irda_readdir(struct file *filp, void *dirent, 
-			     filldir_t filldir)
-{
-	struct proc_dir_entry * de;
-	unsigned int ino;
 	int i;
-	
-	struct inode *inode = filp->f_dentry->d_inode;
-	if (!inode || !S_ISDIR(inode->i_mode))
-		return -ENOTDIR;
-	ino = inode->i_ino;
-	de = (struct proc_dir_entry *) inode->u.generic_ip;
-	if (!de)
-		return -EINVAL;
-	i = filp->f_pos;
-	switch (i) {
-	case 0:
-		if (filldir(dirent, ".", 1, i, ino) < 0)
-			return 0;
-		i++;
-		filp->f_pos++;
-		/* fall through */
-	case 1:
-		if (filldir(dirent, "..", 2, i, de->parent->low_ino) < 0)
-			return 0;
-		i++;
-		filp->f_pos++;
-		/* fall through */
-	default:
-		ino &= ~0xffff;
-		de = de->subdir;
-		i -= 2;
-		for (;;) {
-			if (!de)
-				return 1;
-			if (!i)
-				break;
-			de = de->next;
-			i--;
-		}
-		
-		do {
-			if (filldir(dirent, de->name, de->namelen, filp->f_pos,
-				    ino | de->low_ino) < 0)
-				return 0;
-			filp->f_pos++;
-			de = de->next;
-		} while (de);
-	}
-	return 1;
+	for (i=0;i<IRDA_ENTRIES_NUM;i++)
+		remove_proc_entry(dir[i].name, proc_irda);
+	remove_proc_entry("net/irda", NULL);
 }
-
-
-

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)