summaryrefslogtreecommitdiff
path: root/netstat.c
diff options
context:
space:
mode:
authorBernd Eckenfels <net-tools@lina.inka.de>2008-12-01 23:15:35 +0000
committerBernd Eckenfels <net-tools@lina.inka.de>2008-12-01 23:15:35 +0000
commit91f3c44c77df1962c06f52f01fcd29e29cc98fb4 (patch)
treecf555f65f30ce9bf5277e5e819e1c3e3f80c78c8 /netstat.c
parent38720e894744e883c2b37c92c16c793f790346ed (diff)
downloadnet-tools-91f3c44c77df1962c06f52f01fcd29e29cc98fb4.tar.gz
net-tools-91f3c44c77df1962c06f52f01fcd29e29cc98fb4.tar.bz2
net-tools-91f3c44c77df1962c06f52f01fcd29e29cc98fb4.zip
UDPlite Support for net-stat by Brian Micek <bmicek@gmail.com>
Diffstat (limited to 'netstat.c')
-rw-r--r--netstat.c99
1 files changed, 56 insertions, 43 deletions
diff --git a/netstat.c b/netstat.c
index c8460bf..8de43b9 100644
--- a/netstat.c
+++ b/netstat.c
@@ -6,7 +6,7 @@
* 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>
@@ -58,6 +58,7 @@
*
*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
@@ -125,7 +126,7 @@ typedef enum {
#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
@@ -146,6 +147,7 @@ int flag_opt = 0;
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;
@@ -156,7 +158,7 @@ int flag_ver = 0;
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) { \
@@ -170,46 +172,46 @@ FILE *procinfo;
} 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)
@@ -541,7 +543,7 @@ static void finish_this_one(int uid, unsigned long inode, const char *timers)
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
@@ -699,15 +701,14 @@ static int x25_info(void)
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;
@@ -728,7 +729,6 @@ static void tcp_do_one(int lnr, const char *line)
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],
@@ -744,7 +744,6 @@ static void tcp_do_one(int lnr, const char *line)
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",
@@ -817,7 +816,7 @@ static void tcp_do_one(int lnr, const char *line)
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);
}
@@ -826,15 +825,14 @@ static void tcp_do_one(int lnr, const char *line)
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];
@@ -858,7 +856,6 @@ static void udp_do_one(int lnr, const char *line)
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]);
@@ -873,7 +870,6 @@ static void udp_do_one(int lnr, const char *line)
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",
@@ -959,8 +955,8 @@ static void udp_do_one(int lnr, const char *line)
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);
}
@@ -969,15 +965,20 @@ static void udp_do_one(int lnr, const char *line)
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];
@@ -1000,7 +1001,6 @@ static void raw_do_one(int lnr, const char *line)
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]);
@@ -1015,7 +1015,6 @@ static void raw_do_one(int lnr, const char *line)
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",
@@ -1084,7 +1083,7 @@ static void raw_do_one(int lnr, const char *line)
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);
}
@@ -1093,7 +1092,7 @@ static void raw_do_one(int lnr, const char *line)
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
@@ -1103,7 +1102,7 @@ static int raw_info(void)
#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];
@@ -1244,7 +1243,7 @@ static int unix_info(void)
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
@@ -1532,7 +1531,7 @@ static void usage(void)
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 */
@@ -1557,6 +1556,7 @@ int main
{"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'},
@@ -1587,7 +1587,7 @@ int main
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;
@@ -1683,6 +1683,9 @@ int main
case 'u':
flag_udp++;
break;
+ case 'U':
+ flag_udplite++;
+ break;
case 'w':
flag_raw++;
break;
@@ -1700,14 +1703,16 @@ int main
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
@@ -1787,7 +1792,7 @@ int main
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 */
@@ -1820,11 +1825,19 @@ int main
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)