*
* Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
+//config:config NETSTAT
+//config: bool "netstat (10 kb)"
+//config: default y
+//config: select PLATFORM_LINUX
+//config: help
+//config: netstat prints information about the Linux networking subsystem.
+//config:
+//config:config FEATURE_NETSTAT_WIDE
+//config: bool "Enable wide output"
+//config: default y
+//config: depends on NETSTAT
+//config: help
+//config: Add support for wide columns. Useful when displaying IPv6 addresses
+//config: (-W option).
+//config:
+//config:config FEATURE_NETSTAT_PRG
+//config: bool "Enable PID/Program name output"
+//config: default y
+//config: depends on NETSTAT
+//config: help
+//config: Add support for -p flag to print out PID and program name.
+//config: +700 bytes of code.
+
+//applet:IF_NETSTAT(APPLET(netstat, BB_DIR_BIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_NETSTAT) += netstat.o
#include "libbb.h"
#include "inet_common.h"
#define ADDR_NORMAL_WIDTH 23
/* When there are IPv6 connections the IPv6 addresses will be
* truncated to none-recognition. The '-W' option makes the
- * address columns wide enough to accomodate for longest possible
+ * address columns wide enough to accommodate for longest possible
* IPv6 addresses, i.e. addresses of the form
* xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:ddd.ddd.ddd.ddd
*/
#define PRG_HASH_SIZE 211
struct globals {
- smallint flags;
+ smalluint flags;
#if ENABLE_FEATURE_NETSTAT_PRG
smallint prg_cache_loaded;
struct prg_node *prg_hash[PRG_HASH_SIZE];
return;
if (prg_cache_loaded == 1)
- bb_error_msg("can't scan /proc - are you root?");
+ bb_simple_error_msg("can't scan /proc - are you root?");
else
- bb_error_msg("showing only processes with your user ID");
+ bb_simple_error_msg("showing only processes with your user ID");
}
#else
/* Code which used "*" for INADDR_ANY is removed: it's ambiguous
* in IPv6, while "0.0.0.0" is not. */
- host = numeric ? xmalloc_sockaddr2dotted_noport(addr)
- : xmalloc_sockaddr2host_noport(addr);
+ host = NULL;
+ if (!numeric)
+ host = xmalloc_sockaddr2host_noport(addr);
+ if (!host)
+ host = xmalloc_sockaddr2dotted_noport(addr);
host_port = xasprintf("%s:%s", host, get_sname(htons(port), proto, numeric));
free(host);
/* TODO: currently we stop at first NUL byte. Is it a problem? */
line += path_ofs;
- *strchrnul(line, '\n') = '\0';
+ chomp(line);
while (*line)
fputc_printable(*line++, stdout);
bb_putchar('\n');