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/errno.h> 28 #include <linux/sched.h> 29 #include <linux/proc_fs.h> 30 #include <linux/stat.h> 31 #include <linux/fcntl.h> 32 #include <linux/mm.h> 33 34 #include <asm/segment.h> 35 36 #define PROC_BLOCK_SIZE (3*1024) /* 4K page size but our output routines use some slack for overruns */ 37 38 static int proc_readnet(struct inode * inode, struct file * file, /* */ 39 char * buf, int count) 40 { 41 char * page; 42 int bytes=count; 43 int copied=0; 44 char *start; 45 struct proc_dir_entry * dp; 46 47 if (count < 0) 48 return -EINVAL; 49 dp = (struct proc_dir_entry *) inode->u.generic_ip; 50 if (!(page = (char*) __get_free_page(GFP_KERNEL))) 51 return -ENOMEM; 52 53 while (bytes>0) 54 { 55 int length, thistime=bytes; 56 if (bytes > PROC_BLOCK_SIZE) 57 thistime=PROC_BLOCK_SIZE; 58 59 length = dp->get_info(page, &start, 60 file->f_pos, 61 thistime, 62 (file->f_flags & O_ACCMODE) == O_RDWR); 63 64 /* 65 * We have been given a non page aligned block of 66 * the data we asked for + a bit. We have been given 67 * the start pointer and we know the length.. 68 */ 69 70 if (length <= 0) 71 break; 72 /* 73 * Copy the bytes 74 */ 75 memcpy_tofs(buf+copied, start, length); 76 file->f_pos += length; /* Move down the file */ 77 bytes -= length; 78 copied += length; 79 if (length<thistime) 80 break; /* End of file */ 81 } 82 free_page((unsigned long) page); 83 return copied; 84 } 85 86 static struct file_operations proc_net_operations = { 87 NULL, /* lseek - default */ 88 proc_readnet, /* read - bad */ 89 NULL, /* write - bad */ 90 NULL, /* readdir */ 91 NULL, /* select - default */ 92 NULL, /* ioctl - default */ 93 NULL, /* mmap */ 94 NULL, /* no special open code */ 95 NULL, /* no special release code */ 96 NULL /* can't fsync */ 97 }; 98 99 /* 100 * proc directories can do almost nothing.. 101 */ 102 struct inode_operations proc_net_inode_operations = { 103 &proc_net_operations, /* default net file-ops */ 104 NULL, /* create */ 105 NULL, /* lookup */ 106 NULL, /* link */ 107 NULL, /* unlink */ 108 NULL, /* symlink */ 109 NULL, /* mkdir */ 110 NULL, /* rmdir */ 111 NULL, /* mknod */ 112 NULL, /* rename */ 113 NULL, /* readlink */ 114 NULL, /* follow_link */ 115 NULL, /* readpage */ 116 NULL, /* writepage */ 117 NULL, /* bmap */ 118 NULL, /* truncate */ 119 NULL /* permission */ 120 };