Date: Wed, 25 Jul 2001 12:39:52 -0700 (PDT) From: pherman@frenchfries.net To: FreeBSD-gnats-submit@freebsd.org Subject: alpha/29231: sockstat broken on alpha [patch] Message-ID: <200107251939.f6PJdqX06597@tick.sc.omation.com>
index | next in thread | raw e-mail
>Number: 29231
>Category: alpha
>Synopsis: sockstat broken on alpha [patch]
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-alpha
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed Jul 25 12:40:07 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator: Paul Herman <pherman@frenchfries.net>
>Release: FreeBSD 4.3-RELEASE alpha
>Organization:
>Environment:
System: FreeBSD tick.sc.omation.com 4.3-RELEASE FreeBSD 4.3-RELEASE #0: Tue Jun 5 12:34:59 PDT 2001 root@fw1.sc.omation.com:/usr/src/sys/compile/fw1 alpha
>Description:
sockstat prints only "?" for protocols & addresses when run on
a 64-bit OS.
>How-To-Repeat:
12:32:05{{ttyp0}pherman@arthur}~//> sockstat | head
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root xterm 32538 3 ? ? ?
root sshd 32537 3 ? ? ?
root sshd 32537 4 ? ? ?
root sshd 32537 6 ? ? ?
bind named 28544 4 ? ? ?
>Fix:
The reason is because the socket addresses printed by "netstat -A"
are 64-bit u_long on a 64-bit platform. fstat, however, prints them
as ints which are always 32-bit. A second problem is that
sockstat.pl is hardcoded to expect only 8-byte socket addresses.
The following patch for -STABLE fixes this issue:
Index: usr.bin/fstat/fstat.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/fstat/fstat.c,v
retrieving revision 1.21.2.3
diff -u -r1.21.2.3 fstat.c
--- usr.bin/fstat/fstat.c 2000/12/05 09:43:11 1.21.2.3
+++ usr.bin/fstat/fstat.c 2001/07/25 18:04:22
@@ -664,7 +664,7 @@
goto bad;
}
- printf("* pipe %8x <-> %8x", (int)pi, (int)pip.pipe_peer);
+ printf("* pipe %8lx <-> %8lx", (u_long)pi, (u_long)pip.pipe_peer);
printf(" %6d", (int)pip.pipe_buffer.cnt);
rw[0] = '\0';
if (flag & FREAD)
@@ -762,16 +762,16 @@
(void *)so.so_pcb);
goto bad;
}
- printf(" %x", (int)inpcb.inp_ppcb);
+ printf(" %lx", (u_long)inpcb.inp_ppcb);
}
}
else if (so.so_pcb)
- printf(" %x", (int)so.so_pcb);
+ printf(" %lx", (u_long)so.so_pcb);
break;
case AF_UNIX:
/* print address of pcb and connected pcb */
if (so.so_pcb) {
- printf(" %x", (int)so.so_pcb);
+ printf(" %lx", (u_long)so.so_pcb);
if (kvm_read(kd, (u_long)so.so_pcb, (char *)&unpcb,
sizeof(struct unpcb)) != sizeof(struct unpcb)){
dprintf(stderr, "can't read unpcb at %p\n",
@@ -788,14 +788,14 @@
if (!(so.so_state & SS_CANTSENDMORE))
*cp++ = '>';
*cp = '\0';
- printf(" %s %x", shoconn,
- (int)unpcb.unp_conn);
+ printf(" %s %lx", shoconn,
+ (u_long)unpcb.unp_conn);
}
}
break;
default:
/* print protocol number and socket address */
- printf(" %d %x", proto.pr_protocol, (int)sock);
+ printf(" %d %lx", proto.pr_protocol, (u_long)sock);
}
printf("\n");
return;
Index: usr.bin/sockstat/sockstat.pl
===================================================================
RCS file: /home/ncvs/src/usr.bin/sockstat/sockstat.pl,v
retrieving revision 1.6.2.4
diff -u -r1.6.2.4 sockstat.pl
--- usr.bin/sockstat/sockstat.pl 2001/03/22 13:49:51 1.6.2.4
+++ usr.bin/sockstat/sockstat.pl 2001/07/25 19:15:26
@@ -57,7 +57,7 @@
die("exec(netstat): $!\n");
}
while ($line = <PIPE>) {
- next unless ($line =~ m/^[0-9a-f]{8} /);
+ next unless ($line =~ m/^[0-9a-f]{8} /) || ($line =~ m/^[0-9a-f]{16} /);
chomp($line);
@fields = split(' ', $line);
$netstat{$fields[0]} = [ @fields ];
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-alpha" in the body of the message
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200107251939.f6PJdqX06597>
