diff options
Diffstat (limited to 'usr.bin/netstat')
| -rw-r--r-- | usr.bin/netstat/inet.c | 177 | ||||
| -rw-r--r-- | usr.bin/netstat/main.c | 156 | ||||
| -rw-r--r-- | usr.bin/netstat/mbuf.c | 5 | ||||
| -rw-r--r-- | usr.bin/netstat/netstat.h | 4 | ||||
| -rw-r--r-- | usr.bin/netstat/unix.c | 122 | 
5 files changed, 265 insertions, 199 deletions
diff --git a/usr.bin/netstat/inet.c b/usr.bin/netstat/inet.c index 0226107e23bf..f6ff5e517d0a 100644 --- a/usr.bin/netstat/inet.c +++ b/usr.bin/netstat/inet.c @@ -36,7 +36,7 @@  static char sccsid[] = "@(#)inet.c	8.5 (Berkeley) 5/24/95";  */  static const char rcsid[] = -	"$Id: inet.c,v 1.25 1997/02/22 19:56:21 peter Exp $"; +	"$Id: inet.c,v 1.26 1997/08/25 16:57:05 wollman Exp $";  #endif /* not lint */  #include <sys/param.h> @@ -67,16 +67,15 @@ static const char rcsid[] =  #include <netinet/udp_var.h>  #include <arpa/inet.h> +#include <err.h> +#include <errno.h>  #include <netdb.h>  #include <stdio.h> +#include <stdlib.h>  #include <string.h>  #include <unistd.h>  #include "netstat.h" -struct	inpcb inpcb; -struct	tcpcb tcpcb; -struct	socket sockb; -  char	*inetname __P((struct in_addr *));  void	inetprint __P((struct in_addr *, int, char *, int)); @@ -87,50 +86,83 @@ void	inetprint __P((struct in_addr *, int, char *, int));   * -a (all) flag is specified.   */  void -protopr(off, name) -	u_long off; +protopr(proto, name) +	u_long proto;		/* for sysctl version we pass proto # */  	char *name;  { -	struct inpcbhead head; -	register struct inpcb *prev, *next;  	int istcp;  	static int first = 1; +	char *buf; +	const char *mibvar; +	struct tcpcb *tp; +	struct inpcb *inp; +	struct xinpgen *xig, *oxig; +	struct xsocket *so; +	size_t len; -	if (off == 0) +	istcp = 0; +	switch (proto) { +	case IPPROTO_TCP: +		istcp = 1; +		mibvar = "net.inet.tcp.pcblist"; +		break; +	case IPPROTO_UDP: +		mibvar = "net.inet.udp.pcblist"; +		break; +	case IPPROTO_DIVERT: +		mibvar = "net.inet.divert.pcblist"; +		break; +	default: +		mibvar = "net.inet.raw.pcblist"; +		break; +	} +	len = 0; +	if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) { +		if (errno != ENOENT) +			warn("sysctl: %s", mibvar);  		return; +	} +	if ((buf = malloc(len)) == 0) { +		warn("malloc %lu bytes", (u_long)len); +		return; +	} +	if (sysctlbyname(mibvar, buf, &len, 0, 0) < 0) { +		warn("sysctl: %s", mibvar); +		free(buf); +		return; +	} -	istcp = strcmp(name, "tcp") == 0; -	kread(off, (char *)&head, sizeof (struct inpcbhead)); -	prev = (struct inpcb *)off; - -	for (next = head.lh_first; next != NULL; next = inpcb.inp_list.le_next) { -		if (kread((u_long)next, (char *)&inpcb, sizeof (inpcb))) { -			printf("???\n"); -			break; -		} -		if (!aflag && -		  inet_lnaof(inpcb.inp_laddr) == INADDR_ANY) { -			prev = next; -			continue; -		} -		if (kread((u_long)inpcb.inp_socket, (char *)&sockb, sizeof (sockb))) { -			printf("???\n"); -			break; -		}; +	oxig = xig = (struct xinpgen *)buf; +	for (xig = (struct xinpgen *)((char *)xig + xig->xig_len); +	     xig->xig_len > sizeof(struct xinpgen); +	     xig = (struct xinpgen *)((char *)xig + xig->xig_len)) {  		if (istcp) { -			if (kread((u_long)inpcb.inp_ppcb, -			    (char *)&tcpcb, sizeof (tcpcb))) { -				printf("???\n"); -				break; -			}; +			tp = &((struct xtcpcb *)xig)->xt_tp; +			inp = &((struct xtcpcb *)xig)->xt_inp; +			so = &((struct xtcpcb *)xig)->xt_socket; +		} else { +			inp = &((struct xinpcb *)xig)->xi_inp; +			so = &((struct xinpcb *)xig)->xi_socket;  		} + +		/* Ignore sockets for protocols other than the desired one. */ +		if (so->xso_protocol != proto) +			continue; + +		/* Ignore PCBs which were freed during copyout. */ +		if (inp->inp_gencnt > oxig->xig_gen) +			continue; + +		if (!aflag && inet_lnaof(inp->inp_laddr) == INADDR_ANY) +			continue; +  		if (first) {  			printf("Active Internet connections");  			if (aflag)  				printf(" (including servers)");  			putchar('\n');  			if (Aflag) -				printf("%-8.8s ", "PCB"); +				printf("%-8.8s ", "Socket");  			printf(Aflag ?  				"%-5.5s %-6.6s %-6.6s  %-18.18s %-18.18s %s\n" :  				"%-5.5s %-6.6s %-6.6s  %-22.22s %-22.22s %s\n", @@ -139,43 +171,52 @@ protopr(off, name)  			first = 0;  		}  		if (Aflag) -			if (istcp) -				printf("%8x ", (int)inpcb.inp_ppcb); -			else -				printf("%8x ", (int)next); -		printf("%-5.5s %6ld %6ld ", name, sockb.so_rcv.sb_cc, -			sockb.so_snd.sb_cc); +			printf("%8lx ", (u_long)so->so_pcb); +		printf("%-5.5s %6ld %6ld ", name, so->so_rcv.sb_cc, +			so->so_snd.sb_cc);  		if (nflag) { -			inetprint(&inpcb.inp_laddr, (int)inpcb.inp_lport, +			inetprint(&inp->inp_laddr, (int)inp->inp_lport,  			    name, 1); -			inetprint(&inpcb.inp_faddr, (int)inpcb.inp_fport, +			inetprint(&inp->inp_faddr, (int)inp->inp_fport,  			    name, 1); -		} else if (inpcb.inp_flags & INP_ANONPORT) { -			inetprint(&inpcb.inp_laddr, (int)inpcb.inp_lport, +		} else if (inp->inp_flags & INP_ANONPORT) { +			inetprint(&inp->inp_laddr, (int)inp->inp_lport,  			    name, 1); -			inetprint(&inpcb.inp_faddr, (int)inpcb.inp_fport, +			inetprint(&inp->inp_faddr, (int)inp->inp_fport,  			    name, 0);  		} else { -			inetprint(&inpcb.inp_laddr, (int)inpcb.inp_lport, +			inetprint(&inp->inp_laddr, (int)inp->inp_lport,  			    name, 0); -			inetprint(&inpcb.inp_faddr, (int)inpcb.inp_fport, -			    name, inpcb.inp_lport != inpcb.inp_fport); +			inetprint(&inp->inp_faddr, (int)inp->inp_fport, +			    name, inp->inp_lport != inp->inp_fport);  		}  		if (istcp) { -			if (tcpcb.t_state < 0 || tcpcb.t_state >= TCP_NSTATES) -				printf(" %d", tcpcb.t_state); +			if (tp->t_state < 0 || tp->t_state >= TCP_NSTATES) +				printf(" %d", tp->t_state);                        else { -				printf(" %s", tcpstates[tcpcb.t_state]); +				printf(" %s", tcpstates[tp->t_state]);  #if defined(TF_NEEDSYN) && defined(TF_NEEDFIN)                                /* Show T/TCP `hidden state' */ -                              if (tcpcb.t_flags & (TF_NEEDSYN|TF_NEEDFIN)) +                              if (tp->t_flags & (TF_NEEDSYN|TF_NEEDFIN))                                        putchar('*');  #endif /* defined(TF_NEEDSYN) && defined(TF_NEEDFIN) */                        }  		}  		putchar('\n'); -		prev = next;  	} +	if (xig != oxig && xig->xig_gen != oxig->xig_gen) { +		if (oxig->xig_count > xig->xig_count) { +			printf("Some %s sockets may have been deleted.\n", +			       name); +		} else if (oxig->xig_count < xig->xig_count) { +			printf("Some %s sockets may have been created.\n", +			       name); +		} else { +			printf("Some %s sockets may have been created or deleted", +			       name); +		} +	} +	free(buf);  }  /* @@ -187,11 +228,14 @@ tcp_stats(off, name)  	char *name;  {  	struct tcpstat tcpstat; - -	if (off == 0) +	size_t len = sizeof tcpstat; +	 +	if (sysctlbyname("net.inet.tcp.stats", &tcpstat, &len, 0, 0) < 0) { +		warn("sysctl: net.inet.tcp.stats");  		return; +	} +  	printf ("%s:\n", name); -	kread(off, (char *)&tcpstat, sizeof (tcpstat));  #define	p(f, m) if (tcpstat.f || sflag <= 1) \      printf(m, tcpstat.f, plural(tcpstat.f)) @@ -271,11 +315,14 @@ udp_stats(off, name)  	char *name;  {  	struct udpstat udpstat; +	size_t len = sizeof udpstat;  	u_long delivered; -	if (off == 0) +	if (sysctlbyname("net.inet.udp.stats", &udpstat, &len, 0, 0) < 0) { +		warn("sysctl: net.inet.udp.stats");  		return; -	kread(off, (char *)&udpstat, sizeof (udpstat)); +	} +  	printf("%s:\n", name);  #define	p(f, m) if (udpstat.f || sflag <= 1) \      printf(m, udpstat.f, plural(udpstat.f)) @@ -309,10 +356,13 @@ ip_stats(off, name)  	char *name;  {  	struct ipstat ipstat; +	size_t len = sizeof ipstat; -	if (off == 0) +	if (sysctlbyname("net.inet.ip.stats", &ipstat, &len, 0, 0) < 0) { +		warn("sysctl: net.inet.ip.stats");  		return; -	kread(off, (char *)&ipstat, sizeof (ipstat)); +	} +  	printf("%s:\n", name);  #define	p(f, m) if (ipstat.f || sflag <= 1) \ @@ -444,10 +494,13 @@ igmp_stats(off, name)  	char *name;  {  	struct igmpstat igmpstat; +	size_t len = sizeof igmpstat; -	if (off == 0) +	if (sysctlbyname("net.inet.igmp.stats", &igmpstat, &len, 0, 0) < 0) { +		warn("sysctl: net.inet.igmp.stats");  		return; -	kread(off, (char *)&igmpstat, sizeof (igmpstat)); +	} +  	printf("%s:\n", name);  #define	p(f, m) if (igmpstat.f || sflag <= 1) \ diff --git a/usr.bin/netstat/main.c b/usr.bin/netstat/main.c index c9e7c429341c..30a89279343c 100644 --- a/usr.bin/netstat/main.c +++ b/usr.bin/netstat/main.c @@ -42,7 +42,7 @@ char const copyright[] =  static char sccsid[] = "@(#)main.c	8.4 (Berkeley) 3/1/94";  #endif  static const char rcsid[] = -	"$Id$"; +	"$Id: main.c,v 1.19 1997/07/29 06:51:40 charnier Exp $";  #endif /* not lint */  #include <sys/param.h> @@ -67,82 +67,62 @@ static const char rcsid[] =  #include "netstat.h"  struct nlist nl[] = { -#define	N_MBSTAT	0 -	{ "_mbstat" }, -#define	N_IPSTAT	1 -	{ "_ipstat" }, -#define	N_TCB		2 -	{ "_tcb" }, -#define	N_TCPSTAT	3 -	{ "_tcpstat" }, -#define	N_UDB		4 -	{ "_udb" }, -#define	N_UDPSTAT	5 -	{ "_udpstat" }, -#define	N_IFNET		6 +#define	N_IFNET		0  	{ "_ifnet" }, -#define	N_IMP		7 +#define	N_IMP		1  	{ "_imp_softc" }, -#define	N_ICMPSTAT	8 -	{ "_icmpstat" }, -#define	N_RTSTAT	9 +#define	N_RTSTAT	2  	{ "_rtstat" }, -#define	N_UNIXSW	10 +#define	N_UNIXSW	3  	{ "_localsw" }, -#define N_IDP		11 +#define N_IDP		4  	{ "_nspcb"}, -#define N_IDPSTAT	12 +#define N_IDPSTAT	5  	{ "_idpstat"}, -#define N_SPPSTAT	13 +#define N_SPPSTAT	6  	{ "_spp_istat"}, -#define N_NSERR		14 +#define N_NSERR		7  	{ "_ns_errstat"}, -#define	N_CLNPSTAT	15 +#define	N_CLNPSTAT	8  	{ "_clnp_stat"}, -#define	IN_NOTUSED	16 +#define	IN_NOTUSED	9  	{ "_tp_inpcb" }, -#define	ISO_TP		17 +#define	ISO_TP		10  	{ "_tp_refinfo" }, -#define	N_TPSTAT	18 +#define	N_TPSTAT	11  	{ "_tp_stat" }, -#define	N_ESISSTAT	19 +#define	N_ESISSTAT	12  	{ "_esis_stat"}, -#define N_NIMP		20 +#define N_NIMP		13  	{ "_nimp"}, -#define N_RTREE		21 +#define N_RTREE		14  	{ "_rt_tables"}, -#define N_CLTP		22 +#define N_CLTP		15  	{ "_cltb"}, -#define N_CLTPSTAT	23 +#define N_CLTPSTAT	16  	{ "_cltpstat"}, -#define	N_NFILE		24 +#define	N_NFILE		17  	{ "_nfile" }, -#define	N_FILE		25 +#define	N_FILE		18  	{ "_file" }, -#define N_IGMPSTAT	26 -	{ "_igmpstat" }, -#define N_MRTPROTO	27 +#define N_MRTPROTO	19  	{ "_ip_mrtproto" }, -#define N_MRTSTAT	28 +#define N_MRTSTAT	20  	{ "_mrtstat" }, -#define N_MFCTABLE	29 +#define N_MFCTABLE	21  	{ "_mfctable" }, -#define N_VIFTABLE	30 +#define N_VIFTABLE	22  	{ "_viftable" }, -#define N_IPX		31 +#define N_IPX		23  	{ "_ipxpcb"}, -#define N_IPXSTAT	32 +#define N_IPXSTAT	24  	{ "_ipxstat"}, -#define N_SPXSTAT	33 +#define N_SPXSTAT	25  	{ "_spx_istat"}, -#define N_DDPSTAT	34 +#define N_DDPSTAT	26  	{ "_ddpstat"}, -#define N_DDPCB		35 +#define N_DDPCB		27  	{ "_ddpcb"}, -#define N_DIVPCB	36 -	{ "_divcb"}, -#define N_DIVSTAT	37 -	{ "_divstat"},  	{ "" },  }; @@ -153,19 +133,20 @@ struct protox {  	void	(*pr_cblocks)();	/* control blocks printing routine */  	void	(*pr_stats)();		/* statistics printing routine */  	char	*pr_name;		/* well-known name */ +	int	pr_usesysctl;		/* true if we use sysctl, not kvm */  } protox[] = { -	{ N_TCB,	N_TCPSTAT,	1,	protopr, -	  tcp_stats,	"tcp" }, -	{ N_UDB,	N_UDPSTAT,	1,	protopr, -	  udp_stats,	"udp" }, -	{ N_DIVPCB,	N_DIVSTAT,	1,	protopr, -	  NULL,		"divert" }, 	/* no stat structure yet */ -	{ -1,		N_IPSTAT,	1,	0, -	  ip_stats,	"ip" }, -	{ -1,		N_ICMPSTAT,	1,	0, -	  icmp_stats,	"icmp" }, -	{ -1,		N_IGMPSTAT,	1,	0, -	  igmp_stats,	"igmp" }, +	{ -1,		-1,		1,	protopr, +	  tcp_stats,	"tcp",		IPPROTO_TCP }, +	{ -1,		-1,		1,	protopr, +	  udp_stats,	"udp",		IPPROTO_UDP }, +	{ -1,		-1,		1,	protopr, +	  NULL,		"divert",	IPPROTO_DIVERT }, +	{ -1,		-1,		1,	protopr, +	  ip_stats,	"ip",		IPPROTO_RAW }, +	{ -1,		-1,		1,	protopr, +	  icmp_stats,	"icmp",		IPPROTO_ICMP }, +	{ -1,		-1,		1,	protopr, +	  igmp_stats,	"igmp",		IPPROTO_IGMP },  	{ -1,		-1,		0,	0,  	  0,		0 }  }; @@ -362,31 +343,37 @@ main(argc, argv)  	if (nlistf != NULL || memf != NULL)  		setgid(getgid()); +	/* +	 * XXX. +	 */  	kvmd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, buf); -	if (kvmd == NULL) { -		errx(1, "kvm_open: %s", buf); -	} -	if (kvm_nlist(kvmd, nl) < 0) { -		if(nlistf) -			errx(1, "%s: kvm_nlist: %s", nlistf, kvm_geterr(kvmd)); -		else -			errx(1, "kvm_nlist: %s", kvm_geterr(kvmd)); -	} +	if (kvmd != NULL) { +		if (kvm_nlist(kvmd, nl) < 0) { +			if(nlistf) +				errx(1, "%s: kvm_nlist: %s", nlistf, +				     kvm_geterr(kvmd)); +			else +				errx(1, "kvm_nlist: %s", kvm_geterr(kvmd)); +		} -	if (nl[0].n_type == 0) { -		if(nlistf) -			errx(1, "%s: no namelist", nlistf); -		else -			errx(1, "no namelist"); +		if (nl[0].n_type == 0) { +			if(nlistf) +				errx(1, "%s: no namelist", nlistf); +			else +				errx(1, "no namelist"); +		} +	} else { +		errx(1, "%s", buf);  	}  	if (mflag) { -		mbpr(nl[N_MBSTAT].n_value); +		mbpr();  		exit(0);  	}  	if (pflag) {  		if (tp->pr_stats) -			(*tp->pr_stats)(nl[tp->pr_sindex].n_value, -				tp->pr_name); +			(*tp->pr_stats)(tp->pr_usesysctl ? tp->pr_usesysctl +					: nl[tp->pr_sindex].n_value, +					tp->pr_name);  		else  			printf("%s: no stats routine\n", tp->pr_name);  		exit(0); @@ -457,7 +444,7 @@ main(argc, argv)  			printproto(tp, tp->pr_name);  #endif  	if ((af == AF_UNIX || af == AF_UNSPEC) && !sflag) -		unixpr(nl[N_UNIXSW].n_value); +		unixpr();  	exit(0);  } @@ -476,10 +463,12 @@ printproto(tp, name)  	if (sflag) {  		pr = tp->pr_stats; -		off = nl[tp->pr_sindex].n_value; +		off = tp->pr_usesysctl ? tp->pr_usesysctl  +			: nl[tp->pr_sindex].n_value;  	} else {  		pr = tp->pr_cblocks; -		off = nl[tp->pr_index].n_value; +		off = tp->pr_usesysctl ? tp->pr_usesysctl +			: nl[tp->pr_index].n_value;  	}  	if (pr != NULL && (off || af != AF_UNSPEC))  		(*pr)(off, name); @@ -494,7 +483,10 @@ kread(addr, buf, size)  	char *buf;  	int size;  { - +	if (kvmd == 0) { +		warnx("KVM is not open"); +		return -1; +	}  	if (kvm_read(kvmd, addr, buf, size) != size) {  		warnx("%s", kvm_geterr(kvmd));  		return (-1); diff --git a/usr.bin/netstat/mbuf.c b/usr.bin/netstat/mbuf.c index b0b9a4cbf871..1e6d860635bf 100644 --- a/usr.bin/netstat/mbuf.c +++ b/usr.bin/netstat/mbuf.c @@ -36,7 +36,7 @@  static char sccsid[] = "@(#)mbuf.c	8.1 (Berkeley) 6/6/93";  #endif  static const char rcsid[] = -	"$Id: mbuf.c,v 1.9 1997/11/10 08:03:36 ache Exp $"; +	"$Id: mbuf.c,v 1.10 1998/04/24 04:30:27 dg Exp $";  #endif /* not lint */  #include <sys/param.h> @@ -94,8 +94,7 @@ bool seen[256];			/* "have we seen this type yet?" */   * Print mbuf statistics.   */  void -mbpr(mbaddr) -	u_long mbaddr; +mbpr()  {  	register int totmem, totfree, totmbufs;  	register int i; diff --git a/usr.bin/netstat/netstat.h b/usr.bin/netstat/netstat.h index 30e049c21d4b..2c0c458a0ff1 100644 --- a/usr.bin/netstat/netstat.h +++ b/usr.bin/netstat/netstat.h @@ -68,7 +68,7 @@ void	icmp_stats __P((u_long, char *));  void	igmp_stats __P((u_long, char *));  void	protopr __P((u_long, char *)); -void	mbpr __P((u_long)); +void	mbpr __P((void));  void	hostpr __P((u_long, u_long));  void	impstats __P((u_long, u_long)); @@ -106,7 +106,7 @@ void	ddp_stats __P((u_long, char *));  void	intpr __P((int, u_long)); -void	unixpr __P((u_long)); +void	unixpr __P((void));  void	esis_stats __P((u_long, char *));  void	clnp_stats __P((u_long, char *)); diff --git a/usr.bin/netstat/unix.c b/usr.bin/netstat/unix.c index d31ce5f59b04..64bdb22740e2 100644 --- a/usr.bin/netstat/unix.c +++ b/usr.bin/netstat/unix.c @@ -36,13 +36,12 @@  static char sccsid[] = "@(#)unix.c	8.1 (Berkeley) 6/6/93";  #endif  static const char rcsid[] = -	"$Id: unix.c,v 1.4 1997/07/29 06:51:41 charnier Exp $"; +	"$Id: unix.c,v 1.5 1997/08/25 16:55:00 wollman Exp $";  #endif /* not lint */  /*   * Display protocol blocks in the unix domain.   */ -#include <kvm.h>  #include <sys/param.h>  #include <sys/queue.h>  #include <sys/protosw.h> @@ -52,71 +51,93 @@ static const char rcsid[] =  #include <sys/sysctl.h>  #include <sys/un.h>  #include <sys/unpcb.h> -#define KERNEL -struct uio; -struct proc; -#include <sys/file.h>  #include <netinet/in.h> +#include <errno.h>  #include <stdio.h>  #include <stdlib.h> +#include <kvm.h>  #include "netstat.h" -static	void unixdomainpr __P((struct socket *, caddr_t)); +static	void unixdomainpr __P((struct xunpcb *, struct xsocket *)); -static struct	file *file, *fileNFILE; -static int	nfiles; -extern	kvm_t *kvmd; +static	const char *const socktype[] = +    { "#0", "stream", "dgram", "raw", "rdm", "seqpacket" };  void -unixpr(off) -	u_long	off; +unixpr()  { -	register struct file *fp; -	struct socket sock, *so = &sock; -	char *filebuf; -	struct protosw *unixsw = (struct protosw *)off; +	char 	*buf; +	int	type; +	size_t	len; +	struct	xsocket *so; +	struct	xunpgen *xug, *oxug; +	struct	xunpcb *xunp; +	char mibvar[sizeof "net.local.seqpacket.pcblist"]; -	filebuf = (char *)kvm_getfiles(kvmd, KERN_FILE, 0, &nfiles); -	if (filebuf == 0) { -		printf("Out of memory (file table).\n"); -		return; -	} -	file = (struct file *)(filebuf + sizeof(fp)); -	fileNFILE = file + nfiles; -	for (fp = file; fp < fileNFILE; fp++) { -		if (fp->f_count == 0 || fp->f_type != DTYPE_SOCKET) -			continue; -		if (kread((u_long)fp->f_data, (char *)so, sizeof (*so))) +	for (type = SOCK_STREAM; type < SOCK_SEQPACKET; type++) { +		sprintf(mibvar, "net.local.%s.pcblist", socktype[type]); + +		len = 0; +		if (sysctlbyname(mibvar, 0, &len, 0, 0) < 0) { +			if (errno != ENOENT) +				warn("sysctl: %s", mibvar);  			continue; -		/* kludge */ -		if (so->so_proto >= unixsw && so->so_proto <= unixsw + 2) -			if (so->so_pcb) -				unixdomainpr(so, fp->f_data); +		} +		if ((buf = malloc(len)) == 0) { +			warn("malloc %lu bytes", (u_long)len); +			return; +		} +		if (sysctlbyname(mibvar, buf, &len, 0, 0) < 0) { +			warn("sysctl: %s", mibvar); +			free(buf); +			return; +		} + +		oxug = xug = (struct xunpgen *)buf; +		for (xug = (struct xunpgen *)((char *)xug + xug->xug_len); +		     xug->xug_len > sizeof(struct xunpgen); +		     xug = (struct xunpgen *)((char *)xug + xug->xug_len)) { +			xunp = (struct xunpcb *)xug; +			so = &xunp->xu_socket; + +			/* Ignore PCBs which were freed during copyout. */ +			if (xunp->xu_unp.unp_gencnt > oxug->xug_gen) +				continue; +			unixdomainpr(xunp, so); +		} +		if (xug != oxug && xug->xug_gen != oxug->xug_gen) { +			if (oxug->xug_count > xug->xug_count) { +				printf("Some %s sockets may have been deleted.\n", +				       socktype[type]); +			} else if (oxug->xug_count < xug->xug_count) { +				printf("Some %s sockets may have been created.\n", +			       socktype[type]); +			} else { +				printf("Some %s sockets may have been created or deleted", +			       socktype[type]); +			} +		} +		free(buf);  	}  } -static	char *socktype[] = -    { "#0", "stream", "dgram", "raw", "rdm", "seqpacket" }; -  static void -unixdomainpr(so, soaddr) -	register struct socket *so; -	caddr_t soaddr; +unixdomainpr(xunp, so) +	struct xunpcb *xunp; +	struct xsocket *so;  { -	struct unpcb unpcb, *unp = &unpcb; -	struct sockaddr_un s_un, *sa = NULL; +	struct unpcb *unp; +	struct sockaddr_un *sa;  	static int first = 1; -	if (kread((u_long)so->so_pcb, (char *)unp, sizeof (*unp))) -		return; -	if (unp->unp_addr) { -		sa = &s_un; -		if (kread((u_long)unp->unp_addr, (char *)sa, sizeof *sa)) -			sa = (struct sockaddr_un *)0; -	} else +	unp = &xunp->xu_unp; +	if (unp->unp_addr) +		sa = &xunp->xu_addr; +	else  		sa = (struct sockaddr_un *)0; +  	if (first) {  		printf("Active UNIX domain sockets\n");  		printf( @@ -125,10 +146,11 @@ unixdomainpr(so, soaddr)  		    "Inode", "Conn", "Refs", "Nextref");  		first = 0;  	} -	printf("%8x %-6.6s %6ld %6ld %8x %8x %8x %8x", -	    (int)soaddr, socktype[so->so_type], so->so_rcv.sb_cc, so->so_snd.sb_cc, -	    (int)unp->unp_vnode, (int)unp->unp_conn, -	    (int)unp->unp_refs, (int)unp->unp_nextref); +	printf("%8lx %-6.6s %6ld %6ld %8lx %8lx %8lx %8lx", +	       (long)so->so_pcb, socktype[so->so_type], so->so_rcv.sb_cc, +	       so->so_snd.sb_cc, +	       (long)unp->unp_vnode, (long)unp->unp_conn, +	       (long)unp->unp_refs.lh_first, (long)unp->unp_reflink.le_next);  	if (sa)  		printf(" %.*s", sa->sun_len, sa->sun_path);  	putchar('\n');  | 
