* NET-3 Networking Distribution for the LINUX operating
* system.
*
- * Version: $Id: netstat.c,v 1.60 2008/11/16 16:45:08 luk Exp $
+ * Version: $Id: netstat.c,v 1.61 2008/12/01 23:15:35 ecki Exp $
*
* Authors: Fred Baumgarten, <dc6iq@insu1.etec.uni-karlsruhe.de>
* Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
*
*990420 {1.38} Tuan Hoang removed a useless assignment from igmp_do_one()
*20010404 {1.39} Arnaldo Carvalho de Melo - use setlocale
+ *20081201 {1.42} Brian Micek added -L|--udplite options for RFC 3828
*
* This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General
#define FEATURE_NETSTAT
#include "lib/net-features.h"
-char *Release = RELEASE, *Version = "netstat 1.42 (2001-04-15)", *Signature = "Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang and others";
+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";
#define E_READ -1
int flag_raw = 0;
int flag_tcp = 0;
int flag_udp = 0;
+int flag_udplite = 0;
int flag_igmp= 0;
int flag_rom = 0;
int flag_exp = 1;
FILE *procinfo;
-#define INFO_GUTS1(file,name,proc) \
+#define INFO_GUTS1(file,name,proc,prot) \
procinfo = proc_fopen((file)); \
if (procinfo == NULL) { \
if (errno != ENOENT) { \
} else { \
do { \
if (fgets(buffer, sizeof(buffer), procinfo)) \
- (proc)(lnr++, buffer); \
+ (proc)(lnr++, buffer,prot); \
} while (!feof(procinfo)); \
fclose(procinfo); \
}
#if HAVE_AFINET6
-#define INFO_GUTS2(file,proc) \
+#define INFO_GUTS2(file,proc,prot) \
lnr = 0; \
procinfo = proc_fopen((file)); \
if (procinfo != NULL) { \
do { \
if (fgets(buffer, sizeof(buffer), procinfo)) \
- (proc)(lnr++, buffer); \
+ (proc)(lnr++, buffer,prot); \
} while (!feof(procinfo)); \
fclose(procinfo); \
}
#else
-#define INFO_GUTS2(file,proc)
+#define INFO_GUTS2(file,proc,prot)
#endif
#define INFO_GUTS3 \
return rc;
-#define INFO_GUTS6(file,file6,name,proc) \
+#define INFO_GUTS6(file,file6,name,proc,prot4,prot6) \
char buffer[8192]; \
int rc = 0; \
int lnr = 0; \
if (!flag_arg || flag_inet) { \
- INFO_GUTS1(file,name,proc) \
+ INFO_GUTS1(file,name,proc,prot4) \
} \
if (!flag_arg || flag_inet6) { \
- INFO_GUTS2(file6,proc) \
+ INFO_GUTS2(file6,proc,prot6) \
} \
INFO_GUTS3
-#define INFO_GUTS(file,name,proc) \
+#define INFO_GUTS(file,name,proc,prot) \
char buffer[8192]; \
int rc = 0; \
int lnr = 0; \
- INFO_GUTS1(file,name,proc) \
+ INFO_GUTS1(file,name,proc,prot) \
INFO_GUTS3
#define PROGNAME_WIDTHs PROGNAME_WIDTH1(PROGNAME_WIDTH)
putchar('\n');
}
-static void igmp_do_one(int lnr, const char *line)
+static void igmp_do_one(int lnr, const char *line,const char *prot)
{
char mcast_addr[128];
#if HAVE_AFINET6
static int igmp_info(void)
{
INFO_GUTS6(_PATH_PROCNET_IGMP, _PATH_PROCNET_IGMP6, "AF INET (igmp)",
- igmp_do_one);
+ igmp_do_one, "igmp", "igmp6");
}
-static void tcp_do_one(int lnr, const char *line)
+static void tcp_do_one(int lnr, const char *line, const char *prot)
{
unsigned long rxq, txq, time_len, retr, inode;
int num, local_port, rem_port, d, state, uid, timer_run, timeout;
char rem_addr[128], local_addr[128], timers[64], buffer[1024], more[512];
- char *protname;
struct aftype *ap;
#if HAVE_AFINET6
struct sockaddr_in6 localaddr, remaddr;
if (strlen(local_addr) > 8) {
#if HAVE_AFINET6
- protname = "tcp6";
/* Demangle what the kernel gives us */
sscanf(local_addr, "%08X%08X%08X%08X",
&in6.s6_addr32[0], &in6.s6_addr32[1],
remaddr.sin6_family = AF_INET6;
#endif
} else {
- protname = "tcp";
sscanf(local_addr, "%X",
&((struct sockaddr_in *) &localaddr)->sin_addr.s_addr);
sscanf(rem_addr, "%X",
break;
}
printf("%-4s %6ld %6ld %-*s %-*s %-11s",
- protname, rxq, txq, netmax(23,strlen(local_addr)), local_addr, netmax(23,strlen(rem_addr)), rem_addr, _(tcp_state[state]));
+ prot, rxq, txq, netmax(23,strlen(local_addr)), local_addr, netmax(23,strlen(rem_addr)), rem_addr, _(tcp_state[state]));
finish_this_one(uid,inode,timers);
}
static int tcp_info(void)
{
INFO_GUTS6(_PATH_PROCNET_TCP, _PATH_PROCNET_TCP6, "AF INET (tcp)",
- tcp_do_one);
+ tcp_do_one, "tcp", "tcp6");
}
-static void udp_do_one(int lnr, const char *line)
+static void udp_do_one(int lnr, const char *line,const char *prot)
{
char buffer[8192], local_addr[64], rem_addr[64];
char *udp_state, timers[64], more[512];
int num, local_port, rem_port, d, state, timer_run, uid, timeout;
- char *protname;
#if HAVE_AFINET6
struct sockaddr_in6 localaddr, remaddr;
char addr6[INET6_ADDRSTRLEN];
if (strlen(local_addr) > 8) {
#if HAVE_AFINET6
- protname="udp6";
sscanf(local_addr, "%08X%08X%08X%08X",
&in6.s6_addr32[0], &in6.s6_addr32[1],
&in6.s6_addr32[2], &in6.s6_addr32[3]);
remaddr.sin6_family = AF_INET6;
#endif
} else {
- protname="udp";
sscanf(local_addr, "%X",
&((struct sockaddr_in *) &localaddr)->sin_addr.s_addr);
sscanf(rem_addr, "%X",
retr, timeout);
break;
}
- printf("%-4s %6ld %6ld %-23s %-23s %-11s",
- protname, rxq, txq, local_addr, rem_addr, udp_state);
+ printf("%-5s %6ld %6ld %-23s %-23s %-11s",
+ prot, rxq, txq, local_addr, rem_addr, udp_state);
finish_this_one(uid,inode,timers);
}
static int udp_info(void)
{
INFO_GUTS6(_PATH_PROCNET_UDP, _PATH_PROCNET_UDP6, "AF INET (udp)",
- udp_do_one);
+ udp_do_one, "upd", "udp6");
}
-static void raw_do_one(int lnr, const char *line)
+static int udplite_info(void)
+{
+ INFO_GUTS6(_PATH_PROCNET_UDPLITE, _PATH_PROCNET_UDPLITE6,
+ "AF INET (udplite)", udp_do_one, "udpl", "udpl6" );
+}
+
+static void raw_do_one(int lnr, const char *line,const char *prot)
{
char buffer[8192], local_addr[64], rem_addr[64];
char timers[64], more[512];
int num, local_port, rem_port, d, state, timer_run, uid, timeout;
- char *protname;
#if HAVE_AFINET6
struct sockaddr_in6 localaddr, remaddr;
char addr6[INET6_ADDRSTRLEN];
if (strlen(local_addr) > 8) {
#if HAVE_AFINET6
- protname = "raw6";
sscanf(local_addr, "%08X%08X%08X%08X",
&in6.s6_addr32[0], &in6.s6_addr32[1],
&in6.s6_addr32[2], &in6.s6_addr32[3]);
remaddr.sin6_family = AF_INET6;
#endif
} else {
- protname = "raw";
sscanf(local_addr, "%X",
&((struct sockaddr_in *) &localaddr)->sin_addr.s_addr);
sscanf(rem_addr, "%X",
break;
}
printf("%-4s %6ld %6ld %-23s %-23s %-11d",
- protname, rxq, txq, local_addr, rem_addr, state);
+ prot, rxq, txq, local_addr, rem_addr, state);
finish_this_one(uid,inode,timers);
}
static int raw_info(void)
{
INFO_GUTS6(_PATH_PROCNET_RAW, _PATH_PROCNET_RAW6, "AF INET (raw)",
- raw_do_one);
+ raw_do_one, "raw", "raw6");
}
#endif
#define HAS_INODE 1
-static void unix_do_one(int nr, const char *line)
+static void unix_do_one(int nr, const char *line, const char *prot)
{
static int has = 0;
char path[MAXPATHLEN], ss_flags[32];
printf(_(" Path\n")); /* xxx */
{
- INFO_GUTS(_PATH_PROCNET_UNIX, "AF UNIX", unix_do_one);
+ INFO_GUTS(_PATH_PROCNET_UNIX, "AF UNIX", unix_do_one, "unix");
}
}
#endif
fprintf(stderr, _(" -F, --fib display Forwarding Information Base (default)\n"));
fprintf(stderr, _(" -C, --cache display routing cache instead of FIB\n\n"));
- fprintf(stderr, _(" <Socket>={-t|--tcp} {-u|--udp} {-w|--raw} {-x|--unix} --ax25 --ipx --netrom\n"));
+ fprintf(stderr, _(" <Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-w|--raw} {-x|--unix} --ax25 --ipx --netrom\n"));
fprintf(stderr, _(" <AF>=Use '-6|-4' or '-A <af>' or '--<af>'; default: %s\n"), DFLT_AF);
fprintf(stderr, _(" List of possible address families (which support routing):\n"));
print_aflist(1); /* 1 = routeable */
{"protocol", 1, 0, 'A'},
{"tcp", 0, 0, 't'},
{"udp", 0, 0, 'u'},
+ {"udplite", 0, 0, 'U'},
{"raw", 0, 0, 'w'},
{"unix", 0, 0, 'x'},
{"listening", 0, 0, 'l'},
getroute_init(); /* Set up AF routing support */
afname[0] = '\0';
- while ((i = getopt_long(argc, argv, "MCFA:acdegphinNorstuWVv?wxl64", longopts, &lop)) != EOF)
+ while ((i = getopt_long(argc, argv, "MCFA:acdegphinNorstuWVv?wxl64U", longopts, &lop)) != EOF)
switch (i) {
case -1:
break;
case 'u':
flag_udp++;
break;
+ case 'U':
+ flag_udplite++;
+ break;
case 'w':
flag_raw++;
break;
if (flag_int + flag_rou + flag_mas + flag_sta > 1)
usage();
- if ((flag_inet || flag_inet6 || flag_sta) && !(flag_tcp || flag_udp || flag_raw))
- flag_tcp = flag_udp = flag_raw = 1;
+ if ((flag_inet || flag_inet6 || flag_sta) &&
+ !(flag_tcp || flag_udp || flag_udplite || flag_raw))
+ flag_tcp = flag_udp = flag_udplite = flag_raw = 1;
- if ((flag_tcp || flag_udp || flag_raw || flag_igmp) && !(flag_inet || flag_inet6))
+ if ((flag_tcp || flag_udp || flag_udplite || flag_raw || flag_igmp) &&
+ !(flag_inet || flag_inet6))
flag_inet = flag_inet6 = 1;
- flag_arg = flag_tcp + flag_udp + flag_raw + flag_unx + flag_ipx
- + flag_ax25 + flag_netrom + flag_igmp + flag_x25 + flag_rose;
+ flag_arg = flag_tcp + flag_udplite + flag_udp + flag_raw + flag_unx
+ + flag_ipx + flag_ax25 + flag_netrom + flag_igmp + flag_x25 + flag_rose;
if (flag_mas) {
#if HAVE_FW_MASQUERADE && HAVE_AFINET
return (i);
}
for (;;) {
- if (!flag_arg || flag_tcp || flag_udp || flag_raw) {
+ if (!flag_arg || flag_tcp || flag_udp || flag_udplite || flag_raw) {
#if HAVE_AFINET
prg_cache_load();
printf(_("Active Internet connections ")); /* xxx */
if (i)
return (i);
}
+
if (!flag_arg || flag_udp) {
i = udp_info();
if (i)
return (i);
}
+
+ if (!flag_arg || flag_udplite) {
+ i = udplite_info();
+ if (i)
+ return (i);
+ }
+
if (!flag_arg || flag_raw) {
i = raw_info();
if (i)