xref: /csrg-svn/usr.bin/netstat/if.c (revision 7905)
1*7905Ssam #ifndef lint
2*7905Ssam static char sccsid[] = "@(#)if.c	4.1 82/08/25";
3*7905Ssam #endif
4*7905Ssam 
5*7905Ssam #include <sys/types.h>
6*7905Ssam #include <sys/socket.h>
7*7905Ssam #include <net/in.h>
8*7905Ssam #include <net/if.h>
9*7905Ssam 
10*7905Ssam extern	int kmem;
11*7905Ssam extern	int tflag;
12*7905Ssam extern	int nflag;
13*7905Ssam extern	char *routename();
14*7905Ssam 
15*7905Ssam /*
16*7905Ssam  * Print a description of the network interfaces.
17*7905Ssam  * If interval is non-zero, repeat display every
18*7905Ssam  * interval seconds, showing statistics collected
19*7905Ssam  * over that interval.  First line printed is always
20*7905Ssam  * cumulative.
21*7905Ssam  */
22*7905Ssam intpr(interval, ifnetaddr)
23*7905Ssam 	int interval;
24*7905Ssam 	off_t ifnetaddr;
25*7905Ssam {
26*7905Ssam 	struct ifnet ifnet;
27*7905Ssam 	char name[16];
28*7905Ssam 
29*7905Ssam 	if (ifnetaddr == 0) {
30*7905Ssam 		printf("ifnet: symbol not defined\n");
31*7905Ssam 		return;
32*7905Ssam 	}
33*7905Ssam 	if (interval) {
34*7905Ssam 		sidewaysintpr(interval, ifnetaddr);
35*7905Ssam 		return;
36*7905Ssam 	}
37*7905Ssam 	klseek(kmem, ifnetaddr, 0);
38*7905Ssam 	read(kmem, &ifnetaddr, sizeof ifnetaddr);
39*7905Ssam 	printf("%-5.5s %-5.5s %-8.8s %-12.12s %-7.7s %-5.5s %-7.7s %-5.5s",
40*7905Ssam 		"Name", "Mtu", "Network", "Address", "Ipkts", "Ierrs",
41*7905Ssam 		"Opkts", "Oerrs");
42*7905Ssam 	printf(" %-6.6s", "Collis");
43*7905Ssam 	if (tflag)
44*7905Ssam 		printf(" %-6.6s", "Timer");
45*7905Ssam 	putchar('\n');
46*7905Ssam 	while (ifnetaddr) {
47*7905Ssam 		struct sockaddr_in *sin;
48*7905Ssam 		register char *cp;
49*7905Ssam 		char *index();
50*7905Ssam 
51*7905Ssam 		klseek(kmem, ifnetaddr, 0);
52*7905Ssam 		read(kmem, &ifnet, sizeof ifnet);
53*7905Ssam 		klseek(kmem, (int)ifnet.if_name, 0);
54*7905Ssam 		read(kmem, name, 16);
55*7905Ssam 		name[15] = '\0';
56*7905Ssam 		cp = index(name, '\0');
57*7905Ssam 		*cp++ = ifnet.if_unit + '0';
58*7905Ssam 		if ((ifnet.if_flags&IFF_UP) == 0)
59*7905Ssam 			*cp++ = '*';
60*7905Ssam 		*cp = '\0';
61*7905Ssam 		printf("%-5.5s %-5d ", name, ifnet.if_mtu);
62*7905Ssam 		sin = (struct sockaddr_in *)&ifnet.if_addr;
63*7905Ssam 		printf("%-8.8s ", routename(ifnet.if_net));
64*7905Ssam 		printf("%-12.12s %-7d %-5d %-7d %-5d %-6d",
65*7905Ssam 		    routename(sin->sin_addr),
66*7905Ssam 		    ifnet.if_ipackets, ifnet.if_ierrors,
67*7905Ssam 		    ifnet.if_opackets, ifnet.if_oerrors,
68*7905Ssam 		    ifnet.if_collisions);
69*7905Ssam 		if (tflag)
70*7905Ssam 			printf(" %-6d", ifnet.if_timer);
71*7905Ssam 		putchar('\n');
72*7905Ssam 		ifnetaddr = (off_t) ifnet.if_next;
73*7905Ssam 	}
74*7905Ssam }
75*7905Ssam 
76*7905Ssam sidewaysintpr(interval, off)
77*7905Ssam 	int interval;
78*7905Ssam 	off_t off;
79*7905Ssam {
80*7905Ssam 	struct ifnet ifnet;
81*7905Ssam 	char name[16];
82*7905Ssam 
83*7905Ssam 	klseek(kmem, off, 0);
84*7905Ssam 	read(kmem, &off, sizeof (off_t));
85*7905Ssam 	return;
86*7905Ssam 	/*NOTREACHED*/
87*7905Ssam 	printf("%-5.5s\t%-5.5s  %-10.10s  %-10.10s %-7.7s %-5.5s %-7.7s %-5.5s",
88*7905Ssam 		"Name", "Ipkts", "Ierrs", "Opkts", "Oerrs");
89*7905Ssam 	printf("  %-6.6s", "collis");
90*7905Ssam 	while (off) {
91*7905Ssam 		struct sockaddr_in *sin;
92*7905Ssam 
93*7905Ssam 		klseek(kmem, off, 0);
94*7905Ssam 		read(kmem, &ifnet, sizeof ifnet);
95*7905Ssam 		klseek(kmem, (int)ifnet.if_name, 0);
96*7905Ssam 		read(kmem, name, 16);
97*7905Ssam 		sin = (struct sockaddr_in *)&ifnet.if_addr;
98*7905Ssam 		printf("%s%d%c:\t%5d  ",
99*7905Ssam 		    name, ifnet.if_unit, ifnet.if_flags & IFF_UP ? '\0' : '*',
100*7905Ssam 		    ifnet.if_mtu);
101*7905Ssam 		printf("%-10.10s %-10.10s %7d %5d %7d %5d  %6d",
102*7905Ssam 		    inetname(ifnet.if_net),
103*7905Ssam 		    inetname(sin->sin_addr),
104*7905Ssam 		    ifnet.if_ipackets, ifnet.if_ierrors,
105*7905Ssam 		    ifnet.if_opackets, ifnet.if_oerrors,
106*7905Ssam 		    ifnet.if_collisions);
107*7905Ssam 		putchar('\n');
108*7905Ssam 		off = (off_t) ifnet.if_next;
109*7905Ssam 	}
110*7905Ssam }
111