1 /* 2 * linux/fs/proc/net.c 3 * 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 * 6 * gjh 3/'93 heim@peanuts.informatik.uni-tuebingen.de (Gerald J. Heim) 7 * most of this file is stolen from base.c 8 * it works, but you shouldn't use it as a guideline 9 * for new proc-fs entries. once i'll make it better. 10 * fvk 3/'93 waltje@uwalt.nl.mugnet.org (Fred N. van Kempen) 11 * cleaned up the whole thing, moved "net" specific code to 12 * the NET kernel layer (where it belonged in the first place). 13 * Michael K. Johnson (johnsonm@stolaf.edu) 3/93 14 * Added support from my previous inet.c. Cleaned things up 15 * quite a bit, modularized the code. 16 * fvk 4/'93 waltje@uwalt.nl.mugnet.org (Fred N. van Kempen) 17 * Renamed "route_get_info()" to "rt_get_info()" for consistency. 18 * Alan Cox (gw4pts@gw4pts.ampr.org) 4/94 19 * Dusted off the code and added IPX. Fixed the 4K limit. 20 * Erik Schoenfelder (schoenfr@ibr.cs.tu-bs.de) 21 * /proc/net/snmp. 22 * Alan Cox (gw4pts@gw4pts.ampr.org) 1/95 23 * Added Appletalk slots 24 * 25 * proc net directory handling functions 26 */ 27 #include <linux/autoconf.h> 28 29 #include <asm/segment.h> 30 31 #include <linux/errno.h> 32 #include <linux/sched.h> 33 #include <linux/proc_fs.h> 34 #include <linux/stat.h> 35 #include <linux/fcntl.h> 36 #include <linux/mm.h> 37 38 #define PROC_BLOCK_SIZE (3*1024) /* 4K page size but our output routines use some slack for overruns */ 39 40 static int proc_readnet(struct inode * inode, struct file * file, /* */ 41 char * buf, int count) 42 { 43 char * page; 44 int bytes=count; 45 int copied=0; 46 char *start; 47 struct proc_dir_entry * dp; 48 49 if (count < 0) 50 return -EINVAL; 51 dp = (struct proc_dir_entry *) inode->u.generic_ip; 52 if (!(page = (char*) __get_free_page(GFP_KERNEL))) 53 return -ENOMEM; 54 55 while (bytes>0) 56 { 57 int length, thistime=bytes; 58 if (bytes > PROC_BLOCK_SIZE) 59 thistime=PROC_BLOCK_SIZE; 60 61 length = dp->get_info(page, &start, 62 file->f_pos, 63 thistime, 64 (file->f_flags & O_ACCMODE) == O_RDWR); 65 66 /* 67 * We have been given a non page aligned block of 68 * the data we asked for + a bit. We have been given 69 * the start pointer and we know the length.. 70 */ 71 72 if (length <= 0) 73 break; 74 /* 75 * Copy the bytes 76 */ 77 memcpy_tofs(buf+copied, start, length); 78 file->f_pos += length; /* Move down the file */ 79 bytes -= length; 80 copied += length; 81 if (length<thistime) 82 break; /* End of file */ 83 } 84 free_page((unsigned long) page); 85 return copied; 86 } 87 88 static struct file_operations proc_net_operations = { 89 NULL, /* lseek - default */ 90 proc_readnet, /* read - bad */ 91 NULL, /* write - bad */ 92 NULL, /* readdir */ 93 NULL, /* select - default */ 94 NULL, /* ioctl - default */ 95 NULL, /* mmap */ 96 NULL, /* no special open code */ 97 NULL, /* no special release code */ 98 NULL /* can't fsync */ 99 }; 100 101 /* 102 * proc directories can do almost nothing.. 103 */ 104 struct inode_operations proc_net_inode_operations = { 105 &proc_net_operations, /* default net file-ops */ 106 NULL, /* create */ 107 NULL, /* lookup */ 108 NULL, /* link */ 109 NULL, /* unlink */ 110 NULL, /* symlink */ 111 NULL, /* mkdir */ 112 NULL, /* rmdir */ 113 NULL, /* mknod */ 114 NULL, /* rename */ 115 NULL, /* readlink */ 116 NULL, /* follow_link */ 117 NULL, /* readpage */ 118 NULL, /* writepage */ 119 NULL, /* bmap */ 120 NULL, /* truncate */ 121 NULL /* permission */ 122 };