Blame view
net/x25/x25_proc.c
5.89 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 |
/* * X.25 Packet Layer release 002 * * This is ALPHA test software. This code may break your machine, * randomly fail to work with new releases, misbehave and/or generally |
f8e1d2018 [NET] X25: Fix wh... |
6 |
* screw up. It might even work. |
1da177e4c Linux-2.6.12-rc2 |
7 8 9 10 11 12 13 14 15 16 17 18 |
* * This code REQUIRES 2.4 with seq_file support * * This module: * This module is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * * History * 2002/10/06 Arnaldo Carvalho de Melo seq_file support */ |
1da177e4c Linux-2.6.12-rc2 |
19 20 21 |
#include <linux/init.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> |
bc3b2d7fb net: Add export.h... |
22 |
#include <linux/export.h> |
457c4cbc5 [NET]: Make /proc... |
23 |
#include <net/net_namespace.h> |
1da177e4c Linux-2.6.12-rc2 |
24 25 26 27 |
#include <net/sock.h> #include <net/x25.h> #ifdef CONFIG_PROC_FS |
1da177e4c Linux-2.6.12-rc2 |
28 29 |
static void *x25_seq_route_start(struct seq_file *seq, loff_t *pos) |
6bf1574ee [X25]: Avoid divi... |
30 |
__acquires(x25_route_list_lock) |
1da177e4c Linux-2.6.12-rc2 |
31 |
{ |
1da177e4c Linux-2.6.12-rc2 |
32 |
read_lock_bh(&x25_route_list_lock); |
4f134204f net: x25: use seq... |
33 |
return seq_list_start_head(&x25_route_list, *pos); |
1da177e4c Linux-2.6.12-rc2 |
34 35 36 37 |
} static void *x25_seq_route_next(struct seq_file *seq, void *v, loff_t *pos) { |
4f134204f net: x25: use seq... |
38 |
return seq_list_next(v, &x25_route_list, pos); |
1da177e4c Linux-2.6.12-rc2 |
39 40 41 |
} static void x25_seq_route_stop(struct seq_file *seq, void *v) |
6bf1574ee [X25]: Avoid divi... |
42 |
__releases(x25_route_list_lock) |
1da177e4c Linux-2.6.12-rc2 |
43 44 45 46 47 48 |
{ read_unlock_bh(&x25_route_list_lock); } static int x25_seq_route_show(struct seq_file *seq, void *v) { |
4f134204f net: x25: use seq... |
49 |
struct x25_route *rt = list_entry(v, struct x25_route, node); |
1da177e4c Linux-2.6.12-rc2 |
50 |
|
4f134204f net: x25: use seq... |
51 |
if (v == &x25_route_list) { |
1da177e4c Linux-2.6.12-rc2 |
52 53 54 55 56 57 58 59 60 61 62 63 |
seq_puts(seq, "Address Digits Device "); goto out; } rt = v; seq_printf(seq, "%-15s %-6d %-5s ", rt->address.x25_addr, rt->sigdigits, rt->dev ? rt->dev->name : "???"); out: return 0; |
f8e1d2018 [NET] X25: Fix wh... |
64 |
} |
1da177e4c Linux-2.6.12-rc2 |
65 |
|
1da177e4c Linux-2.6.12-rc2 |
66 |
static void *x25_seq_socket_start(struct seq_file *seq, loff_t *pos) |
6bf1574ee [X25]: Avoid divi... |
67 |
__acquires(x25_list_lock) |
1da177e4c Linux-2.6.12-rc2 |
68 |
{ |
1da177e4c Linux-2.6.12-rc2 |
69 |
read_lock_bh(&x25_list_lock); |
32d2e3a14 net: x25: use seq... |
70 |
return seq_hlist_start_head(&x25_list, *pos); |
1da177e4c Linux-2.6.12-rc2 |
71 72 73 74 |
} static void *x25_seq_socket_next(struct seq_file *seq, void *v, loff_t *pos) { |
32d2e3a14 net: x25: use seq... |
75 |
return seq_hlist_next(v, &x25_list, pos); |
1da177e4c Linux-2.6.12-rc2 |
76 77 78 |
} static void x25_seq_socket_stop(struct seq_file *seq, void *v) |
6bf1574ee [X25]: Avoid divi... |
79 |
__releases(x25_list_lock) |
1da177e4c Linux-2.6.12-rc2 |
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
{ read_unlock_bh(&x25_list_lock); } static int x25_seq_socket_show(struct seq_file *seq, void *v) { struct sock *s; struct x25_sock *x25; struct net_device *dev; const char *devname; if (v == SEQ_START_TOKEN) { seq_printf(seq, "dest_addr src_addr dev lci st vs vr " "va t t2 t21 t22 t23 Snd-Q Rcv-Q inode "); goto out; } |
32d2e3a14 net: x25: use seq... |
97 |
s = sk_entry(v); |
1da177e4c Linux-2.6.12-rc2 |
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
x25 = x25_sk(s); if (!x25->neighbour || (dev = x25->neighbour->dev) == NULL) devname = "???"; else devname = x25->neighbour->dev->name; seq_printf(seq, "%-10s %-10s %-5s %3.3X %d %d %d %d %3lu %3lu " "%3lu %3lu %3lu %5d %5d %ld ", !x25->dest_addr.x25_addr[0] ? "*" : x25->dest_addr.x25_addr, !x25->source_addr.x25_addr[0] ? "*" : x25->source_addr.x25_addr, devname, x25->lci & 0x0FFF, x25->state, x25->vs, x25->vr, x25->va, x25_display_timer(s) / HZ, x25->t2 / HZ, x25->t21 / HZ, x25->t22 / HZ, x25->t23 / HZ, |
31e6d363a net: correct off-... |
113 114 |
sk_wmem_alloc_get(s), sk_rmem_alloc_get(s), |
1da177e4c Linux-2.6.12-rc2 |
115 116 117 |
s->sk_socket ? SOCK_INODE(s->sk_socket)->i_ino : 0L); out: return 0; |
f8e1d2018 [NET] X25: Fix wh... |
118 |
} |
1da177e4c Linux-2.6.12-rc2 |
119 |
|
c9c2e9dcb [X.25]: Adds /pro... |
120 |
static void *x25_seq_forward_start(struct seq_file *seq, loff_t *pos) |
6bf1574ee [X25]: Avoid divi... |
121 |
__acquires(x25_forward_list_lock) |
c9c2e9dcb [X.25]: Adds /pro... |
122 |
{ |
c9c2e9dcb [X.25]: Adds /pro... |
123 |
read_lock_bh(&x25_forward_list_lock); |
4f134204f net: x25: use seq... |
124 |
return seq_list_start_head(&x25_forward_list, *pos); |
c9c2e9dcb [X.25]: Adds /pro... |
125 126 127 128 |
} static void *x25_seq_forward_next(struct seq_file *seq, void *v, loff_t *pos) { |
4f134204f net: x25: use seq... |
129 |
return seq_list_next(v, &x25_forward_list, pos); |
c9c2e9dcb [X.25]: Adds /pro... |
130 131 132 |
} static void x25_seq_forward_stop(struct seq_file *seq, void *v) |
6bf1574ee [X25]: Avoid divi... |
133 |
__releases(x25_forward_list_lock) |
c9c2e9dcb [X.25]: Adds /pro... |
134 135 136 137 138 139 |
{ read_unlock_bh(&x25_forward_list_lock); } static int x25_seq_forward_show(struct seq_file *seq, void *v) { |
4f134204f net: x25: use seq... |
140 |
struct x25_forward *f = list_entry(v, struct x25_forward, node); |
c9c2e9dcb [X.25]: Adds /pro... |
141 |
|
4f134204f net: x25: use seq... |
142 |
if (v == &x25_forward_list) { |
c9c2e9dcb [X.25]: Adds /pro... |
143 144 145 146 147 148 149 150 151 152 |
seq_printf(seq, "lci dev1 dev2 "); goto out; } f = v; seq_printf(seq, "%d %-10s %-10s ", f->lci, f->dev1->name, f->dev2->name); |
c9c2e9dcb [X.25]: Adds /pro... |
153 154 155 |
out: return 0; } |
56b3d975b [NET]: Make all i... |
156 |
static const struct seq_operations x25_seq_route_ops = { |
1da177e4c Linux-2.6.12-rc2 |
157 158 159 160 161 |
.start = x25_seq_route_start, .next = x25_seq_route_next, .stop = x25_seq_route_stop, .show = x25_seq_route_show, }; |
56b3d975b [NET]: Make all i... |
162 |
static const struct seq_operations x25_seq_socket_ops = { |
1da177e4c Linux-2.6.12-rc2 |
163 164 165 166 167 |
.start = x25_seq_socket_start, .next = x25_seq_socket_next, .stop = x25_seq_socket_stop, .show = x25_seq_socket_show, }; |
56b3d975b [NET]: Make all i... |
168 |
static const struct seq_operations x25_seq_forward_ops = { |
c9c2e9dcb [X.25]: Adds /pro... |
169 170 171 172 173 |
.start = x25_seq_forward_start, .next = x25_seq_forward_next, .stop = x25_seq_forward_stop, .show = x25_seq_forward_show, }; |
1da177e4c Linux-2.6.12-rc2 |
174 175 176 177 178 179 180 181 182 |
static int x25_seq_socket_open(struct inode *inode, struct file *file) { return seq_open(file, &x25_seq_socket_ops); } static int x25_seq_route_open(struct inode *inode, struct file *file) { return seq_open(file, &x25_seq_route_ops); } |
c9c2e9dcb [X.25]: Adds /pro... |
183 184 185 186 |
static int x25_seq_forward_open(struct inode *inode, struct file *file) { return seq_open(file, &x25_seq_forward_ops); } |
da7071d7e [PATCH] mark stru... |
187 |
static const struct file_operations x25_seq_socket_fops = { |
1da177e4c Linux-2.6.12-rc2 |
188 189 190 191 192 |
.open = x25_seq_socket_open, .read = seq_read, .llseek = seq_lseek, .release = seq_release, }; |
da7071d7e [PATCH] mark stru... |
193 |
static const struct file_operations x25_seq_route_fops = { |
1da177e4c Linux-2.6.12-rc2 |
194 195 196 197 198 |
.open = x25_seq_route_open, .read = seq_read, .llseek = seq_lseek, .release = seq_release, }; |
a1f6f5a76 [AF_X25]: constif... |
199 |
static const struct file_operations x25_seq_forward_fops = { |
c9c2e9dcb [X.25]: Adds /pro... |
200 201 202 203 204 |
.open = x25_seq_forward_open, .read = seq_read, .llseek = seq_lseek, .release = seq_release, }; |
1da177e4c Linux-2.6.12-rc2 |
205 206 |
int __init x25_proc_init(void) { |
345566bd7 x25: use proc_rem... |
207 208 |
if (!proc_mkdir("x25", init_net.proc_net)) return -ENOMEM; |
1da177e4c Linux-2.6.12-rc2 |
209 |
|
345566bd7 x25: use proc_rem... |
210 211 |
if (!proc_create("x25/route", S_IRUGO, init_net.proc_net, &x25_seq_route_fops)) |
1da177e4c Linux-2.6.12-rc2 |
212 |
goto out; |
345566bd7 x25: use proc_rem... |
213 214 215 |
if (!proc_create("x25/socket", S_IRUGO, init_net.proc_net, &x25_seq_socket_fops)) goto out; |
c9c2e9dcb [X.25]: Adds /pro... |
216 |
|
345566bd7 x25: use proc_rem... |
217 218 219 220 |
if (!proc_create("x25/forward", S_IRUGO, init_net.proc_net, &x25_seq_forward_fops)) goto out; return 0; |
c9c2e9dcb [X.25]: Adds /pro... |
221 |
|
1da177e4c Linux-2.6.12-rc2 |
222 |
out: |
345566bd7 x25: use proc_rem... |
223 224 |
remove_proc_subtree("x25", init_net.proc_net); return -ENOMEM; |
1da177e4c Linux-2.6.12-rc2 |
225 226 227 228 |
} void __exit x25_proc_exit(void) { |
345566bd7 x25: use proc_rem... |
229 |
remove_proc_subtree("x25", init_net.proc_net); |
1da177e4c Linux-2.6.12-rc2 |
230 231 232 233 234 235 236 237 238 239 240 241 242 |
} #else /* CONFIG_PROC_FS */ int __init x25_proc_init(void) { return 0; } void __exit x25_proc_exit(void) { } #endif /* CONFIG_PROC_FS */ |