/* netstat.c - Display Linux networking subsystem.
 *
 * Copyright 2012 Ranjan Kumar <ranjankumar.bth@gmail.com>
 * Copyright 2013 Kyungwan Han <asura321@gmail.com>
 *
 * Not in SUSv4.
 *
USE_NETSTAT(NEWTOY(netstat, "pWrxwutneal", TOYFLAG_BIN))
config NETSTAT
  bool "netstat"
  default n
  help
    usage: netstat [-pWrxwutneal]

    Display networking information.

    -r  Display routing table.
    -a  Display all sockets (Default: Connected).
    -l  Display listening server sockets.
    -t  Display TCP sockets.
    -u  Display UDP sockets.
    -w  Display Raw sockets.
    -x  Display Unix sockets.
    -e  Display other/more information.
    -n  Don't resolve names.
    -W  Wide Display.
    -p  Display PID/Program name for sockets.
*/

#define FOR_netstat
#include "toys.h"
#include <net/route.h>

typedef union _iaddr {
  unsigned u;
  unsigned char b[4];
} iaddr;

typedef union _iaddr6 {
  struct {
    unsigned a;
    unsigned b;
    unsigned c;
    unsigned d;
  } u;
  unsigned char b[16];
} iaddr6;

#define ADDR_LEN (INET6_ADDRSTRLEN + 1 + 5 + 1) //IPv6 addr len + : + port + '\0'

//For unix states
enum {
	SOCK_ACCEPTCON = (1 << 16),  //performed a listen.
	SOCK_WAIT_DATA = (1 << 17),  //wait data to read.
	SOCK_NO_SPACE = (1 << 18),  //no space to write.
};

#define SOCK_NOT_CONNECTED 1
//For PID/Progrma Name
#define PROGRAM_NAME "PID/Program Name"
#define PROGNAME_LEN 21

typedef struct _pidlist {
  struct _pidlist *next;
  long inode;
  char name[PROGNAME_LEN];
} PID_LIST;
PID_LIST *pid_list = NULL;

/*
 * Get base name from the input name.
 */
static const char *get_basename(char *name)
{
  const char *c = strrchr(name, '/');
  if (c) return c + 1;
  return name;
}
/*
 * copy string from src to dest -> only number of bytes.
 */
static char *safe_strncpy(char *dst, char *src, size_t size)
{
  if(!size) return dst;
  dst[--size] = '\0';
  return strncpy(dst, src, size);
}

/*
 * locate character in string.
 */
static char *strchr_nul(char *s, int c)
{
  while(*s != '\0' && *s != c) s++;
  return (char*)s;
}

// Find out if the last character of a string matches with the given one.
// Don't underrun the buffer if the string length is 0.
static char *find_last_char(char *str, int c)
{
  if (str && *str) {
    size_t sz = strlen(str) - 1;
    str += sz;
    if ( (unsigned char)*str == c) return (char*)str;
  }
  return NULL;
}
/*
 * Concat path and the file name.
 */
static char *append_pathandfile(char *path, char *fname)
{
  char *c;
  if (!path) path = "";
  c = find_last_char(path, '/');
  while (*fname == '/') fname++;
  return xmprintf("%s%s%s", path, (c)? "" : "/", fname);
}
/*
 * Concat sub-path and the file name.
 */
static char *append_subpathandfile(char *path, char *fname)
{
#define ISDOTORDOTDOT(s) ((s)[0] == '.' && (!(s)[1] || ((s)[1] == '.' && !(s)[2])))
  if(!fname) return NULL;
  if(ISDOTORDOTDOT(fname)) return NULL;
  return append_pathandfile(path, fname);
#undef ISDOTORDOTDOT
}
/*
 * used to converts string into int and validate the input str for invalid int value or out-of-range.
 */
static unsigned get_strtou(char *str, char **endp, int base)
{
  unsigned long uli;
  char *endptr;

  if (!isalnum(str[0])) {
    errno = ERANGE;
    return UINT_MAX;
  }
  errno = 0;
  uli = strtoul(str, &endptr, base);
  if (uli > UINT_MAX) {
    errno = ERANGE;
    return UINT_MAX;
  }

  if (endp) *endp = endptr;
  if (endptr[0]) {
    if (isalnum(endptr[0]) || errno) { //"123abc" or out-of-range
      errno = ERANGE;
      return UINT_MAX;
    }
    errno = EINVAL;
  }
  return uli;
}
/*
 * used to retrive pid name from pid list.
 */
