Blame view

net/appletalk/atalk_proc.c 5.34 KB
a10e763b8   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-only
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
  /*
   * 	atalk_proc.c - proc support for Appletalk
   *
   * 	Copyright(c) Arnaldo Carvalho de Melo <acme@conectiva.com.br>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
9
  #include <linux/init.h>
  #include <linux/proc_fs.h>
  #include <linux/seq_file.h>
457c4cbc5   Eric W. Biederman   [NET]: Make /proc...
10
  #include <net/net_namespace.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
12
  #include <net/sock.h>
  #include <linux/atalk.h>
bc3b2d7fb   Paul Gortmaker   net: Add export.h...
13
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
17
18
19
20
21
22
23
24
25
26
  
  
  static __inline__ struct atalk_iface *atalk_get_interface_idx(loff_t pos)
  {
  	struct atalk_iface *i;
  
  	for (i = atalk_interfaces; pos && i; i = i->next)
  		--pos;
  
  	return i;
  }
  
  static void *atalk_seq_interface_start(struct seq_file *seq, loff_t *pos)
ca629f247   Eric Dumazet   [APPLETALK]: Anno...
27
  	__acquires(atalk_interfaces_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  {
  	loff_t l = *pos;
  
  	read_lock_bh(&atalk_interfaces_lock);
  	return l ? atalk_get_interface_idx(--l) : SEQ_START_TOKEN;
  }
  
  static void *atalk_seq_interface_next(struct seq_file *seq, void *v, loff_t *pos)
  {
  	struct atalk_iface *i;
  
  	++*pos;
  	if (v == SEQ_START_TOKEN) {
  		i = NULL;
  		if (atalk_interfaces)
  			i = atalk_interfaces;
  		goto out;
  	}
  	i = v;
  	i = i->next;
  out:
  	return i;
  }
  
  static void atalk_seq_interface_stop(struct seq_file *seq, void *v)
ca629f247   Eric Dumazet   [APPLETALK]: Anno...
53
  	__releases(atalk_interfaces_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  {
  	read_unlock_bh(&atalk_interfaces_lock);
  }
  
  static int atalk_seq_interface_show(struct seq_file *seq, void *v)
  {
  	struct atalk_iface *iface;
  
  	if (v == SEQ_START_TOKEN) {
  		seq_puts(seq, "Interface        Address   Networks  "
  			      "Status
  ");
  		goto out;
  	}
  
  	iface = v;
  	seq_printf(seq, "%-16s %04X:%02X  %04X-%04X  %d
  ",
  		   iface->dev->name, ntohs(iface->address.s_net),
  		   iface->address.s_node, ntohs(iface->nets.nr_firstnet),
  		   ntohs(iface->nets.nr_lastnet), iface->status);
  out:
  	return 0;
  }
  
  static __inline__ struct atalk_route *atalk_get_route_idx(loff_t pos)
  {
  	struct atalk_route *r;
  
  	for (r = atalk_routes; pos && r; r = r->next)
  		--pos;
  
  	return r;
  }
  
  static void *atalk_seq_route_start(struct seq_file *seq, loff_t *pos)
ca629f247   Eric Dumazet   [APPLETALK]: Anno...
90
  	__acquires(atalk_routes_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  {
  	loff_t l = *pos;
  
  	read_lock_bh(&atalk_routes_lock);
  	return l ? atalk_get_route_idx(--l) : SEQ_START_TOKEN;
  }
  
  static void *atalk_seq_route_next(struct seq_file *seq, void *v, loff_t *pos)
  {
  	struct atalk_route *r;
  
  	++*pos;
  	if (v == SEQ_START_TOKEN) {
  		r = NULL;
  		if (atalk_routes)
  			r = atalk_routes;
  		goto out;
  	}
  	r = v;
  	r = r->next;
  out:
  	return r;
  }
  
  static void atalk_seq_route_stop(struct seq_file *seq, void *v)
ca629f247   Eric Dumazet   [APPLETALK]: Anno...
116
  	__releases(atalk_routes_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
  {
  	read_unlock_bh(&atalk_routes_lock);
  }
  
  static int atalk_seq_route_show(struct seq_file *seq, void *v)
  {
  	struct atalk_route *rt;
  
  	if (v == SEQ_START_TOKEN) {
  		seq_puts(seq, "Target        Router  Flags Dev
  ");
  		goto out;
  	}
  
  	if (atrtr_default.dev) {
  		rt = &atrtr_default;
  		seq_printf(seq, "Default     %04X:%02X  %-4d  %s
  ",
  			       ntohs(rt->gateway.s_net), rt->gateway.s_node,
  			       rt->flags, rt->dev->name);
  	}
  
  	rt = v;
  	seq_printf(seq, "%04X:%02X     %04X:%02X  %-4d  %s
  ",
  		   ntohs(rt->target.s_net), rt->target.s_node,
  		   ntohs(rt->gateway.s_net), rt->gateway.s_node,
  		   rt->flags, rt->dev->name);
  out:
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
  static void *atalk_seq_socket_start(struct seq_file *seq, loff_t *pos)
ca629f247   Eric Dumazet   [APPLETALK]: Anno...
149
  	__acquires(atalk_sockets_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
151
  	read_lock_bh(&atalk_sockets_lock);
efaffb78d   Li Zefan   net: appletalk: u...
152
  	return seq_hlist_start_head(&atalk_sockets, *pos);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
154
155
156
  }
  
  static void *atalk_seq_socket_next(struct seq_file *seq, void *v, loff_t *pos)
  {
efaffb78d   Li Zefan   net: appletalk: u...
157
  	return seq_hlist_next(v, &atalk_sockets, pos);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
159
160
  }
  
  static void atalk_seq_socket_stop(struct seq_file *seq, void *v)
ca629f247   Eric Dumazet   [APPLETALK]: Anno...
161
  	__releases(atalk_sockets_lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
  {
  	read_unlock_bh(&atalk_sockets_lock);
  }
  
  static int atalk_seq_socket_show(struct seq_file *seq, void *v)
  {
  	struct sock *s;
  	struct atalk_sock *at;
  
  	if (v == SEQ_START_TOKEN) {
  		seq_printf(seq, "Type Local_addr  Remote_addr Tx_queue "
  				"Rx_queue St UID
  ");
  		goto out;
  	}
efaffb78d   Li Zefan   net: appletalk: u...
177
  	s = sk_entry(v);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
179
180
  	at = at_sk(s);
  
  	seq_printf(seq, "%02X   %04X:%02X:%02X  %04X:%02X:%02X  %08X:%08X "
d14c5ab6b   Francesco Fusco   net: proc_fs: tri...
181
182
  			"%02X %u
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
184
  		   s->sk_type, ntohs(at->src_net), at->src_node, at->src_port,
  		   ntohs(at->dest_net), at->dest_node, at->dest_port,
31e6d363a   Eric Dumazet   net: correct off-...
185
186
  		   sk_wmem_alloc_get(s),
  		   sk_rmem_alloc_get(s),
a7cb5a49b   Eric W. Biederman   userns: Print out...
187
188
  		   s->sk_state,
  		   from_kuid_munged(seq_user_ns(seq), sock_i_uid(s)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
190
191
  out:
  	return 0;
  }
56b3d975b   Philippe De Muyter   [NET]: Make all i...
192
  static const struct seq_operations atalk_seq_interface_ops = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
194
195
196
197
  	.start  = atalk_seq_interface_start,
  	.next   = atalk_seq_interface_next,
  	.stop   = atalk_seq_interface_stop,
  	.show   = atalk_seq_interface_show,
  };
56b3d975b   Philippe De Muyter   [NET]: Make all i...
198
  static const struct seq_operations atalk_seq_route_ops = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199
200
201
202
203
  	.start  = atalk_seq_route_start,
  	.next   = atalk_seq_route_next,
  	.stop   = atalk_seq_route_stop,
  	.show   = atalk_seq_route_show,
  };
56b3d975b   Philippe De Muyter   [NET]: Make all i...
204
  static const struct seq_operations atalk_seq_socket_ops = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
205
206
207
208
209
  	.start  = atalk_seq_socket_start,
  	.next   = atalk_seq_socket_next,
  	.stop   = atalk_seq_socket_stop,
  	.show   = atalk_seq_socket_show,
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
210
211
  int __init atalk_proc_init(void)
  {
e2bcd8b0c   YueHaibing   appletalk: use re...
212
213
  	if (!proc_mkdir("atalk", init_net.proc_net))
  		return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
214

e2bcd8b0c   YueHaibing   appletalk: use re...
215
216
  	if (!proc_create_seq("atalk/interface", 0444, init_net.proc_net,
  			    &atalk_seq_interface_ops))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
217
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218

e2bcd8b0c   YueHaibing   appletalk: use re...
219
220
221
  	if (!proc_create_seq("atalk/route", 0444, init_net.proc_net,
  			    &atalk_seq_route_ops))
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222

e2bcd8b0c   YueHaibing   appletalk: use re...
223
224
225
  	if (!proc_create_seq("atalk/socket", 0444, init_net.proc_net,
  			    &atalk_seq_socket_ops))
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
226

e2bcd8b0c   YueHaibing   appletalk: use re...
227
228
229
230
  	if (!proc_create_seq_private("atalk/arp", 0444, init_net.proc_net,
  				     &aarp_seq_ops,
  				     sizeof(struct aarp_iter_state), NULL))
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231

d0f6ba2ef   Vincent Duvert   appletalk: Fix at...
232
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
  out:
e2bcd8b0c   YueHaibing   appletalk: use re...
234
235
  	remove_proc_subtree("atalk", init_net.proc_net);
  	return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
236
  }
6377f787a   YueHaibing   appletalk: Fix us...
237
  void atalk_proc_exit(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
238
  {
e2bcd8b0c   YueHaibing   appletalk: use re...
239
  	remove_proc_subtree("atalk", init_net.proc_net);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
240
  }