2 * netstat This file contains an implementation of the command
3 * that helps in debugging the networking modules.
5 * NET-TOOLS A collection of programs that form the base set of the
6 * NET-3 Networking Distribution for the LINUX operating
9 * Version: $Id: netstat.c,v 1.32 2000/02/20 17:50:01 philip Exp $
11 * Authors: Fred Baumgarten, <dc6iq@insu1.etec.uni-karlsruhe.de>
12 * Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
13 * Phil Packer, <pep@wicked.demon.co.uk>
14 * Johannes Stille, <johannes@titan.os.open.de>
15 * Bernd Eckenfels, <net-tools@lina.inka.de>
16 * Phil Blundell <philb@gnu.org>
17 * Tuan Hoang <tqhoang@bigfoot.com>
20 * Alan Cox, <A.Cox@swansea.ac.uk>
21 * Copyright (c) 1993 Fred Baumgarten
25 *960116 {1.01} Bernd Eckenfels: verbose, cleanups
26 *960204 {1.10} Bernd Eckenfels: aftrans, usage, new route_info,
28 *960204 {1.11} Bernd Eckenfels: netlink support
29 *960204 {1.12} Bernd Eckenfels: route_init()
30 *960215 {1.13} Bernd Eckenfels: netlink_print honors HAVE_
31 *960217 {1.14} Bernd Eckenfels: masq_info from Jos Vos and
32 * ax25_info from Jonathan Naylor.
33 *960218 {1.15} Bernd Eckenfels: ipx_info rewritten, -e for tcp/ipx
34 *960220 {1.16} Bernd Eckenfels: minor output reformats, -a for -x
35 *960221 {1.17} Bernd Eckenfels: route_init->getroute_init
36 *960426 {1.18} Bernd Eckenfels: new RTACTION, SYM/NUM, FIB/CACHE
37 *960517 {1.19} Bernd Eckenfels: usage() spelling fix and --unix inode,
38 * ':' is part of sock_addr for --inet
39 *960822 {x.xx} Frank Strauss: INET6 support
41 *970406 {1.33} Philip Copeland Added snmp reporting support module -s
42 * code provided by Andi Kleen
43 * (relly needs to be kernel hooked but
44 * this will do in the meantime)
45 * minor header file misplacement tidy up.
46 *980411 {1.34} Arnaldo Carvalho i18n: catgets -> gnu gettext, substitution
47 * of sprintf for snprintf
48 *10/1998 Andi Kleen Use new interface primitives.
49 *990101 {1.36} Bernd Eckenfels usage updated to include -s and -C -F,
50 * fixed netstat -rC output (lib/inet_gr.c)
51 * removed broken NETLINK Support
52 * fixed format for /proc/net/udp|tcp|raw
53 * added -w,-t,-u TcpExt support to -s
54 *990131 {1.37} Jan Kratochvil added -p for prg_cache() & friends
55 * Flames to <short@ucw.cz>.
56 * Tuan Hoang added IGMP support for IPv4 and IPv6
58 *990420 {1.38} Tuan Hoang removed a useless assignment from igmp_do_one()
60 * This program is free software; you can redistribute it
61 * and/or modify it under the terms of the GNU General
62 * Public License as published by the Free Software
63 * Foundation; either version 2 of the License, or (at
64 * your option) any later version.
79 #include <sys/param.h>
80 #include <sys/socket.h>
81 #include <netinet/in.h>
82 #include <sys/ioctl.h>
86 #include "net-support.h"
87 #include "pathnames.h"
92 #include "interface.h"
95 #define PROGNAME_WIDTH 20
97 #if !defined(s6_addr32) && defined(in6a_words)
98 #define s6_addr32 in6a_words /* libinet6 */
101 /* prototypes for statistics.c */
102 void parsesnmp(int, int, int);
106 SS_FREE
= 0, /* not allocated */
107 SS_UNCONNECTED
, /* unconnected to any socket */
108 SS_CONNECTING
, /* in process of connecting */
109 SS_CONNECTED
, /* connected to socket */
110 SS_DISCONNECTING
/* in process of disconnecting */
113 #define SO_ACCEPTCON (1<<16) /* performed a listen */
114 #define SO_WAITDATA (1<<17) /* wait data to read */
115 #define SO_NOSPACE (1<<18) /* no space to write */
117 #define DFLT_AF "inet"
119 #define FEATURE_NETSTAT
120 #include "lib/net-features.h"
122 char *Release
= RELEASE
, *Version
= "netstat 1.38 (1999-04-20)", *Signature
= "Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang and others";
152 #define INFO_GUTS1(file,name,proc) \
153 procinfo = fopen((file), "r"); \
154 if (procinfo == NULL) { \
155 if (errno != ENOENT) { \
159 if (flag_arg || flag_ver) \
160 ESYSNOT("netstat", (name)); \
165 if (fgets(buffer, sizeof(buffer), procinfo)) \
166 (proc)(lnr++, buffer); \
167 } while (!feof(procinfo)); \
172 #define INFO_GUTS2(file,proc) \
174 procinfo = fopen((file), "r"); \
175 if (procinfo != NULL) { \
177 if (fgets(buffer, sizeof(buffer), procinfo)) \
178 (proc)(lnr++, buffer); \
179 } while (!feof(procinfo)); \
183 #define INFO_GUTS2(file,proc)
189 #define INFO_GUTS6(file,file6,name,proc) \
193 if (!flag_arg || flag_inet) { \
194 INFO_GUTS1(file,name,proc) \
196 if (!flag_arg || flag_inet6) { \
197 INFO_GUTS2(file6,proc) \
201 #define INFO_GUTS(file,name,proc) \
205 INFO_GUTS1(file,name,proc) \
208 #define PROGNAME_WIDTHs PROGNAME_WIDTH1(PROGNAME_WIDTH)
209 #define PROGNAME_WIDTH1(s) PROGNAME_WIDTH2(s)
210 #define PROGNAME_WIDTH2(s) #s
212 #define PRG_HASH_SIZE 211
214 static struct prg_node
{
215 struct prg_node
*next
;
217 char name
[PROGNAME_WIDTH
];
218 } *prg_hash
[PRG_HASH_SIZE
];
220 static char prg_cache_loaded
= 0;
222 #define PRG_HASHIT(x) ((x) % PRG_HASH_SIZE)
224 #define PROGNAME_BANNER "PID/Program name"
226 #define print_progname_banner() do { if (flag_prg) printf("%-" PROGNAME_WIDTHs "s"," " PROGNAME_BANNER); } while (0)
228 #define PRG_LOCAL_ADDRESS "local_address"
229 #define PRG_INODE "inode"
230 #define PRG_SOCKET_PFX "socket:["
231 #define PRG_SOCKET_PFXl (strlen(PRG_SOCKET_PFX))
234 #define LINE_MAX 4096
237 #define PATH_PROC "/proc"
238 #define PATH_FD_SUFF "fd"
239 #define PATH_FD_SUFFl strlen(PATH_FD_SUFF)
240 #define PATH_PROC_X_FD PATH_PROC "/%s/" PATH_FD_SUFF
241 #define PATH_CMDLINE "cmdline"
242 #define PATH_CMDLINEl strlen(PATH_CMDLINE)
243 /* NOT working as of glibc-2.0.7: */
244 #undef DIRENT_HAVE_D_TYPE_WORKS
246 static void prg_cache_add(int inode
, char *name
)
248 unsigned hi
= PRG_HASHIT(inode
);
249 struct prg_node
**pnp
,*pn
;
252 for (pnp
=prg_hash
+hi
;(pn
=*pnp
);pnp
=&pn
->next
) {
253 if (pn
->inode
==inode
) {
254 /* Some warning should be appropriate here
255 as we got multiple processes for one i-node */
259 if (!(*pnp
=malloc(sizeof(**pnp
))))
264 if (strlen(name
)>sizeof(pn
->name
)-1)
265 name
[sizeof(pn
->name
)-1]='\0';
266 strcpy(pn
->name
,name
);
269 static const char *prg_cache_get(int inode
)
271 unsigned hi
=PRG_HASHIT(inode
);
274 for (pn
=prg_hash
[hi
];pn
;pn
=pn
->next
)
275 if (pn
->inode
==inode
) return(pn
->name
);
279 static void prg_cache_clear(void)
281 struct prg_node
**pnp
,*pn
;
283 if (prg_cache_loaded
== 2)
284 for (pnp
=prg_hash
;pnp
<prg_hash
+PRG_HASH_SIZE
;pnp
++)
292 static void prg_cache_load(void)
294 char line
[LINE_MAX
],*serr
,eacces
=0;
295 int procfdlen
,fd
,cmdllen
,lnamelen
;
296 char lname
[30],cmdlbuf
[512],finbuf
[PROGNAME_WIDTH
];
298 const char *cs
,*cmdlp
;
299 DIR *dirproc
=NULL
,*dirfd
=NULL
;
300 struct dirent
*direproc
,*direfd
;
302 if (prg_cache_loaded
|| !flag_prg
) return;
304 cmdlbuf
[sizeof(cmdlbuf
)-1]='\0';
305 if (!(dirproc
=opendir(PATH_PROC
))) goto fail
;
306 while (errno
=0,direproc
=readdir(dirproc
)) {
307 #ifdef DIRENT_HAVE_D_TYPE_WORKS
308 if (direproc
->d_type
!=DT_DIR
) continue;
310 for (cs
=direproc
->d_name
;*cs
;cs
++)
315 procfdlen
=snprintf(line
,sizeof(line
),PATH_PROC_X_FD
,direproc
->d_name
);
316 if (procfdlen
<=0 || procfdlen
>=sizeof(line
)-5)
325 line
[procfdlen
] = '/';
327 while ((direfd
= readdir(dirfd
))) {
328 #ifdef DIRENT_HAVE_D_TYPE_WORKS
329 if (direfd
->d_type
!=DT_LNK
)
332 if (procfdlen
+1+strlen(direfd
->d_name
)+1>sizeof(line
))
334 memcpy(line
+ procfdlen
- PATH_FD_SUFFl
, PATH_FD_SUFF
"/",
336 strcpy(line
+ procfdlen
+ 1, direfd
->d_name
);
337 lnamelen
=readlink(line
,lname
,sizeof(lname
));
338 if (lnamelen
< strlen(PRG_SOCKET_PFX
+2))
340 if (memcmp(lname
, PRG_SOCKET_PFX
, PRG_SOCKET_PFXl
)
341 || lname
[lnamelen
-1]!=']')
343 lname
[lnamelen
-1]='\0';
344 inode
= strtol(lname
+PRG_SOCKET_PFXl
,&serr
,0);
345 if (!serr
|| *serr
|| inode
< 0 || inode
>= INT_MAX
)
349 if (procfdlen
- PATH_FD_SUFFl
+ PATH_CMDLINEl
>=
352 strcpy(line
+ procfdlen
-PATH_FD_SUFFl
, PATH_CMDLINE
);
353 fd
= open(line
, O_RDONLY
);
356 cmdllen
= read(fd
, cmdlbuf
, sizeof(cmdlbuf
) - 1);
361 if (cmdllen
< sizeof(cmdlbuf
) - 1)
362 cmdlbuf
[cmdllen
]='\0';
363 if ((cmdlp
= strrchr(cmdlbuf
, '/')))
369 snprintf(finbuf
, sizeof(finbuf
), "%s/%s", direproc
->d_name
, cmdlp
);
370 prg_cache_add(inode
, finbuf
);
381 if (prg_cache_loaded
== 1) {
383 fprintf(stderr
,_("(No info could be read for \"-p\": geteuid()=%d but you should be root.)\n"),
387 fprintf(stderr
, _("(Not all processes could be identified, non-owned process info\n"
388 " will not be shown, you would have to be root to see it all.)\n"));
392 static const char *netrom_state
[] =
400 static int netrom_info(void)
403 char buffer
[256], dev
[16];
404 int st
, vs
, vr
, sendq
, recvq
, ret
;
406 f
= fopen(_PATH_PROCNET_NR
, "r");
408 if (errno
!= ENOENT
) {
409 perror(_PATH_PROCNET_NR
);
412 if (flag_arg
|| flag_ver
)
413 ESYSNOT("netstat", "AF NETROM");
419 printf(_("Active NET/ROM sockets\n"));
420 printf(_("User Dest Source Device State Vr/Vs Send-Q Recv-Q\n"));
421 fgets(buffer
, 256, f
);
423 while (fgets(buffer
, 256, f
)) {
427 ret
= sscanf(buffer
+ 30, "%s %*x/%*x %*x/%*x %d %d %d %*d %*d/%*d %*d/%*d %*d/%*d %*d/%*d %*d/%*d %*d %d %d %*d",
428 dev
, &st
, &vs
, &vr
, &sendq
, &recvq
);
430 printf(_("Problem reading data from %s\n"), _PATH_PROCNET_NR
);
433 printf("%-9s %-9s %-9s %-6s %-11s %03d/%03d %-6d %-6d\n",
434 buffer
, buffer
+ 10, buffer
+ 20,
437 vr
, vs
, sendq
, recvq
);
444 /* These enums are used by IPX too. :-( */
456 TCP_CLOSING
/* now a valid state */
459 #if HAVE_AFINET || HAVE_AFINET6
461 static const char *tcp_state
[] =
477 static void finish_this_one(int uid
, unsigned long inode
, const char *timers
)
482 if (!flag_not
&& ((pw
= getpwuid(uid
)) != NULL
))
483 printf("%-10s ", pw
->pw_name
);
485 printf("%-10d ", uid
);
486 printf("%-10ld ",inode
);
489 printf("%-" PROGNAME_WIDTHs
"s",prg_cache_get(inode
));
491 printf("%s", timers
);
495 static void igmp_do_one(int lnr
, const char *line
)
497 char mcast_addr
[128];
499 struct sockaddr_in6 mcastaddr
;
502 extern struct aftype inet6_aftype
;
504 struct sockaddr_in mcastaddr
;
507 static int idx_flag
= 0;
508 static int igmp6_flag
= 0;
509 static char device
[16];
510 int num
, idx
, refcnt
;
514 /* igmp6 file does not have any comments on first line */
515 if ( strstr( line
, "Device" ) == NULL
) {
519 /* 2.1.x kernels and up have Idx field */
520 /* 2.0.x and below do not have Idx field */
521 if ( strncmp( line
, "Idx", strlen("Idx") ) == 0 )
529 if (igmp6_flag
) { /* IPV6 */
531 num
= sscanf( line
, "%d %15s %64[0-9A-Fa-f] %d", &idx
, device
, mcast_addr
, &refcnt
);
533 /* Demangle what the kernel gives us */
535 "%4s%4s%4s%4s%4s%4s%4s%4s",
536 addr6p
[0], addr6p
[1], addr6p
[2], addr6p
[3],
537 addr6p
[4], addr6p
[5], addr6p
[6], addr6p
[7]);
538 snprintf(addr6
, sizeof(addr6
), "%s:%s:%s:%s:%s:%s:%s:%s",
539 addr6p
[0], addr6p
[1], addr6p
[2], addr6p
[3],
540 addr6p
[4], addr6p
[5], addr6p
[6], addr6p
[7]);
541 inet6_aftype
.input(1, addr6
, (struct sockaddr
*) &mcastaddr
);
542 mcastaddr
.sin6_family
= AF_INET6
;
544 fprintf(stderr
, _("warning, got bogus igmp6 line %d.\n"), lnr
);
548 if ((ap
= get_afntype(((struct sockaddr
*) &mcastaddr
)->sa_family
)) == NULL
) {
549 fprintf(stderr
, _("netstat: unsupported address family %d !\n"),
550 ((struct sockaddr
*) &mcastaddr
)->sa_family
);
553 safe_strncpy(mcast_addr
, ap
->sprint((struct sockaddr
*) &mcastaddr
,
554 flag_not
), sizeof(mcast_addr
));
555 printf("%-15s %-6d %s\n", device
, refcnt
, mcast_addr
);
559 if (line
[0] != '\t') {
561 if ((num
= sscanf( line
, "%d\t%10c", &idx
, device
)) < 2) {
562 fprintf(stderr
, _("warning, got bogus igmp line %d.\n"), lnr
);
566 if ( (num
= sscanf( line
, "%10c", device
)) < 1 ) {
567 fprintf(stderr
, _("warning, got bogus igmp line %d.\n"), lnr
);
573 } else if ( line
[0] == '\t' ) {
574 if ( (num
= sscanf(line
, "\t%8[0-9A-Fa-f] %d", mcast_addr
, &refcnt
)) < 2 ) {
575 fprintf(stderr
, _("warning, got bogus igmp line %d.\n"), lnr
);
578 sscanf( mcast_addr
, "%X",
579 &((struct sockaddr_in
*) &mcastaddr
)->sin_addr
.s_addr
);
580 ((struct sockaddr
*) &mcastaddr
)->sa_family
= AF_INET
;
582 fprintf(stderr
, _("warning, got bogus igmp line %d.\n"), lnr
);
586 if ((ap
= get_afntype(((struct sockaddr
*) &mcastaddr
)->sa_family
)) == NULL
) {
587 fprintf(stderr
, _("netstat: unsupported address family %d !\n"),
588 ((struct sockaddr
*) &mcastaddr
)->sa_family
);
591 safe_strncpy(mcast_addr
, ap
->sprint((struct sockaddr
*) &mcastaddr
,
592 flag_not
), sizeof(mcast_addr
));
593 printf("%-15s %-6d %s\n", device
, refcnt
, mcast_addr
);
598 static int igmp_info(void)
600 INFO_GUTS6(_PATH_PROCNET_IGMP
, _PATH_PROCNET_IGMP6
, "AF INET (igmp)",
604 static void tcp_do_one(int lnr
, const char *line
)
606 unsigned long rxq
, txq
, time_len
, retr
, inode
;
607 int num
, local_port
, rem_port
, d
, state
, uid
, timer_run
, timeout
;
608 char rem_addr
[128], local_addr
[128], timers
[64], buffer
[1024], more
[512];
611 struct sockaddr_in6 localaddr
, remaddr
;
612 char addr6p
[16][3], addr6
[128];
613 extern struct aftype inet6_aftype
;
615 struct sockaddr_in localaddr
, remaddr
;
622 "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %ld %512s\n",
623 &d
, local_addr
, &local_port
, rem_addr
, &rem_port
, &state
,
624 &txq
, &rxq
, &timer_run
, &time_len
, &retr
, &uid
, &timeout
, &inode
, more
);
626 if (strlen(local_addr
) > 8) {
628 /* Demangle what the kernel gives us */
630 "%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s",
631 addr6p
[0], addr6p
[1], addr6p
[2], addr6p
[3],
632 addr6p
[4], addr6p
[5], addr6p
[6], addr6p
[7],
633 addr6p
[8], addr6p
[9], addr6p
[10], addr6p
[11],
634 addr6p
[12], addr6p
[13], addr6p
[14], addr6p
[15]);
635 snprintf(addr6
, sizeof(addr6
), "%s%s:%s%s:%s%s:%s%s:%s%s:%s%s:%s%s:%s%s",
636 addr6p
[3], addr6p
[2], addr6p
[1], addr6p
[0],
637 addr6p
[7], addr6p
[6], addr6p
[5], addr6p
[4],
638 addr6p
[11], addr6p
[10], addr6p
[9], addr6p
[8],
639 addr6p
[15], addr6p
[14], addr6p
[13], addr6p
[12]);
640 inet6_aftype
.input(1, addr6
, (struct sockaddr
*) &localaddr
);
642 "%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s",
643 addr6p
[0], addr6p
[1], addr6p
[2], addr6p
[3],
644 addr6p
[4], addr6p
[5], addr6p
[6], addr6p
[7],
645 addr6p
[8], addr6p
[9], addr6p
[10], addr6p
[11],
646 addr6p
[12], addr6p
[13], addr6p
[14], addr6p
[15]);
647 snprintf(addr6
, sizeof(addr6
), "%s%s:%s%s:%s%s:%s%s:%s%s:%s%s:%s%s:%s%s",
648 addr6p
[3], addr6p
[2], addr6p
[1], addr6p
[0],
649 addr6p
[7], addr6p
[6], addr6p
[5], addr6p
[4],
650 addr6p
[11], addr6p
[10], addr6p
[9], addr6p
[8],
651 addr6p
[15], addr6p
[14], addr6p
[13], addr6p
[12]);
652 inet6_aftype
.input(1, addr6
, (struct sockaddr
*) &remaddr
);
653 localaddr
.sin6_family
= AF_INET6
;
654 remaddr
.sin6_family
= AF_INET6
;
657 sscanf(local_addr
, "%X",
658 &((struct sockaddr_in
*) &localaddr
)->sin_addr
.s_addr
);
659 sscanf(rem_addr
, "%X",
660 &((struct sockaddr_in
*) &remaddr
)->sin_addr
.s_addr
);
661 ((struct sockaddr
*) &localaddr
)->sa_family
= AF_INET
;
662 ((struct sockaddr
*) &remaddr
)->sa_family
= AF_INET
;
666 fprintf(stderr
, _("warning, got bogus tcp line.\n"));
669 if ((ap
= get_afntype(((struct sockaddr
*) &localaddr
)->sa_family
)) == NULL
) {
670 fprintf(stderr
, _("netstat: unsupported address family %d !\n"),
671 ((struct sockaddr
*) &localaddr
)->sa_family
);
674 if (state
== TCP_LISTEN
) {
680 safe_strncpy(local_addr
, ap
->sprint((struct sockaddr
*) &localaddr
,
681 flag_not
), sizeof(local_addr
));
682 safe_strncpy(rem_addr
, ap
->sprint((struct sockaddr
*) &remaddr
, flag_not
),
684 if (flag_all
|| (flag_lst
&& !rem_port
) || (!flag_lst
&& rem_port
)) {
685 snprintf(buffer
, sizeof(buffer
), "%s", get_sname(htons(local_port
), "tcp", flag_not
));
687 if ((strlen(local_addr
) + strlen(buffer
)) > 22)
688 local_addr
[22 - strlen(buffer
)] = '\0';
690 strcat(local_addr
, ":");
691 strcat(local_addr
, buffer
);
692 snprintf(buffer
, sizeof(buffer
), "%s", get_sname(htons(rem_port
), "tcp", flag_not
));
694 if ((strlen(rem_addr
) + strlen(buffer
)) > 22)
695 rem_addr
[22 - strlen(buffer
)] = '\0';
697 strcat(rem_addr
, ":");
698 strcat(rem_addr
, buffer
);
704 snprintf(timers
, sizeof(timers
), _("off (0.00/%ld/%d)"), retr
, timeout
);
708 snprintf(timers
, sizeof(timers
), _("on (%2.2f/%ld/%d)"),
709 (double) time_len
/ HZ
, retr
, timeout
);
713 snprintf(timers
, sizeof(timers
), _("keepalive (%2.2f/%ld/%d)"),
714 (double) time_len
/ HZ
, retr
, timeout
);
718 snprintf(timers
, sizeof(timers
), _("timewait (%2.2f/%ld/%d)"),
719 (double) time_len
/ HZ
, retr
, timeout
);
723 snprintf(timers
, sizeof(timers
), _("unkn-%d (%2.2f/%ld/%d)"),
724 timer_run
, (double) time_len
/ HZ
, retr
, timeout
);
727 printf("tcp %6ld %6ld %-23s %-23s %-12s",
728 rxq
, txq
, local_addr
, rem_addr
, _(tcp_state
[state
]));
730 finish_this_one(uid
,inode
,timers
);
734 static int tcp_info(void)
736 INFO_GUTS6(_PATH_PROCNET_TCP
, _PATH_PROCNET_TCP6
, "AF INET (tcp)",
740 static void udp_do_one(int lnr
, const char *line
)
742 char buffer
[8192], local_addr
[64], rem_addr
[64];
743 char *udp_state
, timers
[64], more
[512];
744 int num
, local_port
, rem_port
, d
, state
, timer_run
, uid
, timeout
;
746 struct sockaddr_in6 localaddr
, remaddr
;
749 extern struct aftype inet6_aftype
;
751 struct sockaddr_in localaddr
, remaddr
;
754 unsigned long rxq
, txq
, time_len
, retr
, inode
;
761 "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %ld %512s\n",
762 &d
, local_addr
, &local_port
,
763 rem_addr
, &rem_port
, &state
,
764 &txq
, &rxq
, &timer_run
, &time_len
, &retr
, &uid
, &timeout
, &inode
, more
);
766 if (strlen(local_addr
) > 8) {
768 sscanf(local_addr
, "%4s%4s%4s%4s%4s%4s%4s%4s",
769 addr6p
[0], addr6p
[1], addr6p
[2], addr6p
[3],
770 addr6p
[4], addr6p
[5], addr6p
[6], addr6p
[7]);
771 snprintf(addr6
, sizeof(addr6
), "%s:%s:%s:%s:%s:%s:%s:%s",
772 addr6p
[0], addr6p
[1], addr6p
[2], addr6p
[3],
773 addr6p
[4], addr6p
[5], addr6p
[6], addr6p
[7]);
774 inet6_aftype
.input(1, addr6
, (struct sockaddr
*) &localaddr
);
775 sscanf(rem_addr
, "%4s%4s%4s%4s%4s%4s%4s%4s",
776 addr6p
[0], addr6p
[1], addr6p
[2], addr6p
[3],
777 addr6p
[4], addr6p
[5], addr6p
[6], addr6p
[7]);
778 snprintf(addr6
, sizeof(addr6
), "%s:%s:%s:%s:%s:%s:%s:%s",
779 addr6p
[0], addr6p
[1], addr6p
[2], addr6p
[3],
780 addr6p
[4], addr6p
[5], addr6p
[6], addr6p
[7]);
781 inet6_aftype
.input(1, addr6
, (struct sockaddr
*) &remaddr
);
782 localaddr
.sin6_family
= AF_INET6
;
783 remaddr
.sin6_family
= AF_INET6
;
786 sscanf(local_addr
, "%X",
787 &((struct sockaddr_in
*) &localaddr
)->sin_addr
.s_addr
);
788 sscanf(rem_addr
, "%X",
789 &((struct sockaddr_in
*) &remaddr
)->sin_addr
.s_addr
);
790 ((struct sockaddr
*) &localaddr
)->sa_family
= AF_INET
;
791 ((struct sockaddr
*) &remaddr
)->sa_family
= AF_INET
;
799 fprintf(stderr
, _("warning, got bogus udp line.\n"));
802 if ((ap
= get_afntype(((struct sockaddr
*) &localaddr
)->sa_family
)) == NULL
) {
803 fprintf(stderr
, _("netstat: unsupported address family %d !\n"),
804 ((struct sockaddr
*) &localaddr
)->sa_family
);
808 case TCP_ESTABLISHED
:
809 udp_state
= _("ESTABLISHED");
817 udp_state
= _("UNKNOWN");
822 #define notnull(A) (((A.sin6_family == AF_INET6) && \
823 ((A.sin6_addr.s6_addr32[0]) || \
824 (A.sin6_addr.s6_addr32[1]) || \
825 (A.sin6_addr.s6_addr32[2]) || \
826 (A.sin6_addr.s6_addr32[3]))) || \
827 ((A.sin6_family == AF_INET) && \
828 ((struct sockaddr_in *) &A)->sin_addr.s_addr))
830 #define notnull(A) (A.sin_addr.s_addr)
833 if (flag_all
|| (notnull(remaddr
) && !flag_lst
) || (!notnull(remaddr
) && flag_lst
))
835 safe_strncpy(local_addr
, ap
->sprint((struct sockaddr
*) &localaddr
,
836 flag_not
), sizeof(local_addr
));
837 snprintf(buffer
, sizeof(buffer
), "%s", get_sname(htons(local_port
), "udp", flag_not
));
838 if ((strlen(local_addr
) + strlen(buffer
)) > 22)
839 local_addr
[22 - strlen(buffer
)] = '\0';
840 strcat(local_addr
, ":");
841 strcat(local_addr
, buffer
);
843 snprintf(buffer
, sizeof(buffer
), "%s", get_sname(htons(rem_port
), "udp", flag_not
));
844 safe_strncpy(rem_addr
, ap
->sprint((struct sockaddr
*) &remaddr
,
845 flag_not
), sizeof(rem_addr
));
846 if ((strlen(rem_addr
) + strlen(buffer
)) > 22)
847 rem_addr
[22 - strlen(buffer
)] = '\0';
848 strcat(rem_addr
, ":");
849 strcat(rem_addr
, buffer
);
855 snprintf(timers
, sizeof(timers
), _("off (0.00/%ld/%d)"), retr
, timeout
);
860 snprintf(timers
, sizeof(timers
), _("on%d (%2.2f/%ld/%d)"), timer_run
, (double) time_len
/ 100, retr
, timeout
);
864 snprintf(timers
, sizeof(timers
), _("unkn-%d (%2.2f/%ld/%d)"), timer_run
, (double) time_len
/ 100,
868 printf("udp %6ld %6ld %-23s %-23s %-12s",
869 rxq
, txq
, local_addr
, rem_addr
, udp_state
);
871 finish_this_one(uid
,inode
,timers
);
875 static int udp_info(void)
877 INFO_GUTS6(_PATH_PROCNET_UDP
, _PATH_PROCNET_UDP6
, "AF INET (udp)",
881 static void raw_do_one(int lnr
, const char *line
)
883 char buffer
[8192], local_addr
[64], rem_addr
[64];
884 char timers
[64], more
[512];
885 int num
, local_port
, rem_port
, d
, state
, timer_run
, uid
, timeout
;
887 struct sockaddr_in6 localaddr
, remaddr
;
890 extern struct aftype inet6_aftype
;
892 struct sockaddr_in localaddr
, remaddr
;
895 unsigned long rxq
, txq
, time_len
, retr
, inode
;
902 "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %ld %512s\n",
903 &d
, local_addr
, &local_port
, rem_addr
, &rem_port
, &state
,
904 &txq
, &rxq
, &timer_run
, &time_len
, &retr
, &uid
, &timeout
, &inode
, more
);
906 if (strlen(local_addr
) > 8) {
908 sscanf(local_addr
, "%4s%4s%4s%4s%4s%4s%4s%4s",
909 addr6p
[0], addr6p
[1], addr6p
[2], addr6p
[3],
910 addr6p
[4], addr6p
[5], addr6p
[6], addr6p
[7]);
911 snprintf(addr6
, sizeof(addr6
), "%s:%s:%s:%s:%s:%s:%s:%s",
912 addr6p
[0], addr6p
[1], addr6p
[2], addr6p
[3],
913 addr6p
[4], addr6p
[5], addr6p
[6], addr6p
[7]);
914 inet6_aftype
.input(1, addr6
, (struct sockaddr
*) &localaddr
);
915 sscanf(rem_addr
, "%4s%4s%4s%4s%4s%4s%4s%4s",
916 addr6p
[0], addr6p
[1], addr6p
[2], addr6p
[3],
917 addr6p
[4], addr6p
[5], addr6p
[6], addr6p
[7]);
918 snprintf(addr6
, sizeof(addr6
), "%s:%s:%s:%s:%s:%s:%s:%s",
919 addr6p
[0], addr6p
[1], addr6p
[2], addr6p
[3],
920 addr6p
[4], addr6p
[5], addr6p
[6], addr6p
[7]);
921 inet6_aftype
.input(1, addr6
, (struct sockaddr
*) &remaddr
);
922 localaddr
.sin6_family
= AF_INET6
;
923 remaddr
.sin6_family
= AF_INET6
;
926 sscanf(local_addr
, "%X",
927 &((struct sockaddr_in
*) &localaddr
)->sin_addr
.s_addr
);
928 sscanf(rem_addr
, "%X",
929 &((struct sockaddr_in
*) &remaddr
)->sin_addr
.s_addr
);
930 ((struct sockaddr
*) &localaddr
)->sa_family
= AF_INET
;
931 ((struct sockaddr
*) &remaddr
)->sa_family
= AF_INET
;
934 if ((ap
= get_afntype(localaddr
.sin6_family
)) == NULL
) {
935 fprintf(stderr
, _("netstat: unsupported address family %d !\n"), localaddr
.sin6_family
);
939 if ((ap
= get_afntype(localaddr
.sin_family
)) == NULL
) {
940 fprintf(stderr
, _("netstat: unsupported address family %d !\n"), localaddr
.sin_family
);
949 fprintf(stderr
, _("warning, got bogus raw line.\n"));
953 if (flag_all
|| (notnull(remaddr
) && !flag_lst
) || (!notnull(remaddr
) && flag_lst
))
955 snprintf(buffer
, sizeof(buffer
), "%s", get_sname(htons(local_port
), "raw", flag_not
));
956 safe_strncpy(local_addr
, ap
->sprint((struct sockaddr
*) &localaddr
,
957 flag_not
), sizeof(local_addr
));
958 if ((strlen(local_addr
) + strlen(buffer
)) > 22)
959 local_addr
[22 - strlen(buffer
)] = '\0';
960 strcat(local_addr
, ":");
961 strcat(local_addr
, buffer
);
963 snprintf(buffer
, sizeof(buffer
), "%s", get_sname(htons(rem_port
), "raw", flag_not
));
964 safe_strncpy(rem_addr
, ap
->sprint((struct sockaddr
*) &remaddr
,
965 flag_not
), sizeof(rem_addr
));
966 if ((strlen(rem_addr
) + strlen(buffer
)) > 22)
967 rem_addr
[22 - strlen(buffer
)] = '\0';
968 strcat(rem_addr
, ":");
969 strcat(rem_addr
, buffer
);
975 snprintf(timers
, sizeof(timers
), _("off (0.00/%ld/%d)"), retr
, timeout
);
980 snprintf(timers
, sizeof(timers
), _("on%d (%2.2f/%ld/%d)"), timer_run
, (double) time_len
/ 100,
985 snprintf(timers
, sizeof(timers
), _("unkn-%d (%2.2f/%ld/%d)"),
986 timer_run
, (double) time_len
/ 100,
990 printf("raw %6ld %6ld %-23s %-23s %-12d",
991 rxq
, txq
, local_addr
, rem_addr
, state
);
993 finish_this_one(uid
,inode
,timers
);
997 static int raw_info(void)
999 INFO_GUTS6(_PATH_PROCNET_RAW
, _PATH_PROCNET_RAW6
, "AF INET (raw)",
1010 static void unix_do_one(int nr
, const char *line
)
1013 char path
[MAXPATHLEN
], ss_flags
[32];
1014 char *ss_proto
, *ss_state
, *ss_type
;
1015 int num
, state
, type
, inode
;
1017 unsigned long refcnt
, proto
, flags
;
1020 if (strstr(line
, "Inode"))
1025 num
= sscanf(line
, "%p: %lX %lX %lX %X %X %d %s",
1026 &d
, &refcnt
, &proto
, &flags
, &type
, &state
, &inode
, path
);
1028 fprintf(stderr
, _("warning, got bogus unix line.\n"));
1031 if (!(has
& HAS_INODE
))
1032 snprintf(path
,sizeof(path
),"%d",inode
);
1035 if ((state
== SS_UNCONNECTED
) && (flags
& SO_ACCEPTCON
)) {
1055 ss_type
= _("STREAM");
1059 ss_type
= _("DGRAM");
1070 case SOCK_SEQPACKET
:
1071 ss_type
= _("SEQPACKET");
1075 ss_type
= _("UNKNOWN");
1080 ss_state
= _("FREE");
1083 case SS_UNCONNECTED
:
1085 * Unconnected sockets may be listening
1088 if (flags
& SO_ACCEPTCON
) {
1089 ss_state
= _("LISTENING");
1096 ss_state
= _("CONNECTING");
1100 ss_state
= _("CONNECTED");
1103 case SS_DISCONNECTING
:
1104 ss_state
= _("DISCONNECTING");
1108 ss_state
= _("UNKNOWN");
1111 strcpy(ss_flags
, "[ ");
1112 if (flags
& SO_ACCEPTCON
)
1113 strcat(ss_flags
, "ACC ");
1114 if (flags
& SO_WAITDATA
)
1115 strcat(ss_flags
, "W ");
1116 if (flags
& SO_NOSPACE
)
1117 strcat(ss_flags
, "N ");
1119 strcat(ss_flags
, "]");
1121 printf("%-5s %-6ld %-11s %-10s %-13s ",
1122 ss_proto
, refcnt
, ss_flags
, ss_type
, ss_state
);
1123 if (has
& HAS_INODE
)
1124 printf("%-6d ",inode
);
1128 printf("%-" PROGNAME_WIDTHs
"s",(has
& HAS_INODE
?prg_cache_get(inode
):"-"));
1132 static int unix_info(void)
1135 printf(_("Active UNIX domain sockets "));
1137 printf(_("(servers and established)"));
1140 printf(_("(only servers)"));
1142 printf(_("(w/o servers)"));
1145 printf(_("\nProto RefCnt Flags Type State I-Node"));
1146 print_progname_banner();
1147 printf(_(" Path\n")); /* xxx */
1150 INFO_GUTS(_PATH_PROCNET_UNIX
, "AF UNIX", unix_do_one
);
1157 static int ax25_info(void)
1160 char buffer
[256], buf
[16];
1161 char *src
, *dst
, *dev
, *p
;
1162 int st
, vs
, vr
, sendq
, recvq
, ret
;
1163 int new = -1; /* flag for new (2.1.x) kernels */
1164 static char *ax25_state
[5] =
1172 if (!(f
= fopen(_PATH_PROCNET_AX25
, "r"))) {
1173 if (errno
!= ENOENT
) {
1174 perror(_PATH_PROCNET_AX25
);
1177 if (flag_arg
|| flag_ver
)
1178 ESYSNOT("netstat", "AF AX25");
1184 printf(_("Active AX.25 sockets\n"));
1185 printf(_("Dest Source Device State Vr/Vs Send-Q Recv-Q\n"));
1186 while (fgets(buffer
, 256, f
)) {
1188 if (!strncmp(buffer
, "dest_addr", 9)) {
1190 continue; /* old kernels have a header line */
1195 * In a network connection with no user socket the Snd-Q, Rcv-Q
1196 * and Inode fields are empty in 2.0.x and '*' in 2.1.x
1205 ret
= sscanf(buffer
+ 20, "%s %d %d %d %*d %*d/%*d %*d/%*d %*d/%*d %*d/%*d %*d/%*d %*d %*d %*d %d %d %*d",
1206 buf
, &st
, &vs
, &vr
, &sendq
, &recvq
);
1207 if (ret
!= 4 && ret
!= 6) {
1208 printf(_("Problem reading data from %s\n"), _PATH_PROCNET_AX25
);
1214 while (*p
!= ' ') p
++;
1217 while (*p
!= ' ') p
++;
1220 while (*p
!= ' ') p
++;
1223 while (*p
!= ' ') p
++;
1225 ret
= sscanf(p
, "%d %d %d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %d %d %*d",
1226 &st
, &vs
, &vr
, &sendq
, &recvq
);
1227 if (ret
!= 3 && ret
!= 5) {
1228 printf(_("problem reading data from %s\n"), _PATH_PROCNET_AX25
);
1232 * FIXME: digipeaters should be handled somehow.
1233 * For now we just strip them.
1236 while (*p
&& *p
!= ',') p
++;
1239 printf("%-9s %-9s %-6s %-11s %03d/%03d %-6d %-6d\n",
1243 vr
, vs
, sendq
, recvq
);
1252 static int ipx_info(void)
1256 unsigned long txq
, rxq
;
1263 char sad
[50], dad
[50];
1265 unsigned sport
= 0, dport
= 0;
1267 if (!(f
= fopen(_PATH_PROCNET_IPX
, "r"))) {
1268 if (errno
!= ENOENT
) {
1269 perror(_PATH_PROCNET_IPX
);
1272 if (flag_arg
|| flag_ver
)
1273 ESYSNOT("netstat", "AF IPX");
1279 printf(_("Active IPX sockets\nProto Recv-Q Send-Q Local Address Foreign Address State")); /* xxx */
1281 printf(_(" User")); /* xxx */
1283 if ((ap
= get_afntype(AF_IPX
)) == NULL
) {
1284 EINTERN("netstat.c", "AF_IPX missing");
1289 while (fgets(buf
, 255, f
) != NULL
) {
1290 sscanf(buf
, "%s %s %lX %lX %d %d",
1291 sad
, dad
, &txq
, &rxq
, &state
, &uid
);
1292 if ((st
= rindex(sad
, ':'))) {
1294 sscanf(st
, "%X", &sport
); /* net byt order */
1295 sport
= ntohs(sport
);
1297 EINTERN("netstat.c", _PATH_PROCNET_IPX
" sport format error");
1301 if (strcmp(dad
, "Not_Connected") != 0) {
1302 if ((st
= rindex(dad
, ':'))) {
1304 sscanf(st
, "%X", &dport
); /* net byt order */
1305 dport
= ntohs(dport
);
1307 EINTERN("netstat.c", _PATH_PROCNET_IPX
" dport format error");
1314 case TCP_ESTABLISHED
:
1327 /* Fetch and resolve the Source */
1328 (void) ap
->input(4, sad
, &sa
);
1329 safe_strncpy(buf
, ap
->sprint(&sa
, flag_not
), sizeof(buf
));
1330 snprintf(sad
, sizeof(sad
), "%s:%04X", buf
, sport
);
1333 /* Fetch and resolve the Destination */
1334 (void) ap
->input(4, dad
, &sa
);
1335 safe_strncpy(buf
, ap
->sprint(&sa
, flag_not
), sizeof(buf
));
1336 snprintf(dad
, sizeof(dad
), "%s:%04X", buf
, dport
);
1340 printf("IPX %6ld %6ld %-26s %-26s %-5s", txq
, rxq
, sad
, dad
, st
);
1342 if (!flag_not
&& ((pw
= getpwuid(uid
)) != NULL
))
1343 printf(" %-10s", pw
->pw_name
);
1345 printf(" %-10d", uid
);
1354 void ife_print(struct interface
*ptr
)
1356 printf("%-5.5s ", ptr
->name
);
1357 printf("%5d %3d ", ptr
->mtu
, ptr
->metric
);
1358 /* If needed, display the interface statistics. */
1359 if (ptr
->statistics_valid
) {
1360 printf("%8lu %6lu %6lu %6lu ",
1361 ptr
->stats
.rx_packets
, ptr
->stats
.rx_errors
,
1362 ptr
->stats
.rx_dropped
, ptr
->stats
.rx_fifo_errors
);
1363 printf("%8lu %6lu %6lu %6lu ",
1364 ptr
->stats
.tx_packets
, ptr
->stats
.tx_errors
,
1365 ptr
->stats
.tx_dropped
, ptr
->stats
.tx_fifo_errors
);
1367 printf("%-56s", _(" - no statistics available -"));
1369 if (ptr
->flags
== 0)
1370 printf(_("[NO FLAGS]"));
1371 if (ptr
->flags
& IFF_ALLMULTI
)
1373 if (ptr
->flags
& IFF_BROADCAST
)
1375 if (ptr
->flags
& IFF_DEBUG
)
1377 if (ptr
->flags
& IFF_LOOPBACK
)
1379 if (ptr
->flags
& IFF_PROMISC
)
1381 if (ptr
->flags
& IFF_NOTRAILERS
)
1383 if (ptr
->flags
& IFF_NOARP
)
1385 if (ptr
->flags
& IFF_POINTOPOINT
)
1387 if (ptr
->flags
& IFF_RUNNING
)
1389 if (ptr
->flags
& IFF_UP
)
1394 static int iface_info(void)
1397 if ((skfd
= sockets_open(0)) < 0) {
1401 printf(_("Kernel Interface table\n"));
1403 printf(_("Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n"));
1405 if (for_all_interfaces(do_if_print
, &flag_all
) < 0) {
1406 perror(_("missing interface information"));
1410 free_interface_list();
1420 static void version(void)
1422 printf("%s\n%s\n%s\n%s\n", Release
, Version
, Signature
, Features
);
1427 static void usage(void)
1429 fprintf(stderr
, _("usage: netstat [-veenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}\n"));
1430 fprintf(stderr
, _(" netstat [-vnNcaeol] [<Socket> ...]\n"));
1431 fprintf(stderr
, _(" netstat { [-veenNac] -i | [-cnNe] -M | -s }\n\n"));
1433 fprintf(stderr
, _(" -r, --route display routing table\n"));
1434 fprintf(stderr
, _(" -i, --interfaces display interface table\n"));
1435 fprintf(stderr
, _(" -g, --groups display multicast group memberships\n"));
1436 fprintf(stderr
, _(" -s, --statistics display networking statistics (like SNMP)\n"));
1437 #if HAVE_FW_MASQUERADE
1438 fprintf(stderr
, _(" -M, --masquerade display masqueraded connections\n\n"));
1440 fprintf(stderr
, _(" -v, --verbose be verbose\n"));
1441 fprintf(stderr
, _(" -n, --numeric dont resolve names\n"));
1442 fprintf(stderr
, _(" -N, --symbolic resolve hardware names\n"));
1443 fprintf(stderr
, _(" -e, --extend display other/more information\n"));
1444 fprintf(stderr
, _(" -p, --programs display PID/Program name for sockets\n"));
1445 fprintf(stderr
, _(" -c, --continuous continuous listing\n\n"));
1446 fprintf(stderr
, _(" -l, --listening display listening server sockets\n"));
1447 fprintf(stderr
, _(" -a, --all, --listening display all sockets (default: connected)\n"));
1448 fprintf(stderr
, _(" -o, --timers display timers\n"));
1449 fprintf(stderr
, _(" -F, --fib display Forwarding Information Base (default)\n"));
1450 fprintf(stderr
, _(" -C, --cache display routing cache instead of FIB\n\n"));
1452 fprintf(stderr
, _(" <Socket>={-t|--tcp} {-u|--udp} {-w|--raw} {-x|--unix} --ax25 --ipx --netrom\n"));
1453 fprintf(stderr
, _(" <AF>=Use '-A <af>' or '--<af>' Default: %s\n"), DFLT_AF
);
1454 fprintf(stderr
, _(" List of possible address families (which support routing):\n"));
1455 print_aflist(1); /* 1 = routeable */
1461 (int argc
, char *argv
[]) {
1464 struct option longopts
[] =
1467 {"version", 0, 0, 'V'},
1468 {"interfaces", 0, 0, 'i'},
1469 {"help", 0, 0, 'h'},
1470 {"route", 0, 0, 'r'},
1471 {"netlink", 2, 0, 'L'},
1472 #if HAVE_FW_MASQUERADE
1473 {"masquerade", 0, 0, 'M'},
1475 {"protocol", 1, 0, 'A'},
1479 {"unix", 0, 0, 'x'},
1480 {"listening", 0, 0, 'l'},
1482 {"timers", 0, 0, 'o'},
1483 {"continuous", 0, 0, 'c'},
1484 {"extend", 0, 0, 'e'},
1485 {"programs", 0, 0, 'p'},
1486 {"verbose", 0, 0, 'v'},
1487 {"statistics", 0, 0, 's'},
1488 {"numeric", 0, 0, 'n'},
1489 {"symbolic", 0, 0, 'N'},
1490 {"cache", 0, 0, 'C'},
1492 {"groups", 0, 0, 'g'},
1497 bindtextdomain("net-tools", "/usr/share/locale");
1498 textdomain("net-tools");
1500 getroute_init(); /* Set up AF routing support */
1503 while ((i
= getopt_long(argc
, argv
, "MCFA:acdegphinNorstuVv?wxl", longopts
, &lop
)) != EOF
)
1508 if (lop
< 0 || lop
>= AFTRANS_CNT
) {
1509 EINTERN("netstat.c", "longopts 1 range");
1512 if (aftrans_opt(longopts
[lop
].name
))
1516 if (aftrans_opt(optarg
))
1549 flag_not
|= FLAG_NUM
;
1552 flag_not
|= FLAG_SYM
;
1555 flag_cf
|= FLAG_CACHE
;
1558 flag_cf
|= FLAG_FIB
;
1567 flag_ver
|= FLAG_VERBOSE
;
1584 if (aftrans_opt("unix"))
1594 if (flag_int
+ flag_rou
+ flag_mas
+ flag_sta
> 1)
1597 if ((flag_inet
|| flag_inet6
|| flag_sta
) && !(flag_tcp
|| flag_udp
|| flag_raw
))
1598 flag_tcp
= flag_udp
= flag_raw
= 1;
1600 if ((flag_tcp
|| flag_udp
|| flag_raw
|| flag_igmp
) && !(flag_inet
|| flag_inet6
))
1601 flag_inet
= flag_inet6
= 1;
1603 flag_arg
= flag_tcp
+ flag_udp
+ flag_raw
+ flag_unx
+ flag_ipx
1604 + flag_ax25
+ flag_netrom
+ flag_igmp
;
1607 #if HAVE_FW_MASQUERADE && HAVE_AFINET
1608 #if MORE_THAN_ONE_MASQ_AF
1610 strcpy(afname
, DFLT_AF
);
1613 i
= ip_masq_info(flag_not
, flag_exp
);
1619 ENOSUPP("netstat.c", "FW_MASQUERADE");
1627 parsesnmp(flag_raw
, flag_tcp
, flag_udp
);
1635 strcpy(afname
, DFLT_AF
);
1639 else if (flag_exp
== 1)
1642 options
= (flag_exp
& FLAG_EXT
) | flag_not
| flag_cf
| flag_ver
;
1644 options
|= FLAG_FIB
;
1647 i
= route_info(afname
, options
);
1664 if (!flag_arg
|| flag_tcp
|| flag_udp
|| flag_raw
) {
1667 printf(_("Active Internet connections ")); /* xxx */
1670 printf(_("(servers and established)"));
1673 printf(_("(only servers)"));
1675 printf(_("(w/o servers)"));
1677 printf(_("\nProto Recv-Q Send-Q Local Address Foreign Address State ")); /* xxx */
1679 printf(_(" User Inode "));
1680 print_progname_banner();
1682 printf(_(" Timer")); /* xxx */
1687 ENOSUPP("netstat", "AF INET");
1692 if (!flag_arg
|| flag_tcp
) {
1697 if (!flag_arg
|| flag_udp
) {
1702 if (!flag_arg
|| flag_raw
) {
1712 printf( _("IPv4 Group Memberships\n") );
1713 printf( _("Interface RefCnt Group\n") );
1714 printf( "--------------- ------ ---------------------\n" );
1721 if (!flag_arg
|| flag_unx
) {
1730 ENOSUPP("netstat", "AF UNIX");
1734 if (!flag_arg
|| flag_ipx
) {
1742 ENOSUPP("netstat", "AF IPX");
1746 if (!flag_arg
|| flag_ax25
) {
1754 ENOSUPP("netstat", "AF AX25");
1758 if (!flag_arg
|| flag_netrom
) {
1766 ENOSUPP("netstat", "AF NETROM");