/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */

void main(int param_1,char **param_2)

{
  undefined4 *puVar1;
  undefined4 *puVar2;
  char *pcVar3;
  uint uVar4;
  uint uVar5;
  int iVar6;
  __pid_t _Var7;
  FILE *__stream;
  __sighandler_t p_Var8;
  timeval *__timeout;
  __fd_mask *p_Var9;
  undefined4 *puVar10;
  int *piVar11;
  sockaddr *psVar12;
  char *__s;
  addrinfo *local_100;
  addrinfo *local_fc;
  uint local_f8;
  undefined4 local_f4;
  undefined4 local_f0;
  undefined4 local_ec;
  undefined4 local_e8;
  undefined4 local_e4;
  undefined4 local_e0;
  undefined4 local_dc;
  undefined4 local_d8;
  uint local_d4;
  addrinfo local_d0;
  uint local_b0 [32];
  uint *local_30;
  undefined4 *local_2c;
  
  __s = *param_2;
  pcVar3 = strrchr(__s,0x2f);
  if (pcVar3 != (char *)0x0) {
    __s = pcVar3 + 1;
  }
  DAT_00438d08 = &siplist;
  DAT_00438cdc = &nisnamelist;
  DAT_00438d2c = &nisplist;
  DAT_00438cf8 = &nispnamelist;
  DAT_00438cf0 = &bcmcslist;
  DAT_00438cd4 = &bcmcsnamelist;
  siplist = 0;
  nisnamelist = 0;
  nisplist = 0;
  nispnamelist = 0;
  bcmcslist = 0;
  bcmcsnamelist = 0;
  DAT_00438cc4 = &sipnamelist;
  DAT_00438ccc = &ntplist;
  DAT_00438ce4 = &nislist;
  sipnamelist = 0;
  ntplist = 0;
  nislist = 0;
  DAT_00438d1c = &dnsnamelist;
  DAT_0043a63c = 0;
  DAT_0043a640 = &DAT_0043a63c;
  dnslist = 0;
  DAT_00438d00 = &dnslist;
  dnsnamelist = 0;
  memset(&DAT_0043a648,0,0x80)   //possible issue identified - semgrep
  memset(inf_uid,0,0x20)   //possible issue identified - semgrep
  uVar4 = time((time_t *)0x0);
  uVar5 = getpid();
  srandom(uVar5 & uVar4);
  local_2c = &local_f4;
LAB_0040960c:
  iVar6 = getopt(param_1,param_2,"c:dDfk:n:p:P:s:u:")   //possible issue identified - semgrep
  if (iVar6 != -1) {
    do {
      switch(iVar6) {
      case 0x44:
        goto switchD_0040968c_caseD_44;
      default:
        goto switchD_0040968c_caseD_45;
      case 0x50:
        PTR_s__var_run_dhcp6s_pid_004388a0 = _optarg;
        goto LAB_0040960c;
      case 99:
        PTR_s__var_etc_dhcp6s_conf_00438898 = _optarg;
        goto LAB_0040960c;
      case 100:
        DAT_00438db4 = 1;
        goto LAB_0040960c;
      case 0x66:
        foreground = foreground + 1;
        goto LAB_0040960c;
      case 0x6b:
        PTR_s__var_etc_dhcp6sctlkey_0043889c = _optarg;
        goto LAB_0040960c;
      case 0x6e:
        warnx("-n dnsserv option was obsoleted.  use configuration file.");
        iVar6 = inet_pton(10,_optarg,local_2c)   //possible issue identified - semgrep
        if (iVar6 == 1) {
          puVar10 = (undefined4 *)malloc(0x30)   //possible issue identified - semgrep
          puVar1 = DAT_0043a640;
          if (puVar10 != (undefined4 *)0x0) {
            puVar10[3] = local_f4;
            puVar10[4] = local_f0;
            puVar10[5] = local_ec;
            *puVar10 = 0;
            puVar10[6] = local_e8;
            puVar2 = puVar10;
            *DAT_0043a640 = puVar10;
            DAT_0043a640 = puVar2;
            puVar10[1] = puVar1;
            goto LAB_0040960c;
          }
          errx(1,"malloc failed for a DNS server");
        }
        pcVar3 = "invalid DNS server %s";
        errx(1,"invalid DNS server %s",_optarg);
        goto LAB_0040a3f0;
      case 0x70:
        PTR_DAT_00438894 = _optarg;
        goto LAB_0040960c;
      case 0x73:
        strcpy(&DAT_0043a648,_optarg)   //possible issue identified - semgrep
        goto LAB_0040960c;
      case 0x75:
        strcpy(inf_uid,_optarg)   //possible issue identified - semgrep
        iVar6 = getopt(param_1,param_2,"c:dDfk:n:p:P:s:u:")   //possible issue identified - semgrep
        if (iVar6 == -1) goto LAB_004096d0;
      }
    } while( true );
  }
LAB_004096d0:
  if (_optind != param_1 + -1) {
switchD_0040968c_caseD_45:
    fwrite("usage: dhcp6s [-c configfile] [-dDf] [-k ctlkeyfile] [-p ctlport] [-P pidfile] [-s hlpfile] [-u infuid] intface\n"
           ,1,0x70,_stderr);
LAB_0040965c:
                    /* WARNING: Subroutine does not return */
    exit(0);
  }
  param_2 = param_2 + _optind;
  DAT_00438db0 = *param_2;
  if (foreground == 0) {
    openlog(__s,9,0x18);
  }
  setloglevel(DAT_00438db4);
  iVar6 = ifinit(DAT_00438db0);
  if (iVar6 == 0) goto LAB_0040a144;
  iVar6 = cfparse(PTR_s__var_etc_dhcp6s_conf_00438898);
  if (iVar6 != 0) {
    dprintf(3,"main","failed to parse configuration file");
    goto LAB_0040a144;
  }
  if ((foreground == 0) && (iVar6 = daemon(0,0), iVar6 < 0)) {
    err(1,"daemon");
LAB_0040a4b0:
    piVar11 = __errno_location();
    pcVar3 = strerror(*piVar11);
    dprintf(4,"server6_init","failed to set signal: %s",pcVar3);
    goto LAB_0040a144;
  }
  _Var7 = getpid();
  __stream = fopen(PTR_s__var_run_dhcp6s_pid_004388a0,"w")   //possible issue identified - semgrep
  if (__stream != (FILE *)0x0) {
    fprintf(__stream,"%d\n",_Var7);
    fclose(__stream);
  }
  if (DAT_0043a63c != 0) {
    if (dnslist != 0) {
      dprintf(6,"main","do not specify DNS servers both by command line and by configuration file.")
      ;
      goto LAB_0040a144;
    }
    dhcp6_move_list(&dnslist,&DAT_0043a63c);
    DAT_0043a63c = 0;
    DAT_0043a640 = &DAT_0043a63c;
  }
  argv_ifname = *param_2;
  local_f8 = 1;
  DAT_00439604 = &DAT_00439600;
  DAT_00439600 = 0;
  iVar6 = lease_init();
  pcVar3 = "! ";
  if (iVar6 != 0) {
LAB_0040a3f0:
    dprintf(3,pcVar3 + 0x283c,"failed to initialize the lease table")   //possible issue identified - semgrep
    goto LAB_0040a144;
  }
  ifidx = if_nametoindex(DAT_00438db0);
  if (ifidx == 0) {
    dprintf(3,"server6_init","invalid interface %s",DAT_00438db0);
    goto LAB_0040a144;
  }
  duid_type = 3;
  iVar6 = get_duid("/var/run/dhcp6s_duid",&DAT_0043a634);
  if (iVar6 != 0) {
    dprintf(3,"server6_init","failed to get a DUID");
    goto LAB_0040a144;
  }
  iVar6 = dhcp6_ctl_authinit(PTR_s__var_etc_dhcp6sctlkey_0043889c,&DAT_00438db8,&DAT_0043a644);
  if (iVar6 != 0) {
    dprintf(5,"server6_init","failed to initialize control message authentication");
  }
  DAT_0043a62c = 0x20;
  DAT_00438df8 = 0x1000;
  DAT_00438df4 = &DAT_0043962c;
  DAT_00439618 = &DAT_00438df4;
  DAT_0043961c = 1;
  DAT_0043a630 = (int)malloc(0x20)   //possible issue identified - semgrep
  if ((void *)DAT_0043a630 == (void *)0x0) {
    dprintf(3,"server6_init","memory allocation failed");
    goto LAB_0040a144;
  }
  local_d0.ai_family = 10;
  local_d0.ai_protocol = 0x11;
  local_d0.ai_flags = 1;
  local_d0.ai_addrlen = 0;
  local_d0.ai_addr = (sockaddr *)0x0;
  local_d0.ai_canonname = (char *)0x0;
  local_d0.ai_next = (addrinfo *)0x0;
  local_d0.ai_socktype = 1;
  iVar6 = getaddrinfo((char *)0x0,"547",&local_d0,&local_100);
  if (iVar6 != 0) goto LAB_0040a234;
  insock = socket(local_100->ai_family,local_100->ai_socktype,local_100->ai_protocol);
  if ((int)insock < 0) {
    piVar11 = __errno_location();
    pcVar3 = strerror(*piVar11);
    dprintf(3,"server6_init","socket(insock): %s",pcVar3);
    goto LAB_0040a144;
  }
  local_30 = &local_f8;
  iVar6 = setsockopt(insock,0xffff,4,local_30,4);
  if (iVar6 < 0) {
    piVar11 = __errno_location();
    pcVar3 = strerror(*piVar11);
    dprintf(3,"server6_init","setsockopt(insock, SO_REUSEPORT): %s",pcVar3);
    goto LAB_0040a144;
  }
  iVar6 = setsockopt(insock,0xffff,4,local_30,4);
  if (iVar6 < 0) {
    piVar11 = __errno_location();
    pcVar3 = strerror(*piVar11);
    dprintf(3,"server6_init","setsockopt(insock, SO_REUSEADDR): %s",pcVar3);
    goto LAB_0040a144;
  }
  iVar6 = setsockopt(insock,0x29,0x31,local_30,4);
  if (iVar6 < 0) {
    piVar11 = __errno_location();
    pcVar3 = strerror(*piVar11);
    dprintf(3,"server6_init","setsockopt(inbound, IPV6_RECVPKTINFO): %s",pcVar3);
    goto LAB_0040a144;
  }
  iVar6 = setsockopt(insock,0x29,0x1a,local_30,4);
  if (iVar6 < 0) {
    piVar11 = __errno_location();
    pcVar3 = strerror(*piVar11);
    dprintf(3,"server6_init","setsockopt(inbound, IPV6_V6ONLY): %s",pcVar3);
    goto LAB_0040a144;
  }
  iVar6 = bind(insock,local_100->ai_addr,local_100->ai_addrlen);
  if (iVar6 < 0) {
    piVar11 = __errno_location();
    pcVar3 = strerror(*piVar11);
    dprintf(3,"server6_init","bind(insock): %s",pcVar3);
    goto LAB_0040a144;
  }
  freeaddrinfo(local_100);
  local_d0.ai_flags = 0;
  iVar6 = getaddrinfo("ff02::1:2","547",&local_d0,&local_fc);
  if (iVar6 == 0) {
    psVar12 = local_fc->ai_addr;
    local_d4 = ifidx;
    local_e4 = *(undefined4 *)(psVar12->sa_data + 6);
    local_d8 = *(undefined4 *)(psVar12[1].sa_data + 2);
    local_dc._0_2_ = psVar12[1].sa_family;
    local_dc._2_1_ = psVar12[1].sa_data[0];
    local_dc._3_1_ = psVar12[1].sa_data[1];
    local_e0 = *(undefined4 *)(psVar12->sa_data + 10);
    iVar6 = setsockopt(insock,0x29,0x14,&local_e4,0x14);
    if (iVar6 != 0) {
LAB_0040a5f4:
      piVar11 = __errno_location();
      pcVar3 = strerror(*piVar11);
      dprintf(3,"server6_init","setsockopt(insock, IPV6_JOIN_GROUP): %s",pcVar3);
      goto LAB_0040a144;
    }
    freeaddrinfo(local_fc);
    local_d0.ai_flags = 0;
    iVar6 = getaddrinfo("ff05::1:3","547",&local_d0,&local_fc);
    if (iVar6 == 0) {
      psVar12 = local_fc->ai_addr;
      local_d4 = ifidx;
      local_e4 = *(undefined4 *)(psVar12->sa_data + 6);
      local_d8 = *(undefined4 *)(psVar12[1].sa_data + 2);
      local_dc._0_2_ = psVar12[1].sa_family;
      local_dc._2_1_ = psVar12[1].sa_data[0];
      local_dc._3_1_ = psVar12[1].sa_data[1];
      local_e0 = *(undefined4 *)(psVar12->sa_data + 10);
      iVar6 = setsockopt(insock,0x29,0x14,&local_e4,0x14);
      if (iVar6 != 0) goto LAB_0040a5f4;
      freeaddrinfo(local_fc);
      local_d0.ai_flags = 0;
      iVar6 = getaddrinfo((char *)0x0,"546",&local_d0,&local_100);
      if (iVar6 == 0) {
        outsock = socket(local_100->ai_family,local_100->ai_socktype,local_100->ai_protocol);
        if (outsock < 0) {
          piVar11 = __errno_location();
          pcVar3 = strerror(*piVar11);
          dprintf(3,"server6_init","socket(outsock): %s",pcVar3);
          goto LAB_0040a144;
        }
        iVar6 = setsockopt(outsock,0x29,0x11,&ifidx,4);
        if (iVar6 < 0) {
          piVar11 = __errno_location();
          pcVar3 = strerror(*piVar11);
          dprintf(3,"server6_init","setsockopt(outsock, IPV6_MULTICAST_IF): %s",pcVar3);
          goto LAB_0040a144;
        }
        freeaddrinfo(local_100);
        local_d0.ai_flags = 0;
        local_d0.ai_addrlen = 0;
        local_d0.ai_addr = (sockaddr *)0x0;
        local_d0.ai_canonname = (char *)0x0;
        local_d0.ai_next = (addrinfo *)0x0;
        local_d0.ai_family = 10;
        local_d0.ai_socktype = 1;
        local_d0.ai_protocol = 0x11;
        iVar6 = getaddrinfo("::","546",&local_d0,&local_100);
        if (iVar6 == 0) {
          memcpy(&DAT_00438dd8,local_100->ai_addr,local_100->ai_addrlen)   //possible issue identified - semgrep
          DAT_00439608 = &DAT_00438dd8;
          freeaddrinfo(local_100);
          local_d0.ai_family = 10;
          local_d0.ai_socktype = 1;
          local_d0.ai_protocol = 0x11;
          local_d0.ai_flags = 0;
          local_d0.ai_addrlen = 0;
          local_d0.ai_addr = (sockaddr *)0x0;
          local_d0.ai_canonname = (char *)0x0;
          local_d0.ai_next = (addrinfo *)0x0;
          iVar6 = getaddrinfo("::","547",&local_d0,&local_100);
          if (iVar6 == 0) {
            memcpy(&DAT_00438dbc,local_100->ai_addr,local_100->ai_addrlen)   //possible issue identified - semgrep
            DAT_0043960c = &DAT_00438dbc;
            freeaddrinfo(local_100);
            if (DAT_00438db8 == 0) {
              dprintf(5,"server6_init","skip opening control port");
            }
            else {
              iVar6 = dhcp6_ctl_init(PTR_DAT_00438890,PTR_DAT_00438894,5,&DAT_00438880);
              if (iVar6 != 0) {
                dprintf(3,"server6_init","failed to initialize control channel");
                goto LAB_0040a144;
              }
            }
            p_Var8 = signal(0xf,FUN_004032a0)   //possible issue identified - semgrep
            if (p_Var8 != (__sighandler_t)0xffffffff) {
              while ((DAT_00438dfc == 0 || ((DAT_00438dfc & 1) == 0))) {
                __timeout = (timeval *)dhcp6_check_timer();
                p_Var9 = (__fd_mask *)local_b0;
                do {
                  *p_Var9 = 0;
                  p_Var9 = p_Var9 + 1;
                } while (&local_30 != (uint **)p_Var9);
                local_f8 = insock;
                local_b0[insock >> 5] = local_b0[insock >> 5] | 1 << (insock & 0x1f);
                if (-1 < (int)DAT_00438880) {
                  local_b0[DAT_00438880 >> 5] =
                       local_b0[DAT_00438880 >> 5] | 1 << (DAT_00438880 & 0x1f);
                  if ((int)insock < (int)DAT_00438880) {
                    local_f8 = DAT_00438880;
                  }
                  dhcp6_ctl_setreadfds(local_b0,local_30);
                }
                iVar6 = select(local_f8 + 1,(fd_set *)local_b0,(fd_set *)0x0,(fd_set *)0x0,__timeout
                              );
                if (iVar6 == -1) {
                  piVar11 = __errno_location();
                  if (*piVar11 != 4) {
                    pcVar3 = strerror(*piVar11);
                    dprintf(3,"server6_mainloop","select: %s",pcVar3);
                    goto LAB_0040a144;
                  }
                }
                else {
                  if (((int)local_b0[insock >> 5] >> (insock & 0x1f) & 1U) != 0) {
                    FUN_0040793c();
                  }
                  if (-1 < (int)DAT_00438880) {
                    if (((int)local_b0[DAT_00438880 >> 5] >> (DAT_00438880 & 0x1f) & 1U) != 0) {
                      dhcp6_ctl_acceptcommand(DAT_00438880,&LAB_00405bbc);
                    }
                    dhcp6_ctl_readcommand(local_b0);
                  }
                }
              }
              remove_all_gateway_rules();
              unlink(PTR_s__var_run_dhcp6s_pid_004388a0)   //possible issue identified - semgrep
              goto LAB_0040965c;
            }
            goto LAB_0040a4b0;
          }
        }
      }
    }
  }
LAB_0040a234:
  pcVar3 = gai_strerror(iVar6);
  dprintf(3,"server6_init","getaddrinfo: %s",pcVar3);
LAB_0040a144:
                    /* WARNING: Subroutine does not return */
  exit(1);
switchD_0040968c_caseD_44:
  DAT_00438db4 = 2;
  goto LAB_0040960c;
}