/* 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 y
  help
    usage: netstat [-pWrxwutneal]

    Display networking information. Default is netstat -tuwx

    -r	Routing table
    -a	All sockets (not just connected)
    -l	Listening server sockets
    -t	TCP sockets
    -u	UDP sockets
    -w	Raw sockets
    -x	Unix sockets
    -e	Extended info
    -n	Don't resolve names
    -W	Wide display
    -p	Show PID/program name of sockets
*/

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

GLOBALS(
  struct num_cache *inodes;
  int wpad;
)

static void addr2str(int af, void *addr, unsigned port, char *buf, int len,
  char *proto)
{
  char pres[INET6_ADDRSTRLEN];
  struct servent *se = 0;
  int pos, count;

  if (!inet_ntop(af, addr, pres, sizeof(pres))) perror_exit("inet_ntop");

  if (FLAG(n) || !port) {
    strcpy(buf, pres);
  } else {
    struct addrinfo hints, *result, *rp;
    char cut[4];

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

    if (!getaddrinfo(pres, NULL, &hints, &result)) {
      socklen_t sock_len = (af == AF_INET) ? sizeof(struct sockaddr_in)
        : sizeof(struct sockaddr_in6);

      // We assume that a failing getnameinfo dosn't stomp "buf" here.
      for (rp = result; rp; rp = rp->ai_next)
        if (!getnameinfo(rp->ai_addr, sock_len, buf, 256, 0, 0, 0)) break;
      freeaddrinfo(result);
      buf[len] = 0;
    }

    // getservbyport() doesn't understand proto "tcp6", so truncate
    memcpy(cut, proto, 3);
    cut[3] = 0;
    se = getservbyport(htons(port), cut);
  }

  if (!strcmp(buf, "::")) strcpy(buf, "[::]");

  // Append :service or :* if port == 0.
  if (se) {
    count = snprintf(0, 0, ":%s", se->s_name);
    // NI_MAXSERV == 32, which is greater than our minimum field width.
    // (Although the longest service name on Debian in 2021 is only 16 bytes.)
    if (count>=len) {
      count = len-1;
      se->s_name[count] = 0;
    }
  } else count = port ? snprintf(0, 0, ":%u", port) : 2;
  // We always show the port, even if that means clobbering the end of the host.
  pos = strlen(buf);
  if (len-pos<count) pos = len-count;
  if (se) sprintf(buf+pos, ":%s", se->s_name);
  else sprintf(buf+pos, port ? ":%u" : ":*", port);
}

// Display info for tcp/udp/raw
static void show_ip(char *fname)
{
  char *ss_state = "UNKNOWN", buf[12], *s, *label = strrchr(fname, '/')+1;
  char *state_label[] = {"", "ESTABLISHED", "SYN_SENT", "SYN_RECV", "FIN_WAIT1",
                         "FIN_WAIT2", "TIME_WAIT", "CLOSE", "CLOSE_WAIT",
                         "LAST_ACK", "LISTEN", "CLOSING", "UNKNOWN"};
  FILE *fp = xfopen(fname, "r");

  // Skip header.
  fgets(toybuf, sizeof(toybuf), fp);

  while (fgets(toybuf, sizeof(toybuf), fp)) {
    char lip[256], rip[256];
    union {
      struct {unsigned u; unsigned char b[4];} i4;
      struct {struct {unsigned a, b, c, d;} u; unsigned char b[16];} i6;
    } laddr, raddr;
    unsigned lport, rport, state, txq, rxq, num, uid, af = AF_INET6;
    unsigned long inode;

    // Try ipv6, then try ipv4
    if (16 != sscanf(toybuf,
      " %d: %8x%8x%8x%8x:%x %8x%8x%8x%8x:%x %x %x:%x %*X:%*X %*X %d %*d %ld",
      &num, &laddr.i6.u.a, &laddr.i6.u.b, &laddr.i6.u.c,
      &laddr.i6.u.d, &lport, &raddr.i6.u.a, &raddr.i6.u.b,
      &raddr.i6.u.c, &raddr.i6.u.d, &rport, &state, &txq, &rxq,
      &uid, &inode))
    {
      af = AF_INET;
      if (10 != sscanf(toybuf,
        " %d: %x:%x %x:%x %x %x:%x %*X:%*X %*X %d %*d %ld",
        &num, &laddr.i4.u, &lport, &raddr.i4.u, &rport, &state, &txq,
        &rxq, &uid, &inode)) continue;
    }

    // Should we display this? (listening or all or TCP/UDP/RAW)
    if (!(FLAG(l) && (!rport && (state&0xA))) && !FLAG(a) && !(rport&0x70))
      continue;

    addr2str(af, &laddr, lport, lip, TT.wpad, label);
    addr2str(af, &raddr, rport, rip, TT.wpad, label);

    // Display data
    s = label;
    if (strstart(&s, "tcp")) {
      int sz = ARRAY_LEN(state_label);
      if (!state || state >= sz) state = sz-1;
      ss_state = state_label[state];
    } else if (strstart(&s, "udp")) {
      if (state == 1) ss_state = state_label[state];
      else if (state == 7) ss_state = "";
    } else if (strstart(&s, "raw")) sprintf(ss_state = buf, "%u", state);

    printf("%-6s%6d%7d %*.*s %*.*s %-11s", label, rxq, txq, -TT.wpad, TT.wpad,
      lip, -TT.wpad, TT.wpad, rip, ss_state);
    if (FLAG(e)) {
      if (FLAG(n)) sprintf(s = toybuf, "%d", uid);
      else s = getusername(uid);
      printf(" %-10s %-11ld", s, inode);
    }
    if (FLAG(p)) {
      struct num_cache *nc = get_num_cache(TT.inodes, inode);

      printf(" %s", nc ? nc->data : "-");
    }
    xputc('\n');
  }
  fclose(fp);
}