static const char *get_pid_name(unsigned long inode)
{
  PID_LIST *tmp;
  for (tmp = pid_list; tmp; tmp = tmp->next)
    if (tmp->inode == inode) return tmp->name;
  return "-";
}
/*
 * For TCP/UDP/RAW display data.
 */
static void display_data(unsigned rport, char *label, unsigned rxq, unsigned txq, char *lip, char *rip, unsigned state, unsigned long inode)
{
  char *ss_state = "UNKNOWN", buf[12];
  char *state_label[] = {"", "ESTABLISHED", "SYN_SENT", "SYN_RECV", "FIN_WAIT1", "FIN_WAIT2",
  		                 "TIME_WAIT", "CLOSE", "CLOSE_WAIT", "LAST_ACK", "LISTEN", "CLOSING", "UNKNOWN"};
  if (!strcmp(label, "tcp")) {
    int sz = ARRAY_LEN(state_label);
    if (!state || state >= sz) state = sz-1;
    ss_state = state_label[state];
  }
  else if (!strcmp(label, "udp")) {
    if (state == 1) ss_state = state_label[state];
    else if (state == 7) ss_state = "";
  }
  else if (!strcmp(label, "raw")) sprintf(ss_state = buf, "%u", state);

  if ( (toys.optflags & FLAG_W) && (toys.optflags & FLAG_p))
    xprintf("%3s   %6d %6d %-51s %-51s %-12s%s\n", label, rxq, txq, lip, rip, ss_state, get_pid_name(inode));
  else if (toys.optflags & FLAG_W)
    xprintf("%3s   %6d %6d %-51s %-51s %-12s\n", label, rxq, txq, lip, rip, ss_state);
  else if (toys.optflags & FLAG_p)
    xprintf("%3s   %6d %6d %-23s %-23s %-12s%s\n", label, rxq, txq, lip, rip, ss_state, get_pid_name(inode));
  else xprintf("%3s   %6d %6d %-23s %-23s %-12s\n", label, rxq, txq, lip, rip, ss_state);
}
/*
 * For TCP/UDP/RAW show data.
 */
static void show_data(unsigned rport, char *label, unsigned rxq, unsigned txq, char *lip, char *rip, unsigned state, unsigned long inode)
{
  if (toys.optflags & FLAG_l) {
    if (!rport && (state && 0xA)) display_data(rport, label, rxq, txq, lip, rip, state, inode);
  } else if (toys.optflags & FLAG_a) display_data(rport, label, rxq, txq, lip, rip, state, inode);
  //rport && (TCP | UDP | RAW)
  else if (rport && (0x10 | 0x20 | 0x40)) display_data(rport, label, rxq, txq, lip, rip, state, inode);
}
/*
 * used to get service name.
 */
static char *get_servname(int port, char *label)
{
  int lport = htons(port);
  if (!lport) return xmprintf("%s", "*");
  struct servent *ser = getservbyport(lport, label);
  if (ser) return xmprintf("%s", ser->s_name);
  return xmprintf("%u", (unsigned)ntohs(lport));
}
/*
 * used to convert address into text format.
 */
static void addr2str(int af, void *addr, unsigned port, char *buf, char *label)
{
  char ip[ADDR_LEN] = {0,};
  if (!inet_ntop(af, addr, ip, ADDR_LEN)) {
    *buf = '\0';
    return;
  }
  size_t iplen = strlen(ip);
  if (!port) {
    strncat(ip+iplen, ":*", ADDR_LEN-iplen-1);
    memcpy(buf, ip, ADDR_LEN);
    return;
  }

  if (!(toys.optflags & FLAG_n)) {
    struct addrinfo hints, *result, *rp;

    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = af;

    if (!getaddrinfo(ip, NULL, &hints, &result)) {
      char hbuf[NI_MAXHOST] = {0,}, sbuf[NI_MAXSERV] = {0,};
      socklen_t sock_len;
      char *sname = NULL;
      int plen = 0;

      if (af == AF_INET) sock_len = sizeof(struct sockaddr_in);
      else sock_len = sizeof(struct sockaddr_in6);

      for (rp = result; rp; rp = rp->ai_next)
        if (!getnameinfo(rp->ai_addr, sock_len, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICSERV))
          break;

      freeaddrinfo(result);
      sname = get_servname(port, label);
      plen = strlen(sname);
      if (*hbuf) {
        memset(ip, 0, ADDR_LEN);
        memcpy(ip, hbuf, (ADDR_LEN - plen - 2));
        iplen = strlen(ip);
      }
      snprintf(ip + iplen, ADDR_LEN-iplen, ":%s", sname);
      free(sname);
    }
  }
  else snprintf(ip+iplen, ADDR_LEN-iplen, ":%d", port);
  memcpy(buf, ip, ADDR_LEN);
}
/*
 * display ipv4 info for TCP/UDP/RAW.
 */
