X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=networking%2Fnetstat.c;h=3dad57a40e97071ced3f6c91814893836ff173d2;hb=52933d47bd86d6d992f7290fad93d63b53f7a15f;hp=6d91bb3f4fc5dbac5201d6f4fc5b177394ac7514;hpb=c9c1a41c581101f53cc36efae53cd8ebb568962f;p=oweals%2Fbusybox.git diff --git a/networking/netstat.c b/networking/netstat.c index 6d91bb3f4..3dad57a40 100644 --- a/networking/netstat.c +++ b/networking/netstat.c @@ -18,16 +18,17 @@ extern void displayroutes(int noresolve, int netstatfmt); #endif -#define NETSTAT_CONNECTED 0x01 -#define NETSTAT_LISTENING 0x02 -#define NETSTAT_NUMERIC 0x04 -#define NETSTAT_TCP 0x10 -#define NETSTAT_UDP 0x20 -#define NETSTAT_RAW 0x40 -#define NETSTAT_UNIX 0x80 - -static int flags = NETSTAT_CONNECTED | - NETSTAT_TCP | NETSTAT_UDP | NETSTAT_RAW | NETSTAT_UNIX; +#define NETSTAT_CONNECTED 0x01 +#define NETSTAT_LISTENING 0x02 +#define NETSTAT_NUMERIC 0x04 +/* Must match getopt32 option string */ +#define NETSTAT_TCP 0x10 +#define NETSTAT_UDP 0x20 +#define NETSTAT_RAW 0x40 +#define NETSTAT_UNIX 0x80 +#define NETSTAT_ALLPROTO (NETSTAT_TCP|NETSTAT_UDP|NETSTAT_RAW|NETSTAT_UNIX) + +static int flags = NETSTAT_CONNECTED | NETSTAT_ALLPROTO; #define PROGNAME_WIDTHs PROGNAME_WIDTH1(PROGNAME_WIDTH) #define PROGNAME_WIDTH1(s) PROGNAME_WIDTH2(s) @@ -165,7 +166,7 @@ static void tcp_do_one(int lnr, const char *line) } if (num < 10) { - bb_error_msg("warning, got bogus tcp line."); + bb_error_msg("warning, got bogus tcp line"); return; } state_str = tcp_state[state]; @@ -236,7 +237,7 @@ static void udp_do_one(int lnr, const char *line) } if (num < 10) { - bb_error_msg("warning, got bogus udp line."); + bb_error_msg("warning, got bogus udp line"); return; } switch (state) { @@ -330,7 +331,7 @@ static void raw_do_one(int lnr, const char *line) } if (num < 10) { - bb_error_msg("warning, got bogus raw line."); + bb_error_msg("warning, got bogus raw line"); return; } state_str=itoa(state); @@ -383,7 +384,7 @@ static void unix_do_one(int nr, const char *line) num = sscanf(line, "%p: %lX %lX %lX %X %X %d %s", &d, &refcnt, &proto, &unix_flags, &type, &state, &inode, path); if (num < 6) { - bb_error_msg("warning, got bogus unix line."); + bb_error_msg("warning, got bogus unix line"); return; } if (!(has & HAS_INODE)) @@ -495,7 +496,6 @@ static void unix_do_one(int nr, const char *line) static void do_info(const char *file, const char *name, void (*proc)(int, const char *)) { - char buffer[8192]; int lnr = 0; FILE *procinfo; @@ -504,12 +504,15 @@ static void do_info(const char *file, const char *name, void (*proc)(int, const if (errno != ENOENT) { perror(file); } else { - bb_error_msg("no support for `%s' on this system.", name); + bb_error_msg("no support for '%s' on this system", name); } } else { do { - if (fgets(buffer, sizeof(buffer), procinfo)) + char *buffer = xmalloc_fgets(procinfo); + if (buffer) { (proc)(lnr++, buffer); + free(buffer); + } } while (!feof(procinfo)); fclose(procinfo); } @@ -521,74 +524,58 @@ static void do_info(const char *file, const char *name, void (*proc)(int, const int netstat_main(int argc, char **argv) { - int opt; - int new_flags=0; - int showroute = 0, extended = 0; + enum { + OPT_extended = 0x4, + OPT_showroute = 0x100, + }; + unsigned opt; #ifdef CONFIG_FEATURE_IPV6 - int inet=1; - int inet6=1; + int inet = 1; + int inet6 = 1; #else # define inet 1 # define inet6 0 #endif - while ((opt = getopt(argc, argv, "laenrtuwx")) != -1) - switch (opt) { - case 'l': - flags &= ~NETSTAT_CONNECTED; - flags |= NETSTAT_LISTENING; - break; - case 'a': - flags |= NETSTAT_LISTENING | NETSTAT_CONNECTED; - break; - case 'n': - flags |= NETSTAT_NUMERIC; - break; - case 'r': - showroute = 1; - break; - case 'e': - extended = 1; - break; - case 't': - new_flags |= NETSTAT_TCP; - break; - case 'u': - new_flags |= NETSTAT_UDP; - break; - case 'w': - new_flags |= NETSTAT_RAW; - break; - case 'x': - new_flags |= NETSTAT_UNIX; - break; - default: - bb_show_usage(); - } - if ( showroute ) { + + /* Option string must match NETSTAT_xxx constants */ + opt = getopt32(argc, argv, "laentuwxr"); + if (opt & 0x1) { // -l + flags &= ~NETSTAT_CONNECTED; + flags |= NETSTAT_LISTENING; + } + if (opt & 0x2) flags |= NETSTAT_LISTENING | NETSTAT_CONNECTED; // -a + //if (opt & 0x4) // -e + if (opt & 0x8) flags |= NETSTAT_NUMERIC; // -n + //if (opt & 0x10) // -t: NETSTAT_TCP + //if (opt & 0x20) // -u: NETSTAT_UDP + //if (opt & 0x40) // -w: NETSTAT_RAW + //if (opt & 0x80) // -x: NETSTAT_UNIX + if (opt & OPT_showroute) { // -r #ifdef CONFIG_ROUTE - displayroutes ( flags & NETSTAT_NUMERIC, !extended ); + displayroutes(flags & NETSTAT_NUMERIC, !(opt & OPT_extended)); return 0; #else - bb_error_msg_and_die( "-r (display routing table) is not compiled in." ); + bb_error_msg_and_die("-r (display routing table) is not compiled in"); #endif } - if (new_flags) { - flags &= ~(NETSTAT_TCP|NETSTAT_UDP|NETSTAT_RAW|NETSTAT_UNIX); - flags |= new_flags; + opt &= NETSTAT_ALLPROTO; + if (opt) { + flags &= ~NETSTAT_ALLPROTO; + flags |= opt; } - if (flags&(NETSTAT_TCP|NETSTAT_UDP|NETSTAT_RAW)) { + if (flags & (NETSTAT_TCP|NETSTAT_UDP|NETSTAT_RAW)) { printf("Active Internet connections "); /* xxx */ if ((flags&(NETSTAT_LISTENING|NETSTAT_CONNECTED))==(NETSTAT_LISTENING|NETSTAT_CONNECTED)) printf("(servers and established)"); else { - if (flags&NETSTAT_LISTENING) + if (flags & NETSTAT_LISTENING) printf("(only servers)"); else printf("(w/o servers)"); } - printf("\nProto Recv-Q Send-Q Local Address Foreign Address State \n"); + printf("\nProto Recv-Q Send-Q Local Address Foreign Address State\n"); } if (inet && flags&NETSTAT_TCP) do_info(_PATH_PROCNET_TCP,"AF INET (tcp)",tcp_do_one);