static void show_unix_sockets(void)
{
  char *types[] = {"","STREAM","DGRAM","RAW","RDM","SEQPACKET","DCCP","PACKET"},
       *states[] = {"","LISTENING","CONNECTING","CONNECTED","DISCONNECTING"},
       *filename = 0;
  unsigned long refcount, flags, type, state, inode;
  FILE *fp = xfopen("/proc/net/unix", "r");

  // Skip header.
  fgets(toybuf, sizeof(toybuf), fp);

  while (fscanf(fp, "%*p: %lX %*X %lX %lX %lX %lu%m[^\n]", &refcount, &flags,
                &type, &state, &inode, &filename) >= 5) {
    // Linux exports only SO_ACCEPTCON since 2.3.15pre3 in 1999, but let's
    // filter in case they add more someday.
    flags &= 1<<16;

    // Only show unconnected listening sockets with -a or -l.
    if (state==1 && flags && !(FLAG(a) || FLAG(l))) continue;

    if (type==10) type = 7; // move SOCK_PACKET into line
    if (type>=ARRAY_LEN(types)) type = 0;
    if (state>=ARRAY_LEN(states) || (state==1 && !flags)) state = 0;

    if (state!=1 && FLAG(l)) continue;

    sprintf(toybuf, "[ %s]", flags ? "ACC " : "");
    printf("unix  %-6ld %-11s %-10s %-13s %-8lu ",
      refcount, toybuf, types[type], states[state], inode);
    if (FLAG(p)) {
      struct num_cache *nc = get_num_cache(TT.inodes, inode);

      printf("%-19.19s ", nc ? nc->data : "-");
    }

    if (filename) {
      printf("%s\n", filename+!FLAG(p));
      free(filename);
      filename = 0;
    } else xputc('\n');
  }
  fclose(fp);
}

static int scan_pids(struct dirtree *node)
{
  char *s = toybuf+256;
  struct dirent *entry;
  DIR *dp;
  int pid, dirfd;

  if (!node->parent) return DIRTREE_RECURSE;
  if (!(pid = atol(node->name))) return 0;

  sprintf(toybuf, "/proc/%d/cmdline", pid);
  if (!(readfile(toybuf, toybuf, 256))) return 0;

  sprintf(s, "%d/fd", pid);
  if (-1==(dirfd = openat(dirtree_parentfd(node), s, O_RDONLY))) return 0;
  if (!(dp = fdopendir(dirfd))) close(dirfd);
  else while ((entry = readdir(dp))) {
    s = toybuf+256;
    if (!readlinkat0(dirfd, entry->d_name, s, sizeof(toybuf)-256)) continue;
    // Can the "[0000]:" happen in a modern kernel?
    if (strstart(&s, "socket:[") || strstart(&s, "[0000]:")) {
      long long ll = atoll(s);

      sprintf(s, "%d/%s", pid, getbasename(toybuf));
      add_num_cache(&TT.inodes, ll, s, strlen(s)+1);
    }
  }
  closedir(dp);

  return 0;
}

