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.66 2009/09/06 22:47:46 vapier 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 *980815 {1.xx} Stephane Fillod: X.25 support
47 *980411 {1.34} Arnaldo Carvalho i18n: catgets -> gnu gettext, substitution
48 * of sprintf for snprintf
49 *10/1998 Andi Kleen Use new interface primitives.
50 *990101 {1.36} Bernd Eckenfels usage updated to include -s and -C -F,
51 * fixed netstat -rC output (lib/inet_gr.c)
52 * removed broken NETLINK Support
53 * fixed format for /proc/net/udp|tcp|raw
54 * added -w,-t,-u TcpExt support to -s
55 *990131 {1.37} Jan Kratochvil added -p for prg_cache() & friends
56 * Flames to <short@ucw.cz>.
57 * Tuan Hoang added IGMP support for IPv4 and IPv6
59 *990420 {1.38} Tuan Hoang removed a useless assignment from igmp_do_one()
60 *20010404 {1.39} Arnaldo Carvalho de Melo - use setlocale
61 *20081201 {1.42} Brian Micek added -L|--udplite options for RFC 3828
63 * This program is free software; you can redistribute it
64 * and/or modify it under the terms of the GNU General
65 * Public License as published by the Free Software
66 * Foundation; either version 2 of the License, or (at
67 * your option) any later version.
82 #include <sys/param.h>
83 #include <sys/socket.h>
84 #include <arpa/inet.h>
85 #include <netinet/in.h>
86 #include <sys/ioctl.h>
90 #include "net-support.h"
91 #include "pathnames.h"
96 #include "interface.h"
100 #define PROGNAME_WIDTH 20
102 #if !defined(s6_addr32) && defined(in6a_words)
103 #define s6_addr32 in6a_words /* libinet6 */
106 /* prototypes for statistics.c */
107 void parsesnmp(int, int, int);
109 void parsesnmp6(int, int, int);
113 SS_FREE = 0, /* not allocated */
114 SS_UNCONNECTED, /* unconnected to any socket */
115 SS_CONNECTING, /* in process of connecting */
116 SS_CONNECTED, /* connected to socket */
117 SS_DISCONNECTING /* in process of disconnecting */
120 #define SO_ACCEPTCON (1<<16) /* performed a listen */
121 #define SO_WAITDATA (1<<17) /* wait data to read */
122 #define SO_NOSPACE (1<<18) /* no space to write */
124 #define DFLT_AF "inet"
126 #define FEATURE_NETSTAT
127 #include "lib/net-features.h"
129 char *Release = RELEASE, *Version = "netstat 1.42 (2001-04-15)", *Signature = "Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others";
150 int flag_udplite = 0;
161 #define INFO_GUTS1(file,name,proc,prot) \
162 procinfo = proc_fopen((file)); \
163 if (procinfo == NULL) { \
164 if (errno != ENOENT) { \
168 if (flag_arg || flag_ver) \
169 ESYSNOT("netstat", (name)); \
174 if (fgets(buffer, sizeof(buffer), procinfo)) \
175 (proc)(lnr++, buffer,prot); \
176 } while (!feof(procinfo)); \
181 #define INFO_GUTS2(file,proc,prot) \
183 procinfo = proc_fopen((file)); \
184 if (procinfo != NULL) { \
186 if (fgets(buffer, sizeof(buffer), procinfo)) \
187 (proc)(lnr++, buffer,prot); \
188 } while (!feof(procinfo)); \
192 #define INFO_GUTS2(file,proc,prot)
198 #define INFO_GUTS6(file,file6,name,proc,prot4,prot6) \
202 if (!flag_arg || flag_inet) { \
203 INFO_GUTS1(file,name,proc,prot4) \
205 if (!flag_arg || flag_inet6) { \
206 INFO_GUTS2(file6,proc,prot6) \
210 #define INFO_GUTS(file,name,proc,prot) \
214 INFO_GUTS1(file,name,proc,prot) \
217 #define PROGNAME_WIDTHs PROGNAME_WIDTH1(PROGNAME_WIDTH)
218 #define PROGNAME_WIDTH1(s) PROGNAME_WIDTH2(s)
219 #define PROGNAME_WIDTH2(s) #s
221 #define PRG_HASH_SIZE 211
223 static struct prg_node {
224 struct prg_node *next;
226 char name[PROGNAME_WIDTH];
227 } *prg_hash[PRG_HASH_SIZE];
229 static char prg_cache_loaded = 0;
231 #define PRG_HASHIT(x) ((x) % PRG_HASH_SIZE)
233 #define PROGNAME_BANNER "PID/Program name"
235 #define print_progname_banner() do { if (flag_prg) printf(" %-" PROGNAME_WIDTHs "s",PROGNAME_BANNER); } while (0)
237 #define PRG_LOCAL_ADDRESS "local_address"
238 #define PRG_INODE "inode"
239 #define PRG_SOCKET_PFX "socket:["
240 #define PRG_SOCKET_PFXl (strlen(PRG_SOCKET_PFX))
241 #define PRG_SOCKET_PFX2 "[0000]:"
242 #define PRG_SOCKET_PFX2l (strlen(PRG_SOCKET_PFX2))
246 #define LINE_MAX 4096
249 #define PATH_PROC "/proc"
250 #define PATH_FD_SUFF "fd"
251 #define PATH_FD_SUFFl strlen(PATH_FD_SUFF)
252 #define PATH_PROC_X_FD PATH_PROC "/%s/" PATH_FD_SUFF
253 #define PATH_CMDLINE "cmdline"
254 #define PATH_CMDLINEl strlen(PATH_CMDLINE)
256 static void prg_cache_add(unsigned long inode, char *name)
258 unsigned hi = PRG_HASHIT(inode);
259 struct prg_node **pnp,*pn;
262 for (pnp=prg_hash+hi;(pn=*pnp);pnp=&pn->next) {
263 if (pn->inode==inode) {
264 /* Some warning should be appropriate here
265 as we got multiple processes for one i-node */
269 if (!(*pnp=malloc(sizeof(**pnp))))
274 if (strlen(name)>sizeof(pn->name)-1)
275 name[sizeof(pn->name)-1]='\0';
276 strcpy(pn->name,name);
279 static const char *prg_cache_get(unsigned long inode)
281 unsigned hi=PRG_HASHIT(inode);
284 for (pn=prg_hash[hi];pn;pn=pn->next)
285 if (pn->inode==inode) return(pn->name);
289 static void prg_cache_clear(void)
291 struct prg_node **pnp,*pn;
293 if (prg_cache_loaded == 2)
294 for (pnp=prg_hash;pnp<prg_hash+PRG_HASH_SIZE;pnp++)
302 static void wait_continous(void)
308 static int extract_type_1_socket_inode(const char lname[], unsigned long * inode_p) {
310 /* If lname is of the form "socket:[12345]", extract the "12345"
311 as *inode_p. Otherwise, return -1 as *inode_p.
314 if (strlen(lname) < PRG_SOCKET_PFXl+3) return(-1);
316 if (memcmp(lname, PRG_SOCKET_PFX, PRG_SOCKET_PFXl)) return(-1);
317 if (lname[strlen(lname)-1] != ']') return(-1);
320 char inode_str[strlen(lname + 1)]; /* e.g. "12345" */
321 const int inode_str_len = strlen(lname) - PRG_SOCKET_PFXl - 1;
324 strncpy(inode_str, lname+PRG_SOCKET_PFXl, inode_str_len);
325 inode_str[inode_str_len] = '\0';
326 *inode_p = strtol(inode_str,&serr,0);
327 if (!serr || *serr || *inode_p < 0 || *inode_p >= INT_MAX)
335 static int extract_type_2_socket_inode(const char lname[], unsigned long * inode_p) {
337 /* If lname is of the form "[0000]:12345", extract the "12345"
338 as *inode_p. Otherwise, return -1 as *inode_p.
341 if (strlen(lname) < PRG_SOCKET_PFX2l+1) return(-1);
342 if (memcmp(lname, PRG_SOCKET_PFX2, PRG_SOCKET_PFX2l)) return(-1);
347 *inode_p=strtol(lname + PRG_SOCKET_PFX2l,&serr,0);
348 if (!serr || *serr || *inode_p < 0 || *inode_p >= INT_MAX)
357 static void prg_cache_load(void)
359 char line[LINE_MAX],eacces=0;
360 int procfdlen,fd,cmdllen,lnamelen;
361 char lname[30],cmdlbuf[512],finbuf[PROGNAME_WIDTH];
363 const char *cs,*cmdlp;
364 DIR *dirproc=NULL,*dirfd=NULL;
365 struct dirent *direproc,*direfd;
367 if (prg_cache_loaded || !flag_prg) return;
369 cmdlbuf[sizeof(cmdlbuf)-1]='\0';
370 if (!(dirproc=opendir(PATH_PROC))) goto fail;
371 while (errno=0,direproc=readdir(dirproc)) {
372 for (cs=direproc->d_name;*cs;cs++)
377 procfdlen=snprintf(line,sizeof(line),PATH_PROC_X_FD,direproc->d_name);
378 if (procfdlen<=0 || procfdlen>=sizeof(line)-5)
387 line[procfdlen] = '/';
389 while ((direfd = readdir(dirfd))) {
391 if (!isdigit(direfd->d_name[0]))
393 if (procfdlen+1+strlen(direfd->d_name)+1>sizeof(line))
395 memcpy(line + procfdlen - PATH_FD_SUFFl, PATH_FD_SUFF "/",
397 strcpy(line + procfdlen + 1, direfd->d_name);
398 lnamelen=readlink(line,lname,sizeof(lname)-1);
399 lname[lnamelen] = '\0'; /*make it a null-terminated string*/
401 if (extract_type_1_socket_inode(lname, &inode) < 0)
402 if (extract_type_2_socket_inode(lname, &inode) < 0)
406 if (procfdlen - PATH_FD_SUFFl + PATH_CMDLINEl >=
409 strcpy(line + procfdlen-PATH_FD_SUFFl, PATH_CMDLINE);
410 fd = open(line, O_RDONLY);
413 cmdllen = read(fd, cmdlbuf, sizeof(cmdlbuf) - 1);
418 if (cmdllen < sizeof(cmdlbuf) - 1)
419 cmdlbuf[cmdllen]='\0';
420 if ((cmdlp = strrchr(cmdlbuf, '/')))
426 snprintf(finbuf, sizeof(finbuf), "%s/%s", direproc->d_name, cmdlp);
427 prg_cache_add(inode, finbuf);
438 if (prg_cache_loaded == 1) {
440 fprintf(stderr,_("(No info could be read for \"-p\": geteuid()=%d but you should be root.)\n"),
444 fprintf(stderr, _("(Not all processes could be identified, non-owned process info\n"
445 " will not be shown, you would have to be root to see it all.)\n"));
449 static const char *netrom_state[] =
457 static int netrom_info(void)
460 char buffer[256], dev[16];
461 int st, vs, vr, sendq, recvq, ret;
463 f = proc_fopen(_PATH_PROCNET_NR);
465 if (errno != ENOENT) {
466 perror(_PATH_PROCNET_NR);
469 if (flag_arg || flag_ver)
470 ESYSNOT("netstat", "AF NETROM");
476 printf(_("Active NET/ROM sockets\n"));
477 printf(_("User Dest Source Device State Vr/Vs Send-Q Recv-Q\n"));
478 fgets(buffer, 256, f);
480 while (fgets(buffer, 256, f)) {
484 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",
485 dev, &st, &vs, &vr, &sendq, &recvq);
487 printf(_("Problem reading data from %s\n"), _PATH_PROCNET_NR);
490 printf("%-9s %-9s %-9s %-6s %-11s %03d/%03d %-6d %-6d\n",
491 buffer, buffer + 10, buffer + 20,
494 vr, vs, sendq, recvq);
501 /* These enums are used by IPX too. :-( */
513 TCP_CLOSING /* now a valid state */
516 #if HAVE_AFINET || HAVE_AFINET6
518 static const char *tcp_state[] =
534 static void finish_this_one(int uid, unsigned long inode, const char *timers)
539 if (!(flag_not & FLAG_NUM_USER) && ((pw = getpwuid(uid)) != NULL))
540 printf(" %-10s ", pw->pw_name);
542 printf(" %-10d ", uid);
543 printf("%-10lu",inode);
546 printf(" %-" PROGNAME_WIDTHs "s",prg_cache_get(inode));
548 printf(" %s", timers);
552 static void igmp_do_one(int lnr, const char *line,const char *prot)
554 char mcast_addr[128];
556 struct sockaddr_in6 mcastaddr;
557 char addr6[INET6_ADDRSTRLEN];
559 extern struct aftype inet6_aftype;
561 struct sockaddr_in mcastaddr;
564 static int idx_flag = 0;
565 static int igmp6_flag = 0;
566 static char device[16];
567 int num, idx, refcnt;
571 /* igmp6 file does not have any comments on first line */
572 if ( strstr( line, "Device" ) == NULL ) {
576 /* 2.1.x kernels and up have Idx field */
577 /* 2.0.x and below do not have Idx field */
578 if ( strncmp( line, "Idx", strlen("Idx") ) == 0 )
586 if (igmp6_flag) { /* IPV6 */
588 num = sscanf( line, "%d %15s %64[0-9A-Fa-f] %d", &idx, device, mcast_addr, &refcnt );
590 /* Demangle what the kernel gives us */
591 sscanf(mcast_addr, "%08X%08X%08X%08X",
592 &in6.s6_addr32[0], &in6.s6_addr32[1],
593 &in6.s6_addr32[2], &in6.s6_addr32[3]);
594 in6.s6_addr32[0] = htonl(in6.s6_addr32[0]);
595 in6.s6_addr32[1] = htonl(in6.s6_addr32[1]);
596 in6.s6_addr32[2] = htonl(in6.s6_addr32[2]);
597 in6.s6_addr32[3] = htonl(in6.s6_addr32[3]);
598 inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6));
599 inet6_aftype.input(1, addr6, (struct sockaddr *) &mcastaddr);
600 mcastaddr.sin6_family = AF_INET6;
602 fprintf(stderr, _("warning, got bogus igmp6 line %d.\n"), lnr);
606 if ((ap = get_afntype(((struct sockaddr *) &mcastaddr)->sa_family)) == NULL) {
607 fprintf(stderr, _("netstat: unsupported address family %d !\n"),
608 ((struct sockaddr *) &mcastaddr)->sa_family);
611 safe_strncpy(mcast_addr, ap->sprint((struct sockaddr *) &mcastaddr,
612 flag_not), sizeof(mcast_addr));
613 printf("%-15s %-6d %s\n", device, refcnt, mcast_addr);
617 if (line[0] != '\t') {
619 if ((num = sscanf( line, "%d\t%10c", &idx, device)) < 2) {
620 fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr);
624 if ( (num = sscanf( line, "%10c", device )) < 1 ) {
625 fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr);
631 } else if ( line[0] == '\t' ) {
632 if ( (num = sscanf(line, "\t%8[0-9A-Fa-f] %d", mcast_addr, &refcnt)) < 2 ) {
633 fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr);
636 sscanf( mcast_addr, "%X",
637 &((struct sockaddr_in *) &mcastaddr)->sin_addr.s_addr );
638 ((struct sockaddr *) &mcastaddr)->sa_family = AF_INET;
640 fprintf(stderr, _("warning, got bogus igmp line %d.\n"), lnr);
644 if ((ap = get_afntype(((struct sockaddr *) &mcastaddr)->sa_family)) == NULL) {
645 fprintf(stderr, _("netstat: unsupported address family %d !\n"),
646 ((struct sockaddr *) &mcastaddr)->sa_family);
649 safe_strncpy(mcast_addr, ap->sprint((struct sockaddr *) &mcastaddr,
650 flag_not), sizeof(mcast_addr));
651 printf("%-15s %-6d %s\n", device, refcnt, mcast_addr );
657 static int x25_info(void)
659 FILE *f=proc_fopen(_PATH_PROCNET_X25);
660 char buffer[256],dev[16];
661 int st,vs,vr,sendq,recvq,lci;
662 static char *x25_state[5]=
670 if(!(f=proc_fopen(_PATH_PROCNET_X25)))
672 if (errno != ENOENT) {
673 perror(_PATH_PROCNET_X25);
676 if (flag_arg || flag_ver)
677 ESYSNOT("netstat","AF X25");
683 printf( _("Active X.25 sockets\n"));
684 /* IMHO, Vr/Vs is not very usefull --SF */
685 printf( _("Dest Source Device LCI State Vr/Vs Send-Q Recv-Q\n"));
687 while(fgets(buffer,256,f))
691 sscanf(buffer+22,"%s %d %d %d %d %*d %*d %*d %*d %*d %*d %d %d %*d",
692 dev,&lci,&st,&vs,&vr,&sendq,&recvq);
693 if (!(flag_all || lci))
695 printf("%-15s %-15s %-7s %-3d %-11s %02d/%02d %-6d %-6d\n",
707 static int igmp_info(void)
709 INFO_GUTS6(_PATH_PROCNET_IGMP, _PATH_PROCNET_IGMP6, "AF INET (igmp)",
710 igmp_do_one, "igmp", "igmp6");
713 static void tcp_do_one(int lnr, const char *line, const char *prot)
715 unsigned long rxq, txq, time_len, retr, inode;
716 int num, local_port, rem_port, d, state, uid, timer_run, timeout;
717 char rem_addr[128], local_addr[128], timers[64], buffer[1024], more[512];
720 struct sockaddr_in6 localaddr, remaddr;
721 char addr6[INET6_ADDRSTRLEN];
723 extern struct aftype inet6_aftype;
725 struct sockaddr_in localaddr, remaddr;
732 "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %lu %512s\n",
733 &d, local_addr, &local_port, rem_addr, &rem_port, &state,
734 &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more);
736 if (!flag_all && ((flag_lst && rem_port) || (!flag_lst && !rem_port)))
739 if (strlen(local_addr) > 8) {
741 /* Demangle what the kernel gives us */
742 sscanf(local_addr, "%08X%08X%08X%08X",
743 &in6.s6_addr32[0], &in6.s6_addr32[1],
744 &in6.s6_addr32[2], &in6.s6_addr32[3]);
745 inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6));
746 inet6_aftype.input(1, addr6, (struct sockaddr *) &localaddr);
747 sscanf(rem_addr, "%08X%08X%08X%08X",
748 &in6.s6_addr32[0], &in6.s6_addr32[1],
749 &in6.s6_addr32[2], &in6.s6_addr32[3]);
750 inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6));
751 inet6_aftype.input(1, addr6, (struct sockaddr *) &remaddr);
752 localaddr.sin6_family = AF_INET6;
753 remaddr.sin6_family = AF_INET6;
756 sscanf(local_addr, "%X",
757 &((struct sockaddr_in *) &localaddr)->sin_addr.s_addr);
758 sscanf(rem_addr, "%X",
759 &((struct sockaddr_in *) &remaddr)->sin_addr.s_addr);
760 ((struct sockaddr *) &localaddr)->sa_family = AF_INET;
761 ((struct sockaddr *) &remaddr)->sa_family = AF_INET;
765 fprintf(stderr, _("warning, got bogus tcp line.\n"));
768 if ((ap = get_afntype(((struct sockaddr *) &localaddr)->sa_family)) == NULL) {
769 fprintf(stderr, _("netstat: unsupported address family %d !\n"),
770 ((struct sockaddr *) &localaddr)->sa_family);
773 safe_strncpy(local_addr, ap->sprint((struct sockaddr *) &localaddr,
774 flag_not), sizeof(local_addr));
775 safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr, flag_not),
778 snprintf(buffer, sizeof(buffer), "%s",
779 get_sname(htons(local_port), "tcp",
780 flag_not & FLAG_NUM_PORT));
783 if ((strlen(local_addr) + strlen(buffer)) > 22)
784 local_addr[22 - strlen(buffer)] = '\0';
787 strcat(local_addr, ":");
788 strcat(local_addr, buffer);
789 snprintf(buffer, sizeof(buffer), "%s",
790 get_sname(htons(rem_port), "tcp", flag_not & FLAG_NUM_PORT));
793 if ((strlen(rem_addr) + strlen(buffer)) > 22)
794 rem_addr[22 - strlen(buffer)] = '\0';
797 strcat(rem_addr, ":");
798 strcat(rem_addr, buffer);
804 snprintf(timers, sizeof(timers), _("off (0.00/%ld/%d)"), retr, timeout);
808 snprintf(timers, sizeof(timers), _("on (%2.2f/%ld/%d)"),
809 (double) time_len / HZ, retr, timeout);
813 snprintf(timers, sizeof(timers), _("keepalive (%2.2f/%ld/%d)"),
814 (double) time_len / HZ, retr, timeout);
818 snprintf(timers, sizeof(timers), _("timewait (%2.2f/%ld/%d)"),
819 (double) time_len / HZ, retr, timeout);
823 snprintf(timers, sizeof(timers), _("unkn-%d (%2.2f/%ld/%d)"),
824 timer_run, (double) time_len / HZ, retr, timeout);
827 printf("%-4s %6ld %6ld %-*s %-*s %-11s",
828 prot, rxq, txq, netmax(23,strlen(local_addr)), local_addr, netmax(23,strlen(rem_addr)), rem_addr, _(tcp_state[state]));
830 finish_this_one(uid,inode,timers);
833 static int tcp_info(void)
835 INFO_GUTS6(_PATH_PROCNET_TCP, _PATH_PROCNET_TCP6, "AF INET (tcp)",
836 tcp_do_one, "tcp", "tcp6");
839 static void udp_do_one(int lnr, const char *line,const char *prot)
841 char buffer[8192], local_addr[64], rem_addr[64];
842 char *udp_state, timers[64], more[512];
843 int num, local_port, rem_port, d, state, timer_run, uid, timeout;
845 struct sockaddr_in6 localaddr, remaddr;
846 char addr6[INET6_ADDRSTRLEN];
848 extern struct aftype inet6_aftype;
850 struct sockaddr_in localaddr, remaddr;
853 unsigned long rxq, txq, time_len, retr, inode;
860 "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %lu %511s\n",
861 &d, local_addr, &local_port,
862 rem_addr, &rem_port, &state,
863 &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more);
865 if (strlen(local_addr) > 8) {
867 sscanf(local_addr, "%08X%08X%08X%08X",
868 &in6.s6_addr32[0], &in6.s6_addr32[1],
869 &in6.s6_addr32[2], &in6.s6_addr32[3]);
870 inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6));
871 inet6_aftype.input(1, addr6, (struct sockaddr *) &localaddr);
872 sscanf(rem_addr, "%08X%08X%08X%08X",
873 &in6.s6_addr32[0], &in6.s6_addr32[1],
874 &in6.s6_addr32[2], &in6.s6_addr32[3]);
875 inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6));
876 inet6_aftype.input(1, addr6, (struct sockaddr *) &remaddr);
877 localaddr.sin6_family = AF_INET6;
878 remaddr.sin6_family = AF_INET6;
881 sscanf(local_addr, "%X",
882 &((struct sockaddr_in *) &localaddr)->sin_addr.s_addr);
883 sscanf(rem_addr, "%X",
884 &((struct sockaddr_in *) &remaddr)->sin_addr.s_addr);
885 ((struct sockaddr *) &localaddr)->sa_family = AF_INET;
886 ((struct sockaddr *) &remaddr)->sa_family = AF_INET;
894 fprintf(stderr, _("warning, got bogus udp line.\n"));
897 if ((ap = get_afntype(((struct sockaddr *) &localaddr)->sa_family)) == NULL) {
898 fprintf(stderr, _("netstat: unsupported address family %d !\n"),
899 ((struct sockaddr *) &localaddr)->sa_family);
903 case TCP_ESTABLISHED:
904 udp_state = _("ESTABLISHED");
912 udp_state = _("UNKNOWN");
917 #define notnull(A) (((A.sin6_family == AF_INET6) && \
918 ((A.sin6_addr.s6_addr32[0]) || \
919 (A.sin6_addr.s6_addr32[1]) || \
920 (A.sin6_addr.s6_addr32[2]) || \
921 (A.sin6_addr.s6_addr32[3]))) || \
922 ((A.sin6_family == AF_INET) && \
923 ((struct sockaddr_in *) &A)->sin_addr.s_addr))
925 #define notnull(A) (A.sin_addr.s_addr)
928 if (flag_all || (notnull(remaddr) && !flag_lst) || (!notnull(remaddr) && flag_lst))
930 safe_strncpy(local_addr, ap->sprint((struct sockaddr *) &localaddr,
931 flag_not), sizeof(local_addr));
932 snprintf(buffer, sizeof(buffer), "%s",
933 get_sname(htons(local_port), "udp",
934 flag_not & FLAG_NUM_PORT));
935 if ((strlen(local_addr) + strlen(buffer)) > 22)
936 local_addr[22 - strlen(buffer)] = '\0';
937 strcat(local_addr, ":");
938 strcat(local_addr, buffer);
940 snprintf(buffer, sizeof(buffer), "%s",
941 get_sname(htons(rem_port), "udp", flag_not & FLAG_NUM_PORT));
942 safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr,
943 flag_not), sizeof(rem_addr));
944 if ((strlen(rem_addr) + strlen(buffer)) > 22)
945 rem_addr[22 - strlen(buffer)] = '\0';
946 strcat(rem_addr, ":");
947 strcat(rem_addr, buffer);
953 snprintf(timers, sizeof(timers), _("off (0.00/%ld/%d)"), retr, timeout);
958 snprintf(timers, sizeof(timers), _("on%d (%2.2f/%ld/%d)"), timer_run, (double) time_len / 100, retr, timeout);
962 snprintf(timers, sizeof(timers), _("unkn-%d (%2.2f/%ld/%d)"), timer_run, (double) time_len / 100,
966 printf("%-5s %6ld %6ld %-23s %-23s %-11s",
967 prot, rxq, txq, local_addr, rem_addr, udp_state);
969 finish_this_one(uid,inode,timers);
973 static int udp_info(void)
975 INFO_GUTS6(_PATH_PROCNET_UDP, _PATH_PROCNET_UDP6, "AF INET (udp)",
976 udp_do_one, "udp", "udp6");
979 static int udplite_info(void)
981 INFO_GUTS6(_PATH_PROCNET_UDPLITE, _PATH_PROCNET_UDPLITE6,
982 "AF INET (udplite)", udp_do_one, "udpl", "udpl6" );
985 static void raw_do_one(int lnr, const char *line,const char *prot)
987 char buffer[8192], local_addr[64], rem_addr[64];
988 char timers[64], more[512];
989 int num, local_port, rem_port, d, state, timer_run, uid, timeout;
991 struct sockaddr_in6 localaddr, remaddr;
992 char addr6[INET6_ADDRSTRLEN];
994 extern struct aftype inet6_aftype;
996 struct sockaddr_in localaddr, remaddr;
999 unsigned long rxq, txq, time_len, retr, inode;
1006 "%d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %X %lX:%lX %X:%lX %lX %d %d %lu %511s\n",
1007 &d, local_addr, &local_port, rem_addr, &rem_port, &state,
1008 &txq, &rxq, &timer_run, &time_len, &retr, &uid, &timeout, &inode, more);
1010 if (strlen(local_addr) > 8) {
1012 sscanf(local_addr, "%08X%08X%08X%08X",
1013 &in6.s6_addr32[0], &in6.s6_addr32[1],
1014 &in6.s6_addr32[2], &in6.s6_addr32[3]);
1015 inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6));
1016 inet6_aftype.input(1, addr6, (struct sockaddr *) &localaddr);
1017 sscanf(rem_addr, "%08X%08X%08X%08X",
1018 &in6.s6_addr32[0], &in6.s6_addr32[1],
1019 &in6.s6_addr32[2], &in6.s6_addr32[3]);
1020 inet_ntop(AF_INET6, &in6, addr6, sizeof(addr6));
1021 inet6_aftype.input(1, addr6, (struct sockaddr *) &remaddr);
1022 localaddr.sin6_family = AF_INET6;
1023 remaddr.sin6_family = AF_INET6;
1026 sscanf(local_addr, "%X",
1027 &((struct sockaddr_in *) &localaddr)->sin_addr.s_addr);
1028 sscanf(rem_addr, "%X",
1029 &((struct sockaddr_in *) &remaddr)->sin_addr.s_addr);
1030 ((struct sockaddr *) &localaddr)->sa_family = AF_INET;
1031 ((struct sockaddr *) &remaddr)->sa_family = AF_INET;
1034 if ((ap = get_afntype(localaddr.sin6_family)) == NULL) {
1035 fprintf(stderr, _("netstat: unsupported address family %d !\n"), localaddr.sin6_family);
1039 if ((ap = get_afntype(localaddr.sin_family)) == NULL) {
1040 fprintf(stderr, _("netstat: unsupported address family %d !\n"), localaddr.sin_family);
1049 fprintf(stderr, _("warning, got bogus raw line.\n"));
1053 if (flag_all || (notnull(remaddr) && !flag_lst) || (!notnull(remaddr) && flag_lst))
1055 snprintf(buffer, sizeof(buffer), "%s",
1056 get_sname(htons(local_port), "raw",
1057 flag_not & FLAG_NUM_PORT));
1058 safe_strncpy(local_addr, ap->sprint((struct sockaddr *) &localaddr,
1059 flag_not), sizeof(local_addr));
1060 if ((strlen(local_addr) + strlen(buffer)) > 22)
1061 local_addr[22 - strlen(buffer)] = '\0';
1062 strcat(local_addr, ":");
1063 strcat(local_addr, buffer);
1065 snprintf(buffer, sizeof(buffer), "%s",
1066 get_sname(htons(rem_port), "raw", flag_not & FLAG_NUM_PORT));
1067 safe_strncpy(rem_addr, ap->sprint((struct sockaddr *) &remaddr,
1068 flag_not), sizeof(rem_addr));
1069 if ((strlen(rem_addr) + strlen(buffer)) > 22)
1070 rem_addr[22 - strlen(buffer)] = '\0';
1071 strcat(rem_addr, ":");
1072 strcat(rem_addr, buffer);
1076 switch (timer_run) {
1078 snprintf(timers, sizeof(timers), _("off (0.00/%ld/%d)"), retr, timeout);
1083 snprintf(timers, sizeof(timers), _("on%d (%2.2f/%ld/%d)"), timer_run, (double) time_len / 100,
1088 snprintf(timers, sizeof(timers), _("unkn-%d (%2.2f/%ld/%d)"),
1089 timer_run, (double) time_len / 100,
1093 printf("%-4s %6ld %6ld %-23s %-23s %-11d",
1094 prot, rxq, txq, local_addr, rem_addr, state);
1096 finish_this_one(uid,inode,timers);
1100 static int raw_info(void)
1102 INFO_GUTS6(_PATH_PROCNET_RAW, _PATH_PROCNET_RAW6, "AF INET (raw)",
1103 raw_do_one, "raw", "raw6");
1113 static void unix_do_one(int nr, const char *line, const char *prot)
1116 char path[MAXPATHLEN], ss_flags[32];
1117 char *ss_proto, *ss_state, *ss_type;
1118 int num, state, type;
1120 unsigned long refcnt, proto, flags, inode;
1123 if (strstr(line, "Inode"))
1128 num = sscanf(line, "%p: %lX %lX %lX %X %X %lu %s",
1129 &d, &refcnt, &proto, &flags, &type, &state, &inode, path);
1131 fprintf(stderr, _("warning, got bogus unix line.\n"));
1134 if (!(has & HAS_INODE))
1135 snprintf(path,sizeof(path),"%lu",inode);
1138 if ((state == SS_UNCONNECTED) && (flags & SO_ACCEPTCON)) {
1158 ss_type = _("STREAM");
1162 ss_type = _("DGRAM");
1173 case SOCK_SEQPACKET:
1174 ss_type = _("SEQPACKET");
1178 ss_type = _("UNKNOWN");
1183 ss_state = _("FREE");
1186 case SS_UNCONNECTED:
1188 * Unconnected sockets may be listening
1191 if (flags & SO_ACCEPTCON) {
1192 ss_state = _("LISTENING");
1199 ss_state = _("CONNECTING");
1203 ss_state = _("CONNECTED");
1206 case SS_DISCONNECTING:
1207 ss_state = _("DISCONNECTING");
1211 ss_state = _("UNKNOWN");
1214 strcpy(ss_flags, "[ ");
1215 if (flags & SO_ACCEPTCON)
1216 strcat(ss_flags, "ACC ");
1217 if (flags & SO_WAITDATA)
1218 strcat(ss_flags, "W ");
1219 if (flags & SO_NOSPACE)
1220 strcat(ss_flags, "N ");
1222 strcat(ss_flags, "]");
1224 printf("%-5s %-6ld %-11s %-10s %-13s ",
1225 ss_proto, refcnt, ss_flags, ss_type, ss_state);
1226 if (has & HAS_INODE)
1227 printf("%-8lu",inode);
1231 printf(" %-" PROGNAME_WIDTHs "s",(has & HAS_INODE?prg_cache_get(inode):"-"));
1233 printf(" %s\n", path);
1236 static int unix_info(void)
1239 printf(_("Active UNIX domain sockets "));
1241 printf(_("(servers and established)"));
1244 printf(_("(only servers)"));
1246 printf(_("(w/o servers)"));
1249 printf(_("\nProto RefCnt Flags Type State I-Node "));
1250 print_progname_banner();
1251 printf(_(" Path\n")); /* xxx */
1254 INFO_GUTS(_PATH_PROCNET_UNIX, "AF UNIX", unix_do_one, "unix");
1261 static int ax25_info(void)
1264 char buffer[256], buf[16];
1265 char *src, *dst, *dev, *p;
1266 int st, vs, vr, sendq, recvq, ret;
1267 int new = -1; /* flag for new (2.1.x) kernels */
1268 static char *ax25_state[5] =
1276 if (!(f = proc_fopen(_PATH_PROCNET_AX25))) {
1277 if (errno != ENOENT) {
1278 perror(_PATH_PROCNET_AX25);
1281 if (flag_arg || flag_ver)
1282 ESYSNOT("netstat", "AF AX25");
1288 printf(_("Active AX.25 sockets\n"));
1289 printf(_("Dest Source Device State Vr/Vs Send-Q Recv-Q\n"));
1290 while (fgets(buffer, 256, f)) {
1292 if (!strncmp(buffer, "dest_addr", 9)) {
1294 continue; /* old kernels have a header line */
1299 * In a network connection with no user socket the Snd-Q, Rcv-Q
1300 * and Inode fields are empty in 2.0.x and '*' in 2.1.x
1309 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",
1310 buf, &st, &vs, &vr, &sendq, &recvq);
1311 if (ret != 4 && ret != 6) {
1312 printf(_("Problem reading data from %s\n"), _PATH_PROCNET_AX25);
1318 while (*p != ' ') p++;
1321 while (*p != ' ') p++;
1324 while (*p != ' ') p++;
1327 while (*p != ' ') p++;
1329 ret = sscanf(p, "%d %d %d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %d %d %*d",
1330 &st, &vs, &vr, &sendq, &recvq);
1331 if (ret != 3 && ret != 5) {
1332 printf(_("problem reading data from %s\n"), _PATH_PROCNET_AX25);
1336 * FIXME: digipeaters should be handled somehow.
1337 * For now we just strip them.
1340 while (*p && *p != ',') p++;
1343 printf("%-9s %-9s %-6s %-11s %03d/%03d %-6d %-6d\n",
1347 vr, vs, sendq, recvq);
1356 static int ipx_info(void)
1360 unsigned long txq, rxq;
1367 char sad[50], dad[50];
1369 unsigned sport = 0, dport = 0;
1372 f = proc_fopen(_PATH_PROCNET_IPX_SOCKET1);
1374 if (errno != ENOENT) {
1375 perror(_PATH_PROCNET_IPX_SOCKET1);
1378 f = proc_fopen(_PATH_PROCNET_IPX_SOCKET2);
1380 /* We need to check for directory */
1382 fstat(fileno(f), &s);
1383 if (!S_ISREG(s.st_mode)) {
1390 if (errno != ENOENT) {
1391 perror(_PATH_PROCNET_IPX_SOCKET2);
1394 if (flag_arg || flag_ver)
1395 ESYSNOT("netstat", "AF IPX");
1402 printf(_("Active IPX sockets\nProto Recv-Q Send-Q Local Address Foreign Address State")); /* xxx */
1404 printf(_(" User")); /* xxx */
1406 if ((ap = get_afntype(AF_IPX)) == NULL) {
1407 EINTERN("netstat.c", "AF_IPX missing");
1412 while (fgets(buf, 255, f) != NULL) {
1413 sscanf(buf, "%s %s %lX %lX %d %d",
1414 sad, dad, &txq, &rxq, &state, &uid);
1415 if ((st = rindex(sad, ':'))) {
1417 sscanf(st, "%X", &sport); /* net byt order */
1418 sport = ntohs(sport);
1420 EINTERN("netstat.c", "ipx socket format error in source port");
1424 if (strcmp(dad, "Not_Connected") != 0) {
1425 if ((st = rindex(dad, ':'))) {
1427 sscanf(st, "%X", &dport); /* net byt order */
1428 dport = ntohs(dport);
1430 EINTERN("netstat.c", "ipx soket format error in destination port");
1437 case TCP_ESTABLISHED:
1450 /* Fetch and resolve the Source */
1451 (void) ap->input(4, sad, &sa);
1452 safe_strncpy(buf, ap->sprint(&sa, flag_not), sizeof(buf));
1453 snprintf(sad, sizeof(sad), "%s:%04X", buf, sport);
1456 /* Fetch and resolve the Destination */
1457 (void) ap->input(4, dad, &sa);
1458 safe_strncpy(buf, ap->sprint(&sa, flag_not), sizeof(buf));
1459 snprintf(dad, sizeof(dad), "%s:%04X", buf, dport);
1463 printf("IPX %6ld %6ld %-26s %-26s %-5s", txq, rxq, sad, dad, st);
1465 if (!(flag_not & FLAG_NUM_USER) && ((pw = getpwuid(uid)) != NULL))
1466 printf(" %-10s", pw->pw_name);
1468 printf(" %-10d", uid);
1477 static int iface_info(void)
1480 if ((skfd = sockets_open(0)) < 0) {
1484 printf(_("Kernel Interface table\n"));
1488 printf(_("Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n"));
1491 if (for_all_interfaces(do_if_print, &flag_all) < 0) {
1492 perror(_("missing interface information"));
1506 static void version(void)
1508 printf("%s\n%s\n%s\n%s\n", Release, Version, Signature, Features);
1513 static void usage(void)
1515 fprintf(stderr, _("usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}\n"));
1516 fprintf(stderr, _(" netstat [-vWnNcaeol] [<Socket> ...]\n"));
1517 fprintf(stderr, _(" netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }\n\n"));
1519 fprintf(stderr, _(" -r, --route display routing table\n"));
1520 fprintf(stderr, _(" -i, --interfaces display interface table\n"));
1521 fprintf(stderr, _(" -g, --groups display multicast group memberships\n"));
1522 fprintf(stderr, _(" -s, --statistics display networking statistics (like SNMP)\n"));
1523 #if HAVE_FW_MASQUERADE
1524 fprintf(stderr, _(" -M, --masquerade display masqueraded connections\n\n"));
1526 fprintf(stderr, _(" -v, --verbose be verbose\n"));
1527 fprintf(stderr, _(" -W, --wide don't truncate IP addresses\n"));
1528 fprintf(stderr, _(" -n, --numeric don't resolve names\n"));
1529 fprintf(stderr, _(" --numeric-hosts don't resolve host names\n"));
1530 fprintf(stderr, _(" --numeric-ports don't resolve port names\n"));
1531 fprintf(stderr, _(" --numeric-users don't resolve user names\n"));
1532 fprintf(stderr, _(" -N, --symbolic resolve hardware names\n"));
1533 fprintf(stderr, _(" -e, --extend display other/more information\n"));
1534 fprintf(stderr, _(" -p, --programs display PID/Program name for sockets\n"));
1535 fprintf(stderr, _(" -c, --continuous continuous listing\n\n"));
1536 fprintf(stderr, _(" -l, --listening display listening server sockets\n"));
1537 fprintf(stderr, _(" -a, --all, --listening display all sockets (default: connected)\n"));
1538 fprintf(stderr, _(" -o, --timers display timers\n"));
1539 fprintf(stderr, _(" -F, --fib display Forwarding Information Base (default)\n"));
1540 fprintf(stderr, _(" -C, --cache display routing cache instead of FIB\n\n"));
1542 fprintf(stderr, _(" <Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-w|--raw} {-x|--unix} --ax25 --ipx --netrom\n"));
1543 fprintf(stderr, _(" <AF>=Use '-6|-4' or '-A <af>' or '--<af>'; default: %s\n"), DFLT_AF);
1544 fprintf(stderr, _(" List of possible address families (which support routing):\n"));
1545 print_aflist(1); /* 1 = routeable */
1551 (int argc, char *argv[]) {
1554 static struct option longopts[] =
1557 {"version", 0, 0, 'V'},
1558 {"interfaces", 0, 0, 'i'},
1559 {"help", 0, 0, 'h'},
1560 {"route", 0, 0, 'r'},
1561 #if HAVE_FW_MASQUERADE
1562 {"masquerade", 0, 0, 'M'},
1564 {"protocol", 1, 0, 'A'},
1567 {"udplite", 0, 0, 'U'},
1569 {"unix", 0, 0, 'x'},
1570 {"listening", 0, 0, 'l'},
1572 {"timers", 0, 0, 'o'},
1573 {"continuous", 0, 0, 'c'},
1574 {"extend", 0, 0, 'e'},
1575 {"programs", 0, 0, 'p'},
1576 {"verbose", 0, 0, 'v'},
1577 {"statistics", 0, 0, 's'},
1578 {"wide", 0, 0, 'W'},
1579 {"numeric", 0, 0, 'n'},
1580 {"numeric-hosts", 0, 0, '!'},
1581 {"numeric-ports", 0, 0, '@'},
1582 {"numeric-users", 0, 0, '#'},
1583 {"symbolic", 0, 0, 'N'},
1584 {"cache", 0, 0, 'C'},
1586 {"groups", 0, 0, 'g'},
1591 setlocale (LC_ALL, "");
1592 bindtextdomain("net-tools", "/usr/share/locale");
1593 textdomain("net-tools");
1595 getroute_init(); /* Set up AF routing support */
1598 while ((i = getopt_long(argc, argv, "A:CFMacdeghilnNoprstuUvVWwx64?", longopts, &lop)) != EOF)
1603 if (lop < 0 || lop >= AFTRANS_CNT) {
1604 EINTERN("netstat.c", "longopts 1 range");
1607 if (aftrans_opt(longopts[lop].name))
1611 if (aftrans_opt(optarg))
1646 flag_not |= FLAG_NUM;
1649 flag_not |= FLAG_NUM_HOST;
1652 flag_not |= FLAG_NUM_PORT;
1655 flag_not |= FLAG_NUM_USER;
1658 flag_not |= FLAG_SYM;
1661 flag_cf |= FLAG_CACHE;
1664 flag_cf |= FLAG_FIB;
1670 if (aftrans_opt("inet6"))
1674 if (aftrans_opt("inet"))
1681 flag_ver |= FLAG_VERBOSE;
1699 if (aftrans_opt("unix"))
1709 if (flag_int + flag_rou + flag_mas + flag_sta > 1)
1712 if ((flag_inet || flag_inet6 || flag_sta) &&
1713 !(flag_tcp || flag_udp || flag_udplite || flag_raw))
1714 flag_tcp = flag_udp = flag_udplite = flag_raw = 1;
1716 if ((flag_tcp || flag_udp || flag_udplite || flag_raw || flag_igmp) &&
1717 !(flag_inet || flag_inet6))
1718 flag_inet = flag_inet6 = 1;
1720 flag_arg = flag_tcp + flag_udplite + flag_udp + flag_raw + flag_unx
1721 + flag_ipx + flag_ax25 + flag_netrom + flag_igmp + flag_x25 + flag_rose;
1724 #if HAVE_FW_MASQUERADE && HAVE_AFINET
1725 #if MORE_THAN_ONE_MASQ_AF
1727 strcpy(afname, DFLT_AF);
1730 i = ip_masq_info(flag_not & FLAG_NUM_HOST,
1731 flag_not & FLAG_NUM_PORT, flag_exp);
1737 ENOSUPP("netstat", "FW_MASQUERADE");
1745 strcpy(afname, DFLT_AF);
1747 if (!strcmp(afname, "inet")) {
1750 parsesnmp(flag_raw, flag_tcp, flag_udp);
1752 ENOSUPP("netstat", "AF INET");
1754 } else if(!strcmp(afname, "inet6")) {
1757 parsesnmp6(flag_raw, flag_tcp, flag_udp);
1759 ENOSUPP("netstat", "AF INET6");
1762 printf(_("netstat: No statistics support for specified address family: %s\n"), afname);
1772 strcpy(afname, DFLT_AF);
1776 else if (flag_exp == 1)
1779 options = (flag_exp & FLAG_EXT) | flag_not | flag_cf | flag_ver;
1781 options |= FLAG_FIB;
1784 i = route_info(afname, options);
1801 if (!flag_arg || flag_tcp || flag_udp || flag_udplite || flag_raw) {
1804 printf(_("Active Internet connections ")); /* xxx */
1807 printf(_("(servers and established)"));
1810 printf(_("(only servers)"));
1812 printf(_("(w/o servers)"));
1814 printf(_("\nProto Recv-Q Send-Q Local Address Foreign Address State ")); /* xxx */
1816 printf(_(" User Inode "));
1817 print_progname_banner();
1819 printf(_(" Timer")); /* xxx */
1824 ENOSUPP("netstat", "AF INET");
1829 if (!flag_arg || flag_tcp) {
1835 if (!flag_arg || flag_udp) {
1841 if (!flag_arg || flag_udplite) {
1847 if (!flag_arg || flag_raw) {
1857 printf( _("IPv4 Group Memberships\n") );
1858 printf( _("Interface RefCnt Group\n") );
1859 printf( "--------------- ------ ---------------------\n" );
1866 if (!flag_arg || flag_unx) {
1875 ENOSUPP("netstat", "AF UNIX");
1879 if (!flag_arg || flag_ipx) {
1887 ENOSUPP("netstat", "AF IPX");
1891 if (!flag_arg || flag_ax25) {
1899 ENOSUPP("netstat", "AF AX25");
1903 if(!flag_arg || flag_x25) {
1912 ENOSUPP("netstat", "AF X25");
1916 if (!flag_arg || flag_netrom) {
1924 ENOSUPP("netstat", "AF NETROM");
1928 if (!flag_arg || flag_rose) {
1929 #if 0 && HAVE_AFROSE
1936 ENOSUPP("netstat", "AF ROSE");