* Copyright (c) 1983,1988 Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that this notice is preserved and that due credit is given
* to the University of California at Berkeley. The name of the University
* may not be used to endorse or promote products derived from this
* software without specific prior written permission. This software
* is provided ``as is'' without express or implied warranty.
"@(#) Copyright (c) 1983 Regents of the University of California.\n\
static char sccsid
[] = "@(#)main.c 5.11 (Berkeley) 2/7/88";
extern int tcp_stats(), udp_stats(), ip_stats(), icmp_stats();
extern int spp_stats(), idp_stats(), nserr_stats();
#define NULLPROTOX ((struct protox *) 0)
u_char pr_index
; /* index into nlist of cb head */
u_char pr_sindex
; /* index into nlist of stat block */
u_char pr_wanted
; /* 1 if wanted, 0 otherwise */
int (*pr_cblocks
)(); /* control blocks printing routine */
int (*pr_stats
)(); /* statistics printing routine */
char *pr_name
; /* well-known name */
{ N_TCB
, N_TCPSTAT
, 1, protopr
,
{ N_UDB
, N_UDPSTAT
, 1, protopr
,
struct protox nsprotox
[] = {
{ N_IDP
, N_IDPSTAT
, 1, nsprotopr
,
{ N_IDP
, N_SPPSTAT
, 1, nsprotopr
,
char *system
= "/vmunix";
char *kmemf
= "/dev/kmem";
char usage
[] = "[ -Aaihmnrst ] [-f family] [-p proto] [-I interface] [ interval ] [ system ] [ core ]";
register struct protoent
*p
;
register struct protox
*tp
; /* for printing cblocks & stats */
struct protox
*name2protox(); /* for -p */
while (argc
> 0 && **argv
== '-') {
for (cp
= &argv
[0][1]; *cp
; cp
++)
if ((tp
= name2protox(*argv
)) == NULLPROTOX
) {
fprintf(stderr
, "%s: unknown or uninstrumented protocol\n",
if (strcmp(*argv
, "ns") == 0)
else if (strcmp(*argv
, "inet") == 0)
else if (strcmp(*argv
, "unix") == 0)
fprintf(stderr
, "%s: unknown address family\n",
if (*(interface
= cp
+ 1) == 0) {
if ((interface
= argv
[1]) == 0)
for (cp
= interface
; isalpha(*cp
); cp
++)
printf("usage: %s %s\n", name
, usage
);
if (argc
> 0 && isdigit(argv
[0][0])) {
interval
= atoi(argv
[0]);
fprintf(stderr
, "%s: no namelist\n", system
);
fprintf(stderr
, "cannot open ");
off
= nl
[N_SYSMAP
].n_value
& 0x7fffffff;
nl
[N_SYSSIZE
].n_value
*= 4;
Sysmap
= (struct pte
*)malloc((u_int
)nl
[N_SYSSIZE
].n_value
);
read(kmem
, (char *)Sysmap
, (int)nl
[N_SYSSIZE
].n_value
);
mbpr((off_t
)nl
[N_MBSTAT
].n_value
);
(*tp
->pr_stats
)(nl
[tp
->pr_sindex
].n_value
,
printf("%s: no stats routine\n", tp
->pr_name
);
hostpr(nl
[N_IMP
].n_value
, nl
[N_NIMP
].n_value
);
* Keep file descriptors open to avoid overhead
* of open/close on each call to get* routines.
intpr(interval
, nl
[N_IFNET
].n_value
);
rt_stats((off_t
)nl
[N_RTSTAT
].n_value
);
routepr((off_t
)nl
[N_RTHOST
].n_value
,
(off_t
)nl
[N_RTNET
].n_value
,
(off_t
)nl
[N_RTHASHSIZE
].n_value
);
if (af
== AF_INET
|| af
== AF_UNSPEC
) {
while (p
= getprotoent()) {
for (tp
= protox
; tp
->pr_name
; tp
++)
if (strcmp(tp
->pr_name
, p
->p_name
) == 0)
if (tp
->pr_name
== 0 || tp
->pr_wanted
== 0)
(*tp
->pr_stats
)(nl
[tp
->pr_sindex
].n_value
,
(*tp
->pr_cblocks
)(nl
[tp
->pr_index
].n_value
,
if (af
== AF_NS
|| af
== AF_UNSPEC
) {
for (tp
= nsprotox
; tp
->pr_name
; tp
++) {
(*tp
->pr_stats
)(nl
[tp
->pr_sindex
].n_value
,
(*tp
->pr_cblocks
)(nl
[tp
->pr_index
].n_value
,
if ((af
== AF_UNIX
|| af
== AF_UNSPEC
) && !sflag
)
unixpr((off_t
)nl
[N_NFILE
].n_value
, (off_t
)nl
[N_FILE
].n_value
,
(struct protosw
*)nl
[N_UNIXSW
].n_value
);
if (af
== AF_UNSPEC
&& sflag
)
impstats(nl
[N_IMP
].n_value
, nl
[N_NIMP
].n_value
);
#define KERNBASE 0x80000000
#define KERNBASE 0xC0000000
* Seek into the kernel for a value.
base
= ctob(Sysmap
[btop(base
)].pg_pfnum
) + (base
& PGOFSET
);
return (lseek(fd
, base
, off
));
return (n
!= 1 ? "s" : "");
* Find the protox for the given "well-known" name.
for (tp
= protox
; tp
->pr_name
; tp
++)
if (strcmp(tp
->pr_name
, name
) == 0)
for (tp
= nsprotox
; tp
->pr_name
; tp
++)
if (strcmp(tp
->pr_name
, name
) == 0)
* Find the protox corresponding to name.
char **alias
; /* alias from p->aliases */
* Try to find the name in the list of "well-known" names. If that
* fails, check if name is an alias for an Internet protocol.
if (tp
= knownname(name
))
setprotoent(1); /* make protocol lookup cheaper */
while (p
= getprotoent()) {
/* assert: name not same as p->name */
for (alias
= p
->p_aliases
; *alias
; alias
++)
if (strcmp(name
, *alias
) == 0) {
return(knownname(p
->p_name
));