]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/netstat.c
pc, pc64: disable all pci devices for /dev/reboot
[plan9front.git] / sys / src / cmd / netstat.c
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ip.h>
5 #include <ndb.h>
6
7 void    pip(char*, Dir*);
8 void    nstat(char*, void (*)(char*, Dir*));
9 void    pipifc(void);
10
11 Biobuf  out;
12 char    *netroot;
13 char *proto[20];
14 int nproto;
15 int     notrans;
16
17 void
18 usage(void)
19 {
20         fprint(2, "usage: %s [-in] [-p proto] [network-dir]\n", argv0);
21         exits("usage");
22 }
23
24 void
25 main(int argc, char *argv[])
26 {
27         int justinterfaces = 0;
28         int i, tot, fd;
29         Dir *d;
30         char buf[128];
31
32         ARGBEGIN{
33         case 'i':
34                 justinterfaces = 1;
35                 break;
36         case 'n':
37                 notrans = 1;
38                 break;
39         case 'p':
40                 if(nproto >= nelem(proto))
41                         sysfatal("too many protos");
42                 proto[nproto++] = EARGF(usage());
43                 break;
44         default:
45                 usage();
46         }ARGEND;
47
48         netroot = "/net";
49         switch(argc){
50         case 0:
51                 break;
52         case 1:
53                 netroot = argv[0];
54                 break;
55         default:
56                 usage();
57         }
58
59         Binit(&out, 1, OWRITE);
60
61         if(justinterfaces){
62                 pipifc();
63                 exits(0);
64         }
65
66         if(nproto){
67                 for(i=0; i<nproto; i++)
68                         nstat(proto[i], pip);
69         }else{
70                 fd = open(netroot, OREAD);
71                 if(fd < 0)
72                         sysfatal("open %s: %r", netroot);
73
74                 tot = dirreadall(fd, &d);
75                 for(i=0; i<tot; i++){
76                         if(strcmp(d[i].name, "ipifc") == 0)
77                                 continue;
78                         snprint(buf, sizeof buf, "%s/%s/0/local", netroot, d[i].name);
79                         if(access(buf, 0) >= 0)
80                                 nstat(d[i].name, pip);
81                 }
82         }
83         exits(0);
84 }
85
86 void
87 nstat(char *net, void (*f)(char*, Dir*))
88 {
89         int fdir, i, tot;
90         Dir *dir;
91         char buf[128];
92
93         snprint(buf, sizeof buf, "%s/%s", netroot, net);
94         fdir = open(buf, OREAD);
95         if(fdir < 0)
96                 return;
97
98         tot = dirreadall(fdir, &dir);
99         for(i = 0; i < tot; i++) {
100                 (*f)(net, &dir[i]);
101                 Bflush(&out);
102         }
103         free(dir);
104         close(fdir);
105 }
106
107 char*
108 getport(char *net, char *p)
109 {
110         static char port[10];
111
112         strncpy(port, p, sizeof(port)-1);
113         port[sizeof(port)-1] = 0;
114         if(notrans || (p = csgetvalue(netroot, "port", p, net, nil)) == nil)
115                 return port;
116         strncpy(port, p, sizeof(port)-1);
117         port[sizeof(port)-1] = 0;
118         free(p);
119         return port;
120 }
121
122 void
123 pip(char *net, Dir *db)
124 {
125         int n, fd;
126         char buf[128], *p;
127         char *dname;
128
129         if(strcmp(db->name, "clone") == 0)
130                 return;
131         if(strcmp(db->name, "stats") == 0)
132                 return;
133
134         snprint(buf, sizeof buf, "%s/%s/%s/status", netroot, net, db->name);
135         fd = open(buf, OREAD);
136         if(fd < 0)
137                 return;
138         n = read(fd, buf, sizeof(buf));
139         close(fd);
140         if(n < 0)
141                 return;
142         buf[n] = 0;
143
144         p = strchr(buf, ' ');
145         if(p != 0)
146                 *p = 0;
147         p = strrchr(buf, '\n');
148         if(p != 0)
149                 *p = 0;
150         Bprint(&out, "%-4s %-4s %-10s %-12s ", net, db->name, db->uid, buf);
151
152         snprint(buf, sizeof buf, "%s/%s/%s/local", netroot, net, db->name);
153         fd = open(buf, OREAD);
154         if(fd < 0) {
155                 Bprint(&out, "\n");
156                 return;
157         }
158         n = read(fd, buf, sizeof(buf));
159         close(fd);
160         if(n < 0) {
161                 Bprint(&out, "\n");
162                 return;
163         }
164         buf[n-1] = 0;
165         p = strchr(buf, '!');
166         if(p == 0) {
167                 Bprint(&out, "\n");
168                 return;
169         }
170         *p = '\0';
171         Bprint(&out, "%-10s ", getport(net, p+1));
172
173         snprint(buf, sizeof buf, "%s/%s/%s/remote", netroot, net, db->name);
174         fd = open(buf, OREAD);
175         if(fd < 0) {
176                 print("\n");
177                 return;
178         }
179         n = read(fd, buf, sizeof(buf));
180         close(fd);
181         if(n < 0) {
182                 print("\n");
183                 return;
184         }
185         buf[n-1] = 0;
186         p = strchr(buf, '!');
187         if(p != nil)
188                 *p++ = '\0';
189
190         if(notrans){
191                 Bprint(&out, "%-10s %s\n", getport(net, p), buf);
192                 return;
193         }
194         dname = csgetvalue(netroot, "ip", buf, "dom", nil);
195         if(dname == nil) {
196                 Bprint(&out, "%-10s %s\n", getport(net, p), buf);
197                 return;
198         }
199         Bprint(&out, "%-10s %s\n", getport(net, p), dname);
200         Bflush(&out);
201         free(dname);
202 }
203
204 void
205 pipifc(void)
206 {
207         Ipifc *ip, *nip;
208         Iplifc *lifc;
209         char buf[100];
210         int l, i;
211
212         fmtinstall('I', eipfmt);
213         fmtinstall('M', eipfmt);
214
215         ip = readipifc(netroot, nil, -1);
216
217         l = 7;
218         for(nip = ip; nip; nip = nip->next){
219                 for(lifc = nip->lifc; lifc; lifc = lifc->next){
220                         i = snprint(buf, sizeof buf, "%I", lifc->ip);
221                         if(i > l)
222                                 l = i;
223                         i = snprint(buf, sizeof buf, "%I", lifc->net);
224                         if(i > l)
225                                 l = i;
226                 }
227         }
228
229         for(nip = ip; nip; nip = nip->next){
230                 for(lifc = nip->lifc; lifc; lifc = lifc->next)
231                         Bprint(&out, "%-12s %5d %-*I %5M %-*I %8lud %8lud %8lud %8lud\n",
232                                 nip->dev, nip->mtu, 
233                                 l, lifc->ip, lifc->mask, l, lifc->net,
234                                 nip->pktin, nip->pktout,
235                                 nip->errin, nip->errout);
236         }
237         Bflush(&out);
238 }