Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/systat support IPv6. commands under "netstat" are I...
details: https://anonhg.NetBSD.org/src/rev/a31c0d45a36d
branches: trunk
changeset: 480146:a31c0d45a36d
user: itojun <itojun%NetBSD.org@localhost>
date: Wed Jan 05 11:59:12 2000 +0000
description:
support IPv6. commands under "netstat" are IPv6 ready.
IPv6 is supported by filters (":ignore ssh") as well.
TODO: do something about line truncation?
TODO: inet6.icmp6? ":help" will not fit into single line...
diffstat:
usr.bin/systat/Makefile | 4 +-
usr.bin/systat/extern.h | 9 +-
usr.bin/systat/netcmds.c | 139 +++++++++++++++++++++++-----
usr.bin/systat/netstat.c | 226 +++++++++++++++++++++++++++++++++++++++++++++-
4 files changed, 345 insertions(+), 33 deletions(-)
diffs (truncated from 630 to 300 lines):
diff -r e77c0e7ca3db -r a31c0d45a36d usr.bin/systat/Makefile
--- a/usr.bin/systat/Makefile Wed Jan 05 11:50:21 2000 +0000
+++ b/usr.bin/systat/Makefile Wed Jan 05 11:59:12 2000 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.20 1999/12/16 04:02:22 jwise Exp $
+# $NetBSD: Makefile,v 1.21 2000/01/05 11:59:12 itojun Exp $
# @(#)Makefile 8.1 (Berkeley) 6/6/93
PROG= systat
@@ -17,4 +17,6 @@
LINKS= ${BINDIR}/systat ${BINDIR}/sysstat
MLINKS+=systat.1 sysstat.1
+CPPFLAGS+=-DINET6
+
.include <bsd.prog.mk>
diff -r e77c0e7ca3db -r a31c0d45a36d usr.bin/systat/extern.h
--- a/usr.bin/systat/extern.h Wed Jan 05 11:50:21 2000 +0000
+++ b/usr.bin/systat/extern.h Wed Jan 05 11:59:12 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: extern.h,v 1.18 1999/12/25 01:49:25 jwise Exp $ */
+/* $NetBSD: extern.h,v 1.19 2000/01/05 11:59:12 itojun Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -61,9 +61,16 @@
extern int verbose;
struct inpcb;
+#ifdef INET6
+struct in6pcb;
+#endif
int checkhost __P((struct inpcb *));
int checkport __P((struct inpcb *));
+#ifdef INET6
+int checkhost6 __P((struct in6pcb *));
+int checkport6 __P((struct in6pcb *));
+#endif
void closebufcache __P((WINDOW *));
void closeicmp __P ((WINDOW *));
void closeiostat __P((WINDOW *));
diff -r e77c0e7ca3db -r a31c0d45a36d usr.bin/systat/netcmds.c
--- a/usr.bin/systat/netcmds.c Wed Jan 05 11:50:21 2000 +0000
+++ b/usr.bin/systat/netcmds.c Wed Jan 05 11:59:12 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: netcmds.c,v 1.13 2000/01/05 11:48:21 itojun Exp $ */
+/* $NetBSD: netcmds.c,v 1.14 2000/01/05 11:59:12 itojun Exp $ */
/*-
* Copyright (c) 1980, 1992, 1993
@@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)netcmds.c 8.1 (Berkeley) 6/6/93";
#endif
-__RCSID("$NetBSD: netcmds.c,v 1.13 2000/01/05 11:48:21 itojun Exp $");
+__RCSID("$NetBSD: netcmds.c,v 1.14 2000/01/05 11:59:12 itojun Exp $");
#endif /* not lint */
/*
@@ -54,6 +54,10 @@
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/in_pcb.h>
+#ifdef INET6
+#include <netinet/ip6.h>
+#include <netinet6/in6_pcb.h>
+#endif
#include <arpa/inet.h>
@@ -67,7 +71,7 @@
#define streq(a,b) (strcmp(a,b)==0)
static struct hitem {
- struct in_addr addr;
+ struct sockaddr_storage addr;
int onoff;
} *hosts = NULL;
@@ -78,7 +82,8 @@
static void showprotos __P((void));
static int selectport __P((long, int));
static void showports __P((void));
-static int selecthost __P((struct in_addr *, int));
+static int addrcmp __P((struct sockaddr *, struct sockaddr *));
+static int selecthost __P((struct sockaddr *, int));
static void showhosts __P((void));
/* please note: there are also some netstat commands in netstat.c */
@@ -148,8 +153,7 @@
{
char *cp;
struct servent *sp;
- struct hostent *hp;
- struct in_addr in;
+ struct addrinfo hints, *res, *res0;
cp = strchr(args, '\n');
if (cp)
@@ -170,15 +174,17 @@
selectport(sp->s_port, onoff);
continue;
}
- if (inet_aton(args, &in) == 0) {
- hp = gethostbyname(args);
- if (hp == 0) {
- error("%s: unknown host or port", args);
- continue;
- }
- memcpy(&in, hp->h_addr, hp->h_length);
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ if (getaddrinfo(args, "0", &hints, &res0) != 0) {
+ error("%s: unknown host or port", args);
+ continue;
}
- selecthost(&in, onoff);
+ for (res = res0; res; res = res->ai_next)
+ selecthost(res->ai_addr, onoff);
+ freeaddrinfo(res0);
}
}
@@ -257,6 +263,21 @@
return (1);
}
+#ifdef INET6
+int
+checkport6(in6p)
+ struct in6pcb *in6p;
+{
+ struct pitem *p;
+
+ if (ports)
+ for (p = ports; p < ports+nports; p++)
+ if (p->port == in6p->in6p_lport || p->port == in6p->in6p_fport)
+ return (p->onoff);
+ return (1);
+}
+#endif
+
static void
showports()
{
@@ -276,13 +297,43 @@
}
static int
-selecthost(in, onoff)
- struct in_addr *in;
+addrcmp(sa1, sa2)
+ struct sockaddr *sa1;
+ struct sockaddr *sa2;
+{
+ if (sa1->sa_family != sa2->sa_family)
+ return 0;
+ if (sa1->sa_len != sa2->sa_len)
+ return 0;
+ switch (sa1->sa_family) {
+ case AF_INET:
+ if (((struct sockaddr_in *)sa1)->sin_addr.s_addr ==
+ ((struct sockaddr_in *)sa2)->sin_addr.s_addr)
+ return 1;
+ break;
+#ifdef INET6
+ case AF_INET6:
+ if (IN6_ARE_ADDR_EQUAL(&((struct sockaddr_in6 *)sa1)->sin6_addr,
+ &((struct sockaddr_in6 *)sa2)->sin6_addr))
+ return 1;
+ break;
+#endif
+ default:
+ if (memcmp(sa1, sa2, sa1->sa_len) == 0)
+ return 1;
+ break;
+ }
+ return 0;
+}
+
+static int
+selecthost(sa, onoff)
+ struct sockaddr *sa;
int onoff;
{
struct hitem *p;
- if (in == 0) {
+ if (sa == 0) {
if (hosts == 0)
return (0);
free((char *)hosts), hosts = 0;
@@ -290,10 +341,12 @@
return (1);
}
for (p = hosts; p < hosts+nhosts; p++)
- if (p->addr.s_addr == in->s_addr) {
+ if (addrcmp((struct sockaddr *)&p->addr, sa)) {
p->onoff = onoff;
return (0);
}
+ if (sa->sa_len > sizeof(struct sockaddr_storage))
+ return (-1); /*XXX*/
p = (struct hitem *)realloc(hosts, (nhosts+1)*sizeof (*p));
if (p == NULL) {
error("malloc failed");
@@ -301,7 +354,7 @@
}
hosts = p;
p = &hosts[nhosts++];
- p->addr = *in;
+ memcpy(&p->addr, sa, sa->sa_len);
p->onoff = onoff;
return (1);
}
@@ -311,25 +364,61 @@
struct inpcb *inp;
{
struct hitem *p;
+ struct sockaddr_in *sin;
if (hosts)
- for (p = hosts; p < hosts+nhosts; p++)
- if (p->addr.s_addr == inp->inp_laddr.s_addr ||
- p->addr.s_addr == inp->inp_faddr.s_addr)
+ for (p = hosts; p < hosts+nhosts; p++) {
+ if (((struct sockaddr *)&p->addr)->sa_family != AF_INET)
+ continue;
+ sin = (struct sockaddr_in *)&p->addr;
+ if (sin->sin_addr.s_addr == inp->inp_laddr.s_addr ||
+ sin->sin_addr.s_addr == inp->inp_faddr.s_addr)
return (p->onoff);
+ }
return (1);
}
+#ifdef INET6
+int
+checkhost6(in6p)
+ struct in6pcb *in6p;
+{
+ struct hitem *p;
+ struct sockaddr_in6 *sin6;
+
+ if (hosts)
+ for (p = hosts; p < hosts+nhosts; p++) {
+ if (((struct sockaddr *)&p->addr)->sa_family != AF_INET6)
+ continue;
+ sin6 = (struct sockaddr_in6 *)&p->addr;
+ if (IN6_ARE_ADDR_EQUAL(&sin6->sin6_addr, &in6p->in6p_laddr) ||
+ IN6_ARE_ADDR_EQUAL(&sin6->sin6_addr, &in6p->in6p_faddr))
+ return (p->onoff);
+ }
+ return (1);
+}
+#endif
+
static void
showhosts()
{
struct hitem *p;
- struct hostent *hp;
+ char hbuf[NI_MAXHOST];
+ struct sockaddr *sa;
+ int flags;
+#if 0
+ flags = nflag ? NI_NUMERICHOST : 0;
+#else
+ flags = 0;
+#endif
for (p = hosts; p < hosts+nhosts; p++) {
- hp = gethostbyaddr((char *)&p->addr, sizeof (p->addr), AF_INET);
+ sa = (struct sockaddr *)&p->addr;
+ if (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), NULL, 0,
+ flags) != 0)
+ strcpy(hbuf, "(invalid)");
if (!p->onoff)
addch('!');
- printw("%s ", hp ? hp->h_name : inet_ntoa(p->addr));
+ printw("%s ", hbuf);
}
}
diff -r e77c0e7ca3db -r a31c0d45a36d usr.bin/systat/netstat.c
--- a/usr.bin/systat/netstat.c Wed Jan 05 11:50:21 2000 +0000
+++ b/usr.bin/systat/netstat.c Wed Jan 05 11:59:12 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: netstat.c,v 1.14 2000/01/05 11:50:21 itojun Exp $ */
+/* $NetBSD: netstat.c,v 1.15 2000/01/05 11:59:12 itojun Exp $ */
/*-
* Copyright (c) 1980, 1992, 1993
@@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)netstat.c 8.1 (Berkeley) 6/6/93";
#endif
-__RCSID("$NetBSD: netstat.c,v 1.14 2000/01/05 11:50:21 itojun Exp $");
Home |
Main Index |
Thread Index |
Old Index