Module Name:    src
Committed By:   msaitoh
Date:           Tue Jul 30 02:22:15 UTC 2013

Modified Files:
        src/usr.bin/netstat [netbsd-5]: inet.c inet6.c main.c netstat.h

Log Message:
Pull up following revision(s) (requested by christos in ticket #1868):
        usr.bin/netstat/main.c: revision 1.86
        usr.bin/netstat/netstat.h: revision 1.47
        usr.bin/netstat/inet.c: revision 1.102
        usr.bin/netstat/inet.c: revision 1.103
        usr.bin/netstat/inet6.c: revision 1.61
        usr.bin/netstat/inet6.c: revision 1.62
Don't use -P as a kmem printer, verify that the address points to a pcb first!
Not all pointers are 64bit - use uintptr_t instead of uint64_t.


To generate a diff of this commit:
cvs rdiff -u -r1.88.6.1 -r1.88.6.2 src/usr.bin/netstat/inet.c
cvs rdiff -u -r1.50.6.1 -r1.50.6.2 src/usr.bin/netstat/inet6.c
cvs rdiff -u -r1.70 -r1.70.4.1 src/usr.bin/netstat/main.c
cvs rdiff -u -r1.36 -r1.36.8.1 src/usr.bin/netstat/netstat.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/netstat/inet.c
diff -u src/usr.bin/netstat/inet.c:1.88.6.1 src/usr.bin/netstat/inet.c:1.88.6.2
--- src/usr.bin/netstat/inet.c:1.88.6.1	Thu Mar 26 17:14:41 2009
+++ src/usr.bin/netstat/inet.c	Tue Jul 30 02:22:14 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: inet.c,v 1.88.6.1 2009/03/26 17:14:41 snj Exp $	*/
+/*	$NetBSD: inet.c,v 1.88.6.2 2013/07/30 02:22:14 msaitoh Exp $	*/
 
 /*
  * Copyright (c) 1983, 1988, 1993
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "from: @(#)inet.c	8.4 (Berkeley) 4/20/94";
 #else
-__RCSID("$NetBSD: inet.c,v 1.88.6.1 2009/03/26 17:14:41 snj Exp $");
+__RCSID("$NetBSD: inet.c,v 1.88.6.2 2013/07/30 02:22:14 msaitoh Exp $");
 #endif
 #endif /* not lint */
 
@@ -159,122 +159,155 @@ protopr0(intptr_t ppcb, u_long rcv_sb_cc
 	putchar('\n');
 }
 
+struct kinfo_pcb *
+getpcblist_sysctl(const char *name, size_t *len) {
+        int mib[8];
+        size_t namelen = 0, size = 0;
+        char *mibname = NULL;
+        struct kinfo_pcb *pcblist;
+ 
+        memset(mib, 0, sizeof(mib));
+ 
+        if (asprintf(&mibname, "net.inet%s.%s.pcblist", name + 3, name) == -1)
+                err(1, "asprintf");
+
+        /* get dynamic pcblist node */
+        if (sysctlnametomib(mibname, mib, &namelen) == -1)
+                err(1, "sysctlnametomib: %s", mibname);
+
+        free(mibname);
+                 
+        if (sysctl(mib, __arraycount(mib), NULL, &size, NULL, 0) == -1)
+                err(1, "sysctl (query)");
+ 
+        if ((pcblist = malloc(size)) == NULL)
+                err(1, "malloc");
+        memset(pcblist, 0, size);
+        
+        mib[6] = sizeof(*pcblist);
+        mib[7] = size / sizeof(*pcblist);
+ 
+        if (sysctl(mib, __arraycount(mib), pcblist, &size, NULL, 0) == -1)
+                err(1, "sysctl (copy)");
+
+        *len = size / sizeof(*pcblist);
+        return pcblist;
+
+}
+
+static struct kinfo_pcb *
+getpcblist_kmem(u_long off, const char *name, size_t *len) {
+        struct inpcbtable table;
+        struct inpcb *head, *next, *prev;
+        struct inpcb inpcb;
+        struct tcpcb tcpcb;
+        struct socket sockb;
+        int istcp = strcmp(name, "tcp") == 0;
+        struct kinfo_pcb *pcblist;
+        size_t size = 100, i;
+        struct sockaddr_in sin;
+
+        if (off == 0) {
+                *len = 0;
+                return NULL;
+        }
+
+        kread(off, (char *)&table, sizeof table);
+        prev = head =
+            (struct inpcb *)&((struct inpcbtable *)off)->inpt_queue.cqh_first;
+        next = (struct inpcb *)table.inpt_queue.cqh_first;
+
+        if ((pcblist = malloc(size)) == NULL)
+                err(1, "malloc");
+
+        i = 0;
+        while (next != head) {
+                kread((u_long)next, (char *)&inpcb, sizeof inpcb);
+                if ((struct inpcb *)inpcb.inp_queue.cqe_prev != prev) {
+                        warnx("bad pcb");
+                        break;
+                }
+                prev = next;
+                next = (struct inpcb *)inpcb.inp_queue.cqe_next;
+
+                if (inpcb.inp_af != AF_INET)
+                        continue;
+
+                kread((u_long)inpcb.inp_socket, (char *)&sockb, sizeof(sockb));
+                if (istcp) {
+                        kread((u_long)inpcb.inp_ppcb,
+                            (char *)&tcpcb, sizeof (tcpcb));
+                }
+                pcblist[i].ki_ppcbaddr =
+                    istcp ? (uintptr_t) inpcb.inp_ppcb : (uintptr_t) prev;
+                pcblist[i].ki_rcvq = (uint64_t)sockb.so_rcv.sb_cc;
+                pcblist[i].ki_sndq = (uint64_t)sockb.so_snd.sb_cc;
+
+                sin.sin_addr = inpcb.inp_laddr;
+                sin.sin_port = inpcb.inp_lport;
+                memcpy(&pcblist[i].ki_s, &sin, sizeof(sin));
+                sin.sin_addr = inpcb.inp_faddr;
+                sin.sin_port = inpcb.inp_fport;
+                memcpy(&pcblist[i].ki_d, &sin, sizeof(sin));
+                pcblist[i].ki_tstate = tcpcb.t_state;
+                pcblist[i].ki_pflags = inpcb.inp_flags;
+                if (i++ == size) {
+                        struct kinfo_pcb *n = realloc(pcblist, size += 100);
+                        if (n == NULL)
+                                err(1, "realloc");
+                        pcblist = n;
+                }
+        }
+        *len = i;
+        return pcblist;
+}
+
 void
 protopr(u_long off, char *name)
 {
-	struct inpcbtable table;
-	struct inpcb *head, *next, *prev;
-	struct inpcb inpcb;
-	int istcp;
-	static int first = 1;
-
-	compact = 0;
-	if (Aflag) {
-		if (!numeric_addr)
-			width = 18;
-		else {
-			width = 21;
-			compact = 1;
-		}
-	} else
-		width = 22;
-
-	if (use_sysctl) {
-		struct kinfo_pcb *pcblist;
-		int mib[8];
-		size_t namelen = 0, size = 0, i;
-		char *mibname = NULL;
-
-		memset(mib, 0, sizeof(mib));
-
-		if (asprintf(&mibname, "net.inet.%s.pcblist", name) == -1)
-			err(1, "asprintf");
-
-		/* get dynamic pcblist node */
-		if (sysctlnametomib(mibname, mib, &namelen) == -1)
-			err(1, "sysctlnametomib: %s", mibname);
-
-		if (sysctl(mib, sizeof(mib) / sizeof(*mib), NULL, &size,
-			   NULL, 0) == -1)
-			err(1, "sysctl (query)");
-
-		if ((pcblist = malloc(size)) == NULL)
-			err(1, "malloc");
-		memset(pcblist, 0, size);
-
-	        mib[6] = sizeof(*pcblist);
-        	mib[7] = size / sizeof(*pcblist);
-
-		if (sysctl(mib, sizeof(mib) / sizeof(*mib), pcblist,
-			   &size, NULL, 0) == -1)
-			err(1, "sysctl (copy)");
-
-		for (i = 0; i < size / sizeof(*pcblist); i++) {
-			struct sockaddr_in src, dst;
-
-			memcpy(&src, &pcblist[i].ki_s, sizeof(src));
-			memcpy(&dst, &pcblist[i].ki_d, sizeof(dst));
-
-			if (!aflag &&
-			    inet_lnaof(dst.sin_addr) == INADDR_ANY)
-				continue;
-
-			if (first) {
-				protoprhdr();
-				first = 0;
-			}
-
-	                protopr0((intptr_t) pcblist[i].ki_ppcbaddr,
-				 pcblist[i].ki_rcvq, pcblist[i].ki_sndq,
-				 &src.sin_addr, src.sin_port,
-				 &dst.sin_addr, dst.sin_port,
-				 pcblist[i].ki_tstate, name);
-		}
-
-		free(pcblist);
-		return;
-	}
-
-	if (off == 0)
-		return;
-	istcp = strcmp(name, "tcp") == 0;
-	kread(off, (char *)&table, sizeof table);
-	prev = head =
-	    (struct inpcb *)&((struct inpcbtable *)off)->inpt_queue.cqh_first;
-	next = (struct inpcb *)table.inpt_queue.cqh_first;
-
-	while (next != head) {
-		kread((u_long)next, (char *)&inpcb, sizeof inpcb);
-		if ((struct inpcb *)inpcb.inp_queue.cqe_prev != prev) {
-			printf("???\n");
-			break;
-		}
-		prev = next;
-		next = (struct inpcb *)inpcb.inp_queue.cqe_next;
-
-		if (inpcb.inp_af != AF_INET)
-			continue;
-
-		if (!aflag &&
-		    inet_lnaof(inpcb.inp_faddr) == INADDR_ANY)
-			continue;
-		kread((u_long)inpcb.inp_socket, (char *)&sockb, sizeof (sockb));
-		if (istcp) {
-			kread((u_long)inpcb.inp_ppcb,
-			    (char *)&tcpcb, sizeof (tcpcb));
-		}
+        static int first = 1;
+        struct kinfo_pcb *pcblist;
+        size_t i, len;
+
+        compact = 0;
+        if (Aflag) {
+                if (!numeric_addr)
+                        width = 18;
+                else {
+                        width = 21;
+                        compact = 1;
+                }
+        } else
+                width = 22;
+
+        if (use_sysctl)
+                pcblist = getpcblist_sysctl(name, &len);
+        else
+                pcblist = getpcblist_kmem(off, name, &len);
+
+        for (i = 0; i < len; i++) {
+                struct sockaddr_in src, dst;
+
+                memcpy(&src, &pcblist[i].ki_s, sizeof(src));
+                memcpy(&dst, &pcblist[i].ki_d, sizeof(dst));
+
+                if (!aflag &&
+                    inet_lnaof(dst.sin_addr) == INADDR_ANY)
+                        continue;
+
+                if (first) {
+                        protoprhdr();
+                        first = 0;
+                }
+                protopr0((intptr_t) pcblist[i].ki_ppcbaddr,
+                         pcblist[i].ki_rcvq, pcblist[i].ki_sndq,
+                         &src.sin_addr, src.sin_port,
+                         &dst.sin_addr, dst.sin_port,
+                         pcblist[i].ki_tstate, name);
+        }
 
-		if (first) {
-			protoprhdr();
-			first = 0;
-		}
+        free(pcblist);
 
-		protopr0(istcp ? (intptr_t) inpcb.inp_ppcb : (intptr_t) prev,
-			 sockb.so_rcv.sb_cc, sockb.so_snd.sb_cc,
-			 &inpcb.inp_laddr, inpcb.inp_lport,
-			 &inpcb.inp_faddr, inpcb.inp_fport,
-			 tcpcb.t_state, name);
-	}
 }
 
 /*
@@ -868,11 +901,26 @@ inetname(struct in_addr *inp)
  * Dump the contents of a TCP PCB.
  */
 void
-tcp_dump(u_long pcbaddr)
+tcp_dump(u_long off, const char *name, u_long pcbaddr)
 {
 	callout_impl_t *ci;
 	struct tcpcb tcpcb;
 	int i, hardticks;
+	struct kinfo_pcb *pcblist;
+	size_t j, len;
+
+	if (use_sysctl)
+		pcblist = getpcblist_sysctl(name, &len);	
+	else
+		pcblist = getpcblist_kmem(off, name, &len);	
+
+	for (j = 0; j < len; j++)
+		if (pcblist[j].ki_ppcbaddr == pcbaddr)
+			break;
+	free(pcblist);
+
+	if (j == len)
+		errx(1, "0x%lx is not a valid pcb address", pcbaddr);
 
 	kread(pcbaddr, (char *)&tcpcb, sizeof(tcpcb));
 	hardticks = get_hardticks();

Index: src/usr.bin/netstat/inet6.c
diff -u src/usr.bin/netstat/inet6.c:1.50.6.1 src/usr.bin/netstat/inet6.c:1.50.6.2
--- src/usr.bin/netstat/inet6.c:1.50.6.1	Thu Mar 26 17:14:41 2009
+++ src/usr.bin/netstat/inet6.c	Tue Jul 30 02:22:14 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: inet6.c,v 1.50.6.1 2009/03/26 17:14:41 snj Exp $	*/
+/*	$NetBSD: inet6.c,v 1.50.6.2 2013/07/30 02:22:14 msaitoh Exp $	*/
 /*	BSDI inet.c,v 2.3 1995/10/24 02:19:29 prb Exp	*/
 
 /*
@@ -64,7 +64,7 @@
 #if 0
 static char sccsid[] = "@(#)inet.c	8.4 (Berkeley) 4/20/94";
 #else
-__RCSID("$NetBSD: inet6.c,v 1.50.6.1 2009/03/26 17:14:41 snj Exp $");
+__RCSID("$NetBSD: inet6.c,v 1.50.6.2 2013/07/30 02:22:14 msaitoh Exp $");
 #endif
 #endif /* not lint */
 
@@ -214,128 +214,120 @@ ip6protopr0(intptr_t ppcb, u_long rcv_sb
 }
 
 
-void
-ip6protopr(u_long off, char *name)
-{
-	struct inpcbtable table;
-	struct in6pcb *head, *prev, *next;
-	int istcp;
-	static int first = 1;
-
-	compact = 0;
-	if (Aflag) {
-		if (!numeric_addr)
-			width = 18;
-		else {
-			width = 21;
-			compact = 1;
-		}
-	} else
-		width = 22;
-
-	if (use_sysctl) {
-		struct kinfo_pcb *pcblist;
-		int mib[8];
-		size_t namelen = 0, size = 0, i;
-		char *mibname = NULL;
-
-		memset(mib, 0, sizeof(mib));
-
-		if (asprintf(&mibname, "net.inet6.%s.pcblist", name) == -1)
-			err(1, "asprintf");
-
-		/* get dynamic pcblist node */
-		if (sysctlnametomib(mibname, mib, &namelen) == -1) {
-			if (errno == ENOENT)
-				return;
-
-			err(1, "sysctlnametomib: %s", mibname);
-		}
-
-		if (sysctl(mib, sizeof(mib) / sizeof(*mib), NULL, &size,
-		    NULL, 0) == -1)
-			err(1, "sysctl (query)");
-		
-		if ((pcblist = malloc(size)) == NULL)
-			err(1, "malloc");
-		memset(pcblist, 0, size);
-
-		mib[6] = sizeof(*pcblist);
-		mib[7] = size / sizeof(*pcblist);
-
-		if (sysctl(mib, sizeof(mib) / sizeof(*mib), pcblist,
-		    &size, NULL, 0) == -1)
-			err(1, "sysctl (copy)");
-
-		for (i = 0; i < size / sizeof(*pcblist); i++) {
-			struct sockaddr_in6 src, dst;
-
-			memcpy(&src, &pcblist[i].ki_s, sizeof(src));
-			memcpy(&dst, &pcblist[i].ki_d, sizeof(dst));
-
-			if (!aflag && IN6_IS_ADDR_UNSPECIFIED(&dst.sin6_addr))
-				continue;
-
-			if (first) {
-				ip6protoprhdr();
-				first = 0;
-			}
-
-			ip6protopr0((intptr_t) pcblist[i].ki_ppcbaddr,
-			    pcblist[i].ki_rcvq, pcblist[i].ki_sndq,
-			    &src.sin6_addr, src.sin6_port,
-			    &dst.sin6_addr, dst.sin6_port,
-			    pcblist[i].ki_tstate, name);
-		}
+static struct kinfo_pcb *
+getpcblist_kmem(u_long off, const char *name, size_t *len) {
 
-		free(pcblist);
-		return;
-	}
-
-	if (off == 0)
-		return;
-	istcp = strcmp(name, "tcp6") == 0;
-	kread(off, (char *)&table, sizeof (table));
-	head = prev =
-	    (struct in6pcb *)&((struct inpcbtable *)off)->inpt_queue.cqh_first;
-	next = (struct in6pcb *)table.inpt_queue.cqh_first;
-
-	while (next != head) {
-		kread((u_long)next, (char *)&in6pcb, sizeof in6pcb);
-		if ((struct in6pcb *)in6pcb.in6p_queue.cqe_prev != prev) {
-			printf("???\n");
-			break;
-		}
-		prev = next;
-		next = (struct in6pcb *)in6pcb.in6p_queue.cqe_next;
-
-		if (in6pcb.in6p_af != AF_INET6)
-			continue;
-
-		if (!aflag && IN6_IS_ADDR_UNSPECIFIED(&in6pcb.in6p_faddr))
-			continue;
-		kread((u_long)in6pcb.in6p_socket, (char *)&sockb, 
-		    sizeof (sockb));
-		if (istcp) {
+        struct inpcbtable table;
+        struct in6pcb *head, *prev, *next;
+        int istcp = strcmp(name, "tcp6") == 0;
+        struct kinfo_pcb *pcblist;
+        size_t size = 100, i;
+        struct sockaddr_in6 sin6;
+
+        if (off == 0) {
+                *len = 0;
+                return NULL;
+        }
+        kread(off, (char *)&table, sizeof (table));
+        head = prev =
+            (struct in6pcb *)&((struct inpcbtable *)off)->inpt_queue.cqh_first;
+        next = (struct in6pcb *)table.inpt_queue.cqh_first;
+
+        if ((pcblist = malloc(size)) == NULL)
+                err(1, "malloc");
+
+        i = 0;
+        while (next != head) {
+                kread((u_long)next, (char *)&in6pcb, sizeof in6pcb);
+                if ((struct in6pcb *)in6pcb.in6p_queue.cqe_prev != prev) {
+                        warnx("bad pcb");
+                        break;
+                }
+                prev = next;
+                next = (struct in6pcb *)in6pcb.in6p_queue.cqe_next;
+
+                if (in6pcb.in6p_af != AF_INET6)
+                        continue;
+
+                kread((u_long)in6pcb.in6p_socket, (char *)&sockb,
+                    sizeof (sockb));
+                if (istcp) {
 #ifdef TCP6
-			kread((u_long)in6pcb.in6p_ppcb,
-			    (char *)&tcp6cb, sizeof (tcp6cb));
+                        kread((u_long)in6pcb.in6p_ppcb,
+                            (char *)&tcp6cb, sizeof (tcp6cb));
 #else
-			kread((u_long)in6pcb.in6p_ppcb,
-			    (char *)&tcpcb, sizeof (tcpcb));
+                        kread((u_long)in6pcb.in6p_ppcb,
+                            (char *)&tcpcb, sizeof (tcpcb));
 #endif
-		}
-		if (first) {
-			ip6protoprhdr();
-			first = 0;
-		}
-		ip6protopr0(istcp ? (intptr_t) in6pcb.in6p_ppcb : 
-		    (intptr_t) prev, sockb.so_rcv.sb_cc, sockb.so_snd.sb_cc,
-		    &in6pcb.in6p_laddr, in6pcb.in6p_lport,
-		    &in6pcb.in6p_faddr, in6pcb.in6p_fport,
-		    tcpcb.t_state, name);
-		
-	}
+                }
+                pcblist[i].ki_ppcbaddr =
+                    istcp ? (uintptr_t) in6pcb.in6p_ppcb : (uintptr_t) prev;
+                pcblist[i].ki_rcvq = (uint64_t)sockb.so_rcv.sb_cc;
+                pcblist[i].ki_sndq = (uint64_t)sockb.so_snd.sb_cc;
+                sin6.sin6_addr = in6pcb.in6p_laddr;
+                sin6.sin6_port = in6pcb.in6p_lport;
+                memcpy(&pcblist[i].ki_s, &sin6, sizeof(sin6));
+                sin6.sin6_addr = in6pcb.in6p_faddr;
+                sin6.sin6_port = in6pcb.in6p_fport;
+                memcpy(&pcblist[i].ki_d, &sin6, sizeof(sin6));
+                pcblist[i].ki_tstate = tcpcb.t_state;
+                if (i++ == size) {
+                        struct kinfo_pcb *n = realloc(pcblist, size += 100);
+                        if (n == NULL)
+                                err(1, "realloc");
+                        pcblist = n;
+                }
+        }
+        *len = i;
+        return pcblist;  
+}
+
+void    
+ip6protopr(u_long off, char *name)
+{
+        struct kinfo_pcb *pcblist;
+        size_t i, len;
+        static int first = 1;
+
+        compact = 0;
+        if (Aflag) {
+                if (!numeric_addr)
+                        width = 18; 
+                else {
+                        width = 21;
+                        compact = 1;
+                }
+        } else  
+                width = 22;
+
+        if (use_sysctl)
+                pcblist = getpcblist_sysctl(name, &len);
+        else
+                pcblist = getpcblist_kmem(off, name, &len);
+                    
+        for (i = 0; i < len; i++) {
+                struct sockaddr_in6 src, dst;
+
+                memcpy(&src, &pcblist[i].ki_s, sizeof(src));  
+                memcpy(&dst, &pcblist[i].ki_d, sizeof(dst));
+
+                if (!aflag && IN6_IS_ADDR_UNSPECIFIED(&dst.sin6_addr))
+                        continue;
+
+                if (first) {
+                        ip6protoprhdr();
+                        first = 0; 
+                }
+
+                ip6protopr0((intptr_t) pcblist[i].ki_ppcbaddr,
+                    pcblist[i].ki_rcvq, pcblist[i].ki_sndq,
+                    &src.sin6_addr, src.sin6_port,
+                    &dst.sin6_addr, dst.sin6_port,
+                    pcblist[i].ki_tstate, name);
+        }
+
+        free(pcblist);
+
 }
 
 #ifdef TCP6
@@ -1385,6 +1377,21 @@ tcp6_dump(u_long pcbaddr)
 {
 	struct tcp6cb tcp6cb;
 	int i;
+	struct kinfo_pcb *pcblist;
+	size_t j, len;
+
+	if (use_sysctl)
+		pcblist = getpcblist_sysctl(name, &len);	
+	else
+		pcblist = getpcblist_kmem(off, name, &len);	
+
+	for (j = 0; j < len; j++)
+		if (pcblist[j].ki_ppcbaddr == pcbaddr)
+			break;
+	free(pcblist);
+
+	if (j == len)
+		errx(1, "0x%lx is not a valid pcb address", pcbaddr);
 
 	kread(pcbaddr, (char *)&tcp6cb, sizeof(tcp6cb));
 

Index: src/usr.bin/netstat/main.c
diff -u src/usr.bin/netstat/main.c:1.70 src/usr.bin/netstat/main.c:1.70.4.1
--- src/usr.bin/netstat/main.c:1.70	Mon Jul 21 14:19:24 2008
+++ src/usr.bin/netstat/main.c	Tue Jul 30 02:22:14 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.70 2008/07/21 14:19:24 lukem Exp $	*/
+/*	$NetBSD: main.c,v 1.70.4.1 2013/07/30 02:22:14 msaitoh Exp $	*/
 
 /*
  * Copyright (c) 1983, 1988, 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1983, 19
 #if 0
 static char sccsid[] = "from: @(#)main.c	8.4 (Berkeley) 3/1/94";
 #else
-__RCSID("$NetBSD: main.c,v 1.70 2008/07/21 14:19:24 lukem Exp $");
+__RCSID("$NetBSD: main.c,v 1.70.4.1 2013/07/30 02:22:14 msaitoh Exp $");
 #endif
 #endif /* not lint */
 
@@ -212,7 +212,7 @@ struct protox {
 	void	(*pr_istats)
 			__P((char *));	/* per/if statistics printing routine */
 	void	(*pr_dump)		/* PCB state dump routine */
-			__P((u_long));
+			__P((u_long, const char *, u_long));
 	char	*pr_name;		/* well-known name */
 } protox[] = {
 	{ N_TCBTABLE,	N_TCPSTAT,	1,	protopr,
@@ -568,7 +568,8 @@ main(argc, argv)
 			tp = name2protox("tcp");
 		}
 		if (tp->pr_dump)
-			(*tp->pr_dump)(pcbaddr);
+			(*tp->pr_dump)(nl[tp->pr_index].n_value, tp->pr_name,
+			    pcbaddr);
 		else
 			printf("%s: no PCB dump routine\n", tp->pr_name);
 		exit(0);

Index: src/usr.bin/netstat/netstat.h
diff -u src/usr.bin/netstat/netstat.h:1.36 src/usr.bin/netstat/netstat.h:1.36.8.1
--- src/usr.bin/netstat/netstat.h:1.36	Wed Feb 27 16:36:54 2008
+++ src/usr.bin/netstat/netstat.h	Tue Jul 30 02:22:14 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: netstat.h,v 1.36 2008/02/27 16:36:54 ad Exp $	*/
+/*	$NetBSD: netstat.h,v 1.36.8.1 2013/07/30 02:22:14 msaitoh Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -71,7 +71,7 @@ int	get_hardticks __P((void));
 
 void	protopr __P((u_long, char *));
 void	tcp_stats __P((u_long, char *));
-void	tcp_dump __P((u_long));
+void	tcp_dump __P((u_long, const char *, u_long));
 void	udp_stats __P((u_long, char *));
 void	ip_stats __P((u_long, char *));
 void	icmp_stats __P((u_long, char *));
@@ -161,6 +161,8 @@ void	iso_protopr __P((u_long, char *));
 void	iso_protopr1 __P((u_long, int));
 void	tp_protopr __P((u_long, char *));
 void	tp_inproto __P((u_long));
+struct kinfo_pcb *getpcblist_sysctl(const char *, size_t *);
+
 void	tp_stats __P((u_long, char *));
 
 void	mroutepr __P((u_long, u_long, u_long, u_long));

Reply via email to