static void show_ipv4(char *fname, char *label)
{
  FILE *fp = fopen((char *)fname, "r");
  if (!fp) {
     perror_msg("'%s'", fname);
     return;
  }
  fgets(toybuf, sizeof(toybuf), fp); //skip header.
  while (fgets(toybuf, sizeof(toybuf), fp)) {
    char lip[ADDR_LEN] = {0,}, rip[ADDR_LEN] = {0,};
    iaddr laddr, raddr;
    unsigned lport, rport, state, txq, rxq, num, uid;
    unsigned long inode;

    int nitems = sscanf(toybuf, " %d: %x:%x %x:%x %x %x:%x %*X:%*X %*X %d %*d %ld",
        &num, &laddr.u, &lport, &raddr.u, &rport, &state, &txq, &rxq, &uid, &inode);
    if (nitems == 10) {
      addr2str(AF_INET, &laddr, lport, lip, label);
      addr2str(AF_INET, &raddr, rport, rip, label);
      show_data(rport, label, rxq, txq, lip, rip, state, inode);
    }
  }//End of While
  fclose(fp);
}
/*
 * display ipv6 info for TCP/UDP/RAW.
 */
static void show_ipv6(char *fname, char *label)
{
  FILE *fp = fopen((char *)fname, "r");
  if (!fp) {
    perror_msg("'%s'", fname);
    return;
  }
  fgets(toybuf, sizeof(toybuf), fp); //skip header.
  while (fgets(toybuf, sizeof(toybuf), fp)) {
    char lip[ADDR_LEN] = {0,}, rip[ADDR_LEN] = {0,};
    iaddr6 laddr6, raddr6;
    unsigned lport, rport, state, txq, rxq, num, uid;
    unsigned long inode;
    int nitems = sscanf(toybuf, " %d: %8x%8x%8x%8x:%x %8x%8x%8x%8x:%x %x %x:%x %*X:%*X %*X %d %*d %ld",
        &num, &laddr6.u.a, &laddr6.u.b, &laddr6.u.c, &laddr6.u.d, &lport, &raddr6.u.a, &raddr6.u.b,
        &raddr6.u.c, &raddr6.u.d, &rport, &state, &txq, &rxq, &uid, &inode);
    if (nitems == 16) {
      addr2str(AF_INET6, &laddr6, lport, lip, label);
      addr2str(AF_INET6, &raddr6, rport, rip, label);
      show_data(rport, label, rxq, txq, lip, rip, state, inode);
    }
  }//End of While
  fclose(fp);
}
/*
 * display unix socket info.
 */