// extract inet4 route info from /proc/net/route file and display it.
static void display_routes(void)
{
  static const char flagchars[] = "GHRDMDAC";
  static const unsigned flagarray[] = {
    RTF_GATEWAY, RTF_HOST, RTF_REINSTATE, RTF_DYNAMIC, RTF_MODIFIED
  };
  unsigned dest, gate, mask;
  int flags, ref, use, metric, mss, win, irtt;
  char *out = toybuf, *flag_val;
  char iface[64]={0};
  FILE *fp = xfopen("/proc/net/route", "r");

  // Skip header.
  fgets(toybuf, sizeof(toybuf), fp);

  printf("Kernel IP routing table\n"
          "Destination\tGateway \tGenmask \tFlags %s Iface\n",
          !FLAG(e) ? "  MSS Window  irtt" : "Metric Ref    Use");

  while (fscanf(fp, "%63s%x%x%X%d%d%d%x%d%d%d", iface, &dest, &gate, &flags,
                &ref, &use, &metric, &mask, &mss, &win, &irtt) == 11) {
    char *destip = 0, *gateip = 0, *maskip = 0;

    // skip down interfaces.
    if (!(flags & RTF_UP)) continue;

// TODO /proc/net/ipv6_route

    if (dest) {
      if (inet_ntop(AF_INET, &dest, out, 16)) destip = out;
    } else destip = FLAG(n) ? "0.0.0.0" : "default";
    out += 16;

    if (gate) {
      if (inet_ntop(AF_INET, &gate, out, 16)) gateip = out;
    } else gateip = FLAG(n) ? "0.0.0.0" : "*";
    out += 16;

// TODO /24
    //For Mask
    if (inet_ntop(AF_INET, &mask, out, 16)) maskip = out;
    else maskip = "?";
    out += 16;

    //Get flag Values
    flag_val = out;
    *out++ = 'U';
    for (dest = 0; dest < ARRAY_LEN(flagarray); dest++)
      if (flags&flagarray[dest]) *out++ = flagchars[dest];
    *out = 0;
    if (flags & RTF_REJECT) *flag_val = '!';

    printf("%-15.15s %-15.15s %-16s%-6s", destip, gateip, maskip, flag_val);
    if (!FLAG(e)) printf("%5d %-5d %6d %s\n", mss, win, irtt, iface);
    else printf("%-6d %-2d %7d %s\n", metric, ref, use, iface);
  }
  fclose(fp);
}

void netstat_main(void)
{
  int tuwx = FLAG_t|FLAG_u|FLAG_w|FLAG_x;
  char *type = "w/o servers";

  TT.wpad = FLAG(W) ? 51 : 23;
  if (!(toys.optflags&(FLAG_r|tuwx))) toys.optflags |= tuwx;
  if (FLAG(r)) display_routes();
  if (!(toys.optflags&tuwx)) return;

  if (FLAG(a)) type = "servers and established";
  else if (FLAG(l)) type = "only servers";

  if (FLAG(p)) dirtree_read("/proc", scan_pids);

  if (toys.optflags&(FLAG_t|FLAG_u|FLAG_w)) {
    printf("Active Internet connections (%s)\n", type);
    printf("Proto Recv-Q Send-Q %*s %*s State      ", -TT.wpad, "Local Address",
      -TT.wpad, "Foreign Address");
    if (FLAG(e)) printf(" User       Inode      ");
    if (FLAG(p)) printf(" PID/Program Name");
    xputc('\n');

    if (FLAG(t)) {
      show_ip("/proc/net/tcp");
      show_ip("/proc/net/tcp6");
    }
    if (FLAG(u)) {
      show_ip("/proc/net/udp");
      show_ip("/proc/net/udp6");
    }
    if (FLAG(w)) {
      show_ip("/proc/net/raw");
      show_ip("/proc/net/raw6");
    }
  }

  if (FLAG(x)) {
    printf("Active UNIX domain sockets (%s)\n", type);
    printf("Proto RefCnt Flags       Type       State         I-Node%sPath\n",
           FLAG(p) ? "   PID/Program Name     " : "   ");
    show_unix_sockets();
  }

  if (FLAG(p) && CFG_TOYBOX_FREE) llist_traverse(TT.inodes, free);
  toys.exitval = 0;
}
