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,
/* ![[previous]](../icons/n_left.png)
![[next]](../icons/n_right.png)
![[first]](../icons/n_first.png)
![[last]](../icons/n_last.png)
![[top]](../icons/top.png)
![[bottom]](../icons/bottom.png)
![[index]](../icons/index.png)
*/
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, /* bmap */
118 NULL, /* truncate */
119 NULL /* permission */
120 };