static void show_unix_sockets(char *fname, char *label)
{
  FILE *fp = fopen((char *)fname, "r");
  if (!fp) {
    perror_msg("'%s'", fname);
    return;
  }
  fgets(toybuf, sizeof(toybuf), fp); //skip header.
  while (fgets(toybuf, sizeof(toybuf), fp)) {
    unsigned long int refcount, label, flags, inode;
    int nitems = 0, path_offset = 0, type, state;
    char sock_flags[32] = {0,}, *sock_type, *sock_state, *bptr = toybuf;

    if (!toybuf[0]) continue;
    nitems = sscanf(toybuf, "%*p: %lX %lX %lX %X %X %lu %n",
        &refcount, &label, &flags, &type, &state, &inode, &path_offset);
    //for state one less
    if (nitems < 6) break;
    if (toys.optflags & FLAG_l) {
      if ( !((state == SOCK_NOT_CONNECTED) && (flags & SOCK_ACCEPTCON)) ) continue;
    } else if (!(toys.optflags & FLAG_a)) {
      if ((state == SOCK_NOT_CONNECTED) && (flags & SOCK_ACCEPTCON)) continue;
    }

    //prepare socket type, state and flags.
    {
      char *ss_type[] = { "", "STREAM", "DGRAM", "RAW", "RDM", "SEQPACKET", "UNKNOWN"};
      char *ss_state[] = { "FREE", "LISTENING", "CONNECTING", "CONNECTED", "DISCONNECTING", "UNKNOWN"};

      int sz = ARRAY_LEN(ss_type);//sizeof(ss_type)/sizeof(ss_type[0]);
      if ( (type < SOCK_STREAM) || (type > SOCK_SEQPACKET) ) sock_type = ss_type[sz-1];
      else sock_type = ss_type[type];

      sz = ARRAY_LEN(ss_state);//sizeof(ss_state)/sizeof(ss_state[0]);
      if ((state < 0) || (state > sz-2)) sock_state = ss_state[sz-1];
      else if (state == SOCK_NOT_CONNECTED) {
        if (flags & SOCK_ACCEPTCON) sock_state = ss_state[state];
        else sock_state = " ";
      } else sock_state = ss_state[state];

      strcpy(sock_flags, "[ ");
      if (flags & SOCK_ACCEPTCON) strcat(sock_flags, "ACC ");
      if (flags & SOCK_WAIT_DATA) strcat(sock_flags, "W ");
      if (flags & SOCK_NO_SPACE) strcat(sock_flags, "N ");
      strcat(sock_flags, "]");
    }
    xprintf("%-5s %-6ld %-11s %-10s %-13s %6lu ", (!label ? "unix" : "??"), refcount, sock_flags, sock_type, sock_state, inode);
    if (toys.optflags & FLAG_p) xprintf("%-20s", get_pid_name(inode));

    bptr += path_offset;
    *strchr_nul(bptr, '\n') = '\0';
    xprintf("%s\n", bptr);
  }//End of while
  fclose(fp);
}
/*
 * extract inode value from the link.
 */
static long ss_inode(char *link)
{
  long inode = -1;
  //"link = socket:[12345]", get "12345" as inode.
  if (!strncmp(link, "socket:[", sizeof("socket:[")-1)) {
    inode = get_strtou(link + sizeof("socket:[")-1, (char**)&link, 0);
    if (*link != ']') inode = -1;
  }
  //"link = [0000]:12345", get "12345" as inode.
  else if (!strncmp(link, "[0000]:", sizeof("[0000]:")-1)) {
    inode = get_strtou(link + sizeof("[0000]:")-1, NULL, 0);
    //if not NULL terminated.
    if (errno) inode = -1;
  }
  return inode;
}
/*
 * add inode and progname in the pid list.
 */
static void add2list(long inode, char *progname)
{
  PID_LIST *node = pid_list;
  for(; node; node = node->next) {
    if(node->inode == inode)
      return;
  }
  PID_LIST *new = (PID_LIST *)xzalloc(sizeof(PID_LIST));
  new->inode = inode;
  safe_strncpy(new->name, progname, PROGNAME_LEN-1);
  new->next = pid_list;
  pid_list = new;
}
/*
 * add pid info in the list.
 */
static void extract_inode(char *path, char *progname)
{
  DIR *dp;
  struct dirent *entry;

  if (!(dp = opendir(path))) {
    if (errno == EACCES) return;
    else perror_exit("%s", path);
  }
  while ((entry = readdir(dp))) {
    char *link = NULL, *fname = append_subpathandfile(path, entry->d_name);
    if (!fname) continue;
    link = xreadlink(fname);
    if (link) {
      long inode = ss_inode(link);
      free(link);
      if (inode != -1) add2list(inode, progname);
    }
    free(fname);
  }//end of while.
  closedir(dp);
}
/*
 * prepare the list for all pids in /proc directory.
 */
static void get_pid_list(void)
{
  DIR *dp;
  struct dirent *entry;
  char path[64] = {0,};
  uid_t uid = geteuid();

  if (!(dp = opendir("/proc"))) perror_exit("opendir");

  while ((entry = readdir(dp))) {
    int fd, nitems = 0, length = 0;
    char *pid, *progname;

    if (!isdigit(*entry->d_name)) continue;
    pid = entry->d_name;
    length = snprintf(path, sizeof(path), "/proc/%s/cmdline", entry->d_name);
    if (sizeof(path) <= length) continue;

    fd = xopen(path, O_RDONLY);
    nitems = readall(fd, toybuf, sizeof(toybuf) - 1);
    xclose(fd);
    if (nitems < 1) continue;
    toybuf[nitems] = '\0';
    strcpy(path + length - (sizeof("cmdline")-1), "fd");
    progname = append_pathandfile(pid, (char *)get_basename(toybuf)); //e.g. progname = 2054/gnome-keyring-daemon
    extract_inode(path, progname);
  }//end of while.
  closedir(dp);

  if (uid) fprintf(stderr, "(Not all processes could be identified, non-owned process info "
      "will not be shown, you would have to be root to see it all.)\n");
}
/*
 * Dealloc pid list.
 */
