void do_listen(void)

{
  bool bVar1;
  uint uVar2;
  size_t sVar3;
  int iVar4;
  int *piVar5;
  ssize_t sVar6;
  char *pcVar7;
  char *pcVar8;
  uint uVar9;
  int iVar10;
  uint uVar11;
  char *pcVar12;
  uint *puVar13;
  timeval local_11a8;
  timeval local_11a0;
  sockaddr local_1198 [7];
  uint auStack_1128 [4];
  char acStack_1118 [16];
  char acStack_1108 [32];
  uint local_10e8 [15];
  fd_set local_10ac;
  char acStack_102c [4100];
  
  pcVar12 = o_sockname;
  memset(local_1198,0,0x6e)   //possible issue identified - semgrep
  local_1198[0].sa_family = 1;
  strncpy(local_1198[0].sa_data,pcVar12,0x6c)   //possible issue identified - semgrep
  uVar2 = socket(1,1,0);
  uVar11 = uVar2;
  if ((int)uVar2 < 0) {
    verbose("Unable to open socket!\n");
  }
  else {
    sVar3 = strlen(local_1198[0].sa_data)   //possible issue identified - semgrep
    iVar4 = bind(uVar2,local_1198,sVar3 << 1)   //possible issue identified - semgrep
    if (iVar4 < 0) {
      verbose("Unalbe to bind socket!\n");
      uVar11 = 0xffffffff;
      close(uVar2);
    }
  }
  sock = uVar11;
  if ((int)uVar11 < 0) {
    return;
  }
  uVar2 = 0;
LAB_00400ed0:
  for (; uVar2 < 0x20; uVar2 = uVar2 + 1) {
    local_10ac.fds_bits[uVar2] = 0;
  }
  local_10ac.fds_bits[sock >> 5] = local_10ac.fds_bits[sock >> 5] | 1 << (sock & 0x1f);
  local_11a8.tv_sec = 1;
  local_11a8.tv_usec = 0;
  iVar4 = select(sock + 1,&local_10ac,(fd_set *)0x0,(fd_set *)0x0,&local_11a8);
  if (iVar4 < 0) goto code_r0x00400f34;
  goto LAB_00400f6c;
code_r0x00400f34:
  piVar5 = __errno_location();
  uVar2 = 0;
  if (*piVar5 == 4) goto LAB_00400ed0;
  verbose("select error !!!!\n");
LAB_00400f6c:
  pcVar12 = acStack_102c;
  if ((local_10ac.fds_bits[sock >> 5] >> (sock & 0x1f) & 1U) == 0) goto LAB_00401558;
  memset(pcVar12,0,0x1001)   //possible issue identified - semgrep
  sVar6 = recv(sock,pcVar12,0x1000,0)   //possible issue identified - semgrep
  if (sVar6 < 0) {
    pcVar12 = "recv error socket! %d returned!\n";
LAB_00401548:
    verbose(pcVar12,sVar6);
    goto LAB_00401558;
  }
  verbose("recv[%s]\n",pcVar12);
  iVar4 = strcmp(pcVar12,"flush");
  if (iVar4 == 0) {
    memset(&trigger,0,0xf80)   //possible issue identified - semgrep
    goto LAB_00401558;
  }
  memset(auStack_1128,0,0x7c)   //possible issue identified - semgrep
  pcVar7 = strstr(pcVar12,"NAT");
  if (pcVar7 == (char *)0x0) {
    strcpy(acStack_1108,o_chain)   //possible issue identified - semgrep
LAB_004010b0:
    pcVar7 = strchr(pcVar12,0x2c);
    if (pcVar7 != (char *)0x0) {
      *pcVar7 = '\0';
      sVar6 = atoi(pcVar12);
      if ((pcVar7[1] != '\0') && (pcVar12 = strchr(pcVar7 + 1,0x2c), pcVar12 != (char *)0x0)) {
        *pcVar12 = '\0';
        strncpy(acStack_1118,pcVar7 + 1,0xf)   //possible issue identified - semgrep
        pcVar7 = pcVar12 + 1;
        if ((pcVar12[1] != '\0') && (pcVar12 = strchr(pcVar7,0x2c), pcVar12 != (char *)0x0)) {
          *pcVar12 = '\0';
          iVar4 = strcmp(pcVar7,"udp");
          if (iVar4 == 0) {
            auStack_1128[3] = auStack_1128[3] | 1;
LAB_004011e0:
            do {
              pcVar7 = pcVar12 + 1;
              pcVar12 = strchr(pcVar7,0x2c);
              if (pcVar12 != (char *)0x0) {
                *pcVar12 = '\0';
              }
              pcVar8 = strchr(pcVar7,0x2d);
              if (pcVar8 != (char *)0x0) {
                *pcVar8 = '\0';
              }
              uVar2 = atoi(pcVar7);
              uVar11 = auStack_1128[2];
              if (pcVar8 == (char *)0x0) {
                auStack_1128[auStack_1128[2] + 0x10] = uVar2 & 0xffff;
                auStack_1128[2] = auStack_1128[2] + 1;
              }
              else {
                uVar9 = atoi(pcVar8 + 1);
                if (0xd < (int)uVar11) goto LAB_004012e8;
                auStack_1128[uVar11 + 0x10] = uVar2 & 0xffff | 0x80000000;
                auStack_1128[2] = uVar11 + 2;
                auStack_1128[uVar11 + 0x11] = uVar9;
              }
              if (((pcVar12 == (char *)0x0) || (pcVar12[1] == '\0')) || (0xe < (int)auStack_1128[2])
                 ) goto LAB_004012e8;
            } while( true );
          }
          iVar4 = strcmp(pcVar7,"tcp");
          if (iVar4 == 0) {
            auStack_1128[3] = auStack_1128[3] | 2;
            goto LAB_004011e0;
          }
          iVar4 = strcmp(pcVar7,"both");
          if (iVar4 == 0) {
            auStack_1128[3] = auStack_1128[3] | 3;
            goto LAB_004011e0;
          }
        }
      }
    }
LAB_004012dc:
    sVar6 = -1;
  }
  else {
    pcVar7 = strchr(pcVar12,0x2c);
    if (pcVar7 == (char *)0x0) goto LAB_004012dc;
    *pcVar7 = '\0';
    sprintf(acStack_1108,"%s.%s",o_chain,pcVar12)   //possible issue identified - semgrep
    pcVar12 = pcVar7 + 1;
    if (pcVar7[1] != '\0') goto LAB_004010b0;
    sVar6 = -1;
  }
LAB_004012e8:
  if (0x1f < sVar6 - 1U) {
    pcVar12 = "id = %d\n";
    goto LAB_00401548;
  }
  verbose("id = %d (count=%d)\n",sVar6,auStack_1128[2]);
  verbose("chain = %s\n",acStack_1108);
  verbose("ip = %s\n",acStack_1118);
  verbose("flags = %08x\n",auStack_1128[3]);
  puVar13 = local_10e8;
  iVar4 = 0;
  while (iVar4 < (int)auStack_1128[2]) {
    uVar11 = *puVar13;
    puVar13 = puVar13 + 1;
    verbose("ports[%d] = (0x%08x) %d\n",iVar4,uVar11,uVar11 & 0xffff);
    iVar4 = iVar4 + 1;
  }
  gettimeofday(&local_11a0,(__timezone_ptr_t)0x0);
  iVar4 = sVar6 + -1;
  piVar5 = &trigger + iVar4 * 0x1f;
  if ((*piVar5 == 0) && ((&DAT_00412328)[iVar4 * 0x1f] == 0)) {
    verbose("add: id=%d, chain=%s, ip=%s @ %lu.%06lu sec.\n",iVar4,acStack_1108,acStack_1118,
            local_11a0.tv_sec,local_11a0.tv_usec);
    build_iptable_cmd(1,auStack_1128);
LAB_004014b4:
    memcpy(piVar5,auStack_1128,0x7c)   //possible issue identified - semgrep
  }
  else {
    iVar10 = strcmp(acStack_1118,&DAT_00412334 + iVar4 * 0x7c);
    if (iVar10 != 0) {
      piVar5 = &trigger + iVar4 * 0x1f;
      verbose("remove: id=%d, chain=%s, ip=%s @ %lu.%06lu sec.\n",iVar4,acStack_1108 + iVar4 * 0x7c,
              &DAT_00412334 + iVar4 * 0x7c,local_11a0.tv_sec,local_11a0.tv_usec);
      build_iptable_cmd(0,piVar5);
      verbose("add:    id=%d, chain=%s, ip=%s @ %lu.%06lu sec.\n",iVar4,acStack_1108,acStack_1118,
              local_11a0.tv_sec,local_11a0.tv_usec);
      build_iptable_cmd(1,auStack_1128);
      goto LAB_004014b4;
    }
  }
  verbose("touch: id=%d, chain=%s, ip=%s @ %lu.%06lu sec.\n",iVar4,acStack_1108,acStack_1118,
          local_11a0.tv_sec,local_11a0.tv_usec);
  iVar10 = o_timeout + local_11a0.tv_sec;
  (&DAT_00412328)[iVar4 * 0x1f] = local_11a0.tv_usec;
  (&trigger)[iVar4 * 0x1f] = iVar10;
LAB_00401558:
  gettimeofday(&local_11a0,(__timezone_ptr_t)0x0);
  iVar4 = 0;
  piVar5 = &trigger;
  do {
    iVar10 = *piVar5;
    if ((iVar10 != 0) || (piVar5[1] != 0)) {
      bVar1 = local_11a0.tv_sec < iVar10;
      if (local_11a0.tv_sec == iVar10) {
        bVar1 = local_11a0.tv_usec < piVar5[1];
      }
      if (!bVar1) {
        verbose("timeout: id=%d, chain=%s, ip=%s @ %lu.%06lu sec.\n",iVar4,
                &DAT_00412344 + iVar4 * 0x7c,&DAT_00412334 + iVar4 * 0x7c,local_11a0.tv_sec,
                local_11a0.tv_usec);
        build_iptable_cmd(0,piVar5);
        memset(piVar5,0,0x7c)   //possible issue identified - semgrep
      }
    }
    iVar4 = iVar4 + 1;
    piVar5 = piVar5 + 0x1f;
  } while (iVar4 != 0x20);
  uVar2 = 0;
  goto LAB_00400ed0;
}