static void clean_pid_list(void)
{
  PID_LIST *tmp;
  while (pid_list) {
    tmp = pid_list->next;
    free(pid_list);
    pid_list = tmp;
  }
}
/*
 * For TCP/UDP/RAW show the header.
 */
static void show_header(void)
{
  if ((toys.optflags & FLAG_W) && (toys.optflags & FLAG_p))
    xprintf("\nProto Recv-Q Send-Q %-51s %-51s %-12s%s\n", "Local Address", "Foreign Address", "State", PROGRAM_NAME);
  else if (toys.optflags & FLAG_p)
    xprintf("\nProto Recv-Q Send-Q %-23s %-23s %-12s%s\n", "Local Address", "Foreign Address", "State", PROGRAM_NAME);
  else if (toys.optflags & FLAG_W)
	  xprintf("\nProto Recv-Q Send-Q %-51s %-51s State     \n", "Local Address", "Foreign Address");
  else xprintf("\nProto Recv-Q Send-Q %-23s %-23s State     \n", "Local Address", "Foreign Address");
}
/*
 * used to get the flag values for route command.
 */
static void get_flag_value(char **flagstr, int flags)
{
  int i = 0;
  char *str = *flagstr;
  static const char flagchars[] = "GHRDMDAC";
  static const unsigned flagarray[] = {
    RTF_GATEWAY,
    RTF_HOST,
    RTF_REINSTATE,
    RTF_DYNAMIC,
    RTF_MODIFIED,
    RTF_DEFAULT,
    RTF_ADDRCONF,
    RTF_CACHE
  };
  *str++ = 'U';
  while ( (*str = flagchars[i]) ) {
    if (flags & flagarray[i++]) ++str;
  }
}
/*
 * extract inet4 route info from /proc/net/route file and display it.
 */
static void display_routes(int is_more_info, int notresolve)
{
#define IPV4_MASK (RTF_GATEWAY|RTF_HOST|RTF_REINSTATE|RTF_DYNAMIC|RTF_MODIFIED)
  unsigned long dest, gate, mask;
  int flags, ref, use, metric, mss, win, irtt;
  char iface[64]={0,};
  char *flag_val = xzalloc(10); //there are 9 flags "UGHRDMDAC" for route.

  FILE *fp = xfopen("/proc/net/route", "r");
  xprintf("Kernel IP routing table\n"
                   "Destination     Gateway         Genmask         Flags %s Iface\n",
  	                        is_more_info ? "  MSS Window  irtt" : "Metric Ref    Use");
  fgets(toybuf, sizeof(toybuf), fp); //skip 1st line.
  while (fgets(toybuf, sizeof(toybuf), fp)) {
     int nitems = 0;
     char *destip = NULL, *gateip = NULL, *maskip = NULL;
     memset(flag_val, 0, 10);

     nitems = sscanf(toybuf, "%63s%lx%lx%X%d%d%d%lx%d%d%d\n",
                 iface, &dest, &gate, &flags, &ref, &use, &metric, &mask, &mss, &win, &irtt);
     if (nitems != 11) {//EOF with no (nonspace) chars read.
       if ((nitems < 0) && feof(fp)) break;
      perror_exit("sscanf");
    }
    //skip down interfaces.
    if (!(flags & RTF_UP)) continue;

    if (dest) {//For Destination
      if (inet_ntop(AF_INET, &dest, toybuf, sizeof(toybuf)) ) destip = xstrdup(toybuf);
    } else {
      if (!notresolve) destip = xstrdup("default");
      else destip = xstrdup("0.0.0.0");
    }
    if (gate) {//For Gateway
      if (inet_ntop(AF_INET, &gate, toybuf, sizeof(toybuf)) ) gateip = xstrdup(toybuf);
    } else {
      if (!notresolve) gateip = xstrdup("*");
      else gateip = xstrdup("0.0.0.0");
    }
    //For Mask
    if (inet_ntop(AF_INET, &mask, toybuf, sizeof(toybuf)) ) maskip = xstrdup(toybuf);

    //Get flag Values
    get_flag_value(&flag_val, (flags & IPV4_MASK));
    if (flags & RTF_REJECT) flag_val[0] = '!';
    xprintf("%-15.15s %-15.15s %-16s%-6s", destip, gateip, maskip, flag_val);
    if (destip) free(destip);
    if (gateip) free(gateip);
    if (maskip) free(maskip);
    if (is_more_info) xprintf("%5d %-5d %6d %s\n", mss, win, irtt, iface);
    else xprintf("%-6d %-2d %7d %s\n", metric, ref, use, iface);
  }//end of while.
  fclose(fp);
  if (flag_val) free(flag_val);
#undef IPV4_MASK
  return;
}
/*
 * netstat utily main function.
 */
void netstat_main(void)
{
#define IS_NETSTAT_PROTO_FLAGS_UP (toys.optflags & (FLAG_t | FLAG_u | FLAG_w | FLAG_x))
  int flag_listen_and_all = 0;
  if (!toys.optflags) toys.optflags = FLAG_t | FLAG_u | FLAG_w | FLAG_x;

  //When a is set
  if (toys.optflags & FLAG_a) flag_listen_and_all = 1;
  //when a and l both are set
  if ( (toys.optflags & FLAG_a) && (toys.optflags & FLAG_l) )
    toys.optflags &= ~FLAG_l;
  //when only a is set
  if ( (toys.optflags & FLAG_a) && (!IS_NETSTAT_PROTO_FLAGS_UP) )
    toys.optflags |= FLAG_t | FLAG_u | FLAG_w | FLAG_x;
  //when only l is set
  if ( (toys.optflags & FLAG_l) && (!IS_NETSTAT_PROTO_FLAGS_UP) )
    toys.optflags |= FLAG_t | FLAG_u | FLAG_w | FLAG_x;
  //when only e/n is set
  if( ((toys.optflags & FLAG_e) || (toys.optflags & FLAG_n)) && (!IS_NETSTAT_PROTO_FLAGS_UP) )
	  toys.optflags |= FLAG_t | FLAG_u | FLAG_w | FLAG_x;
  //when W is set
  if ( (toys.optflags & FLAG_W) && (!IS_NETSTAT_PROTO_FLAGS_UP) )
    toys.optflags |= FLAG_t | FLAG_u | FLAG_w | FLAG_x;
   //when p is set
  if ( (toys.optflags & FLAG_p) && (!IS_NETSTAT_PROTO_FLAGS_UP) )
    toys.optflags |= FLAG_t | FLAG_u | FLAG_w | FLAG_x;

  //Display routing table.
  if (toys.optflags & FLAG_r) {
    display_routes(!(toys.optflags & FLAG_e), (toys.optflags & FLAG_n));
    return;
  }

  if (toys.optflags & FLAG_p) get_pid_list();

  //For TCP/UDP/RAW.
  if ( (toys.optflags & FLAG_t) || (toys.optflags & FLAG_u) || (toys.optflags & FLAG_w) ) {
    xprintf("Active Internet connections ");

    if (flag_listen_and_all) xprintf("(servers and established)");
    else if (toys.optflags & FLAG_l) xprintf("(only servers)");
    else xprintf("(w/o servers)");

    show_header();
    if (toys.optflags & FLAG_t) {//For TCP
      show_ipv4("/proc/net/tcp",  "tcp");
      show_ipv6("/proc/net/tcp6", "tcp");
    }
    if (toys.optflags & FLAG_u) {//For UDP
      show_ipv4("/proc/net/udp",  "udp");
      show_ipv6("/proc/net/udp6", "udp");
    }
    if (toys.optflags & FLAG_w) {//For raw
      show_ipv4("/proc/net/raw",  "raw");
      show_ipv6("/proc/net/raw6", "raw");
    }
  }
  if (toys.optflags & FLAG_x) {//For UNIX.
    xprintf("Active UNIX domain sockets ");
    if (flag_listen_and_all) xprintf("(servers and established)");
    else if (toys.optflags & FLAG_l) xprintf("(only servers)");
    else xprintf("(w/o servers)");

    if (toys.optflags & FLAG_p) xprintf("\nProto RefCnt Flags       Type       State         I-Node %s    Path\n", PROGRAM_NAME);
    else xprintf("\nProto RefCnt Flags       Type       State         I-Node Path\n");
    show_unix_sockets("/proc/net/unix", "unix");
  }
  if (toys.optflags & FLAG_p) clean_pid_list();
  if (toys.exitval) toys.exitval = 0;
#undef IS_NETSTAT_PROTO_FLAGS_UP
}
