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

void main(int param_1,char **param_2)

{
  char *pcVar1;
  int iVar2;
  __sighandler_t p_Var3;
  undefined *puVar4;
  __pid_t _Var5;
  FILE *__stream;
  timeval *__timeout;
  __fd_mask *p_Var6;
  int *piVar7;
  char *__s;
  addrinfo *local_d8;
  uint local_d4;
  addrinfo local_d0;
  uint local_b0 [32];
  uint *local_30 [2];
  
  __s = *param_2;
  ra_pfxlen = 0;
  pcVar1 = strrchr(__s,0x2f);
  if (pcVar1 != (char *)0x0) {
    __s = pcVar1 + 1;
  }
LAB_00406098:
  iVar2 = getopt(param_1,param_2,"c:dDfik:l:p:t:o:")   //possible issue identified - semgrep
  if (iVar2 != -1) {
    do {
      pcVar1 = _optarg;
      switch(iVar2) {
      case 0x44:
        goto switchD_00406114_caseD_44;
      default:
        goto switchD_00406114_caseD_45;
      case 99:
        PTR_s__var_etc_dhcp6c_conf_0043e2f8 = _optarg;
        goto LAB_00406098;
      case 100:
        DAT_0043e9c8 = 1;
        goto LAB_00406098;
      case 0x66:
        foreground = foreground + 1;
        goto LAB_00406098;
      case 0x69:
        DAT_0043e9c0 = 1;
        goto LAB_00406098;
      case 0x6b:
        PTR_s__var_etc_dhcp6cctlkey_0043e2fc = _optarg;
        goto LAB_00406098;
      case 0x6c:
        ra_pfxlen = atoi(_optarg);
        goto LAB_00406098;
      case 0x6f:
        oifname = _optarg;
        goto LAB_00406098;
      case 0x70:
        PTR_s__var_run_dhcp6c_pid_0043e300 = _optarg;
        goto LAB_00406098;
      case 0x74:
        iVar2 = strcasecmp(_optarg,"LL");
        if (iVar2 == 0) {
          duid_type = 3;
        }
        else {
          iVar2 = strcasecmp(pcVar1,"EN");
          if (iVar2 == 0) {
            duid_type = 1;
          }
          else {
            duid_type = 1;
          }
        }
        fprintf(_stderr,"[DHCP6C]duid_type: %d\n",duid_type);
        iVar2 = getopt(param_1,param_2,"c:dDfik:l:p:t:o:")   //possible issue identified - semgrep
        if (iVar2 == -1) goto LAB_00406190;
      }
    } while( true );
  }
LAB_00406190:
  iVar2 = _optind;
  param_1 = param_1 - _optind;
  if (param_1 == 0) {
switchD_00406114_caseD_45:
    fwrite("usage: dhcp6c [-c configfile] [-dDfi] [-p pid-file] [-t type] [-o interface(for ppp6)] interface [interfaces...]\n"
           ,1,0x71,_stderr);
                    /* WARNING: Subroutine does not return */
    exit(0);
  }
  if (foreground == 0) {
    openlog(__s,9,0x18);
  }
  param_2 = param_2 + iVar2;
  setloglevel(DAT_0043e9c8);
  argv_ifname = *param_2;
  local_d4 = 1;
  iVar2 = get_duid("/var/run/dhcp6c_duid",&DAT_0043e9f4);
  if (iVar2 != 0) {
    dprintf(3,"client6_init","failed to get a DUID");
    goto LAB_004068d8;
  }
  iVar2 = dhcp6_ctl_authinit(PTR_s__var_etc_dhcp6cctlkey_0043e2fc,&DAT_0043e9cc,&DAT_0043e9fc);
  if (iVar2 != 0) {
    dprintf(5,"client6_init","failed initialize control message authentication");
  }
  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;
  local_d0.ai_flags = 1;
  iVar2 = getaddrinfo((char *)0x0,"546",&local_d0,&local_d8);
  if (iVar2 == 0) {
    sock = socket(local_d8->ai_family,local_d8->ai_socktype,local_d8->ai_protocol);
    if ((int)sock < 0) {
      dprintf(3,"client6_init","socket");
      goto LAB_004068d8;
    }
    local_30[0] = &local_d4;
    iVar2 = setsockopt(sock,0xffff,4,local_30[0],4);
    if (iVar2 < 0) {
      piVar7 = __errno_location();
      pcVar1 = strerror(*piVar7);
      dprintf(3,"client6_init","setsockopt(SO_REUSEPORT): %s",pcVar1);
      goto LAB_004068d8;
    }
    iVar2 = setsockopt(sock,0x29,0x31,local_30[0],4);
    if (iVar2 < 0) {
      piVar7 = __errno_location();
      pcVar1 = strerror(*piVar7);
      dprintf(3,"client6_init","setsockopt(IPV6_RECVPKTINFO): %s",pcVar1);
      goto LAB_004068d8;
    }
    iVar2 = setsockopt(sock,0x29,0x13,local_30[0],4);
    if (iVar2 < 0) {
      piVar7 = __errno_location();
      pcVar1 = strerror(*piVar7);
      dprintf(3,"client6_init","setsockopt(sock, IPV6_MULTICAST_LOOP): %s",pcVar1);
      goto LAB_004068d8;
    }
    iVar2 = setsockopt(sock,0x29,0x1a,local_30[0],4);
    if (iVar2 < 0) {
      piVar7 = __errno_location();
      pcVar1 = strerror(*piVar7);
      dprintf(3,"client6_init","setsockopt(IPV6_V6ONLY): %s",pcVar1);
      goto LAB_004068d8;
    }
    iVar2 = bind(sock,local_d8->ai_addr,local_d8->ai_addrlen);
    if (iVar2 < 0) {
      piVar7 = __errno_location();
      pcVar1 = strerror(*piVar7);
      dprintf(3,"client6_init","bind: %s",pcVar1);
      goto LAB_004068d8;
    }
    freeaddrinfo(local_d8);
    rtsock = socket(0x10,3,0);
    if (rtsock < 0) {
      piVar7 = __errno_location();
      pcVar1 = strerror(*piVar7);
      dprintf(3,"client6_init","open a routing socket: %s",pcVar1);
      goto LAB_004068d8;
    }
    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;
    iVar2 = getaddrinfo("ff02::1:2","547",&local_d0,&local_d8);
    if (iVar2 == 0) {
      memcpy(&DAT_0043e9d0,local_d8->ai_addr,local_d8->ai_addrlen)   //possible issue identified - semgrep
      DAT_0043e9f0 = &DAT_0043e9d0;
      freeaddrinfo(local_d8);
      if (DAT_0043e9cc == 0) {
        dprintf(5,"client6_init","skip opening control port");
      }
      else {
        iVar2 = dhcp6_ctl_init(PTR_DAT_0043e2f0,PTR_DAT_0043e2f4,5,&DAT_0043e2e0);
        if (iVar2 != 0) {
          dprintf(3,"client6_init","failed to initialize control channel");
          goto LAB_004068d8;
        }
      }
      p_Var3 = signal(1,FUN_004029d0)   //possible issue identified - semgrep
      if ((((p_Var3 == (__sighandler_t)0xffffffff) ||
           (p_Var3 = signal(0xf,FUN_004029d0), p_Var3 == (__sighandler_t)0xffffffff)) ||   //possible issue identified - semgrep
          (p_Var3 = signal(0x10,FUN_004029d0), p_Var3 == (__sighandler_t)0xffffffff)) ||   //possible issue identified - semgrep
         (p_Var3 = signal(0x11,FUN_004029d0), p_Var3 == (__sighandler_t)0xffffffff)) {
        piVar7 = __errno_location();
        pcVar1 = strerror(*piVar7);
        dprintf(4,"client6_init","failed to set signal: %s",pcVar1);
      }
      else {
        if (0 < param_1) {
          while( true ) {
            param_1 = param_1 + -1;
            iVar2 = ifinit(*param_2);
            if (iVar2 == 0) {
              dprintf(3,"main","failed to initialize %s",*param_2);
              goto LAB_004068d8;
            }
            if (param_1 == 0) break;
            param_2 = param_2 + 1;
          }
        }
        puVar4 = &DAT_00440000;
        if (DAT_0043e9c0 == 0) goto LAB_00406a1c;
        while (((foreground == 0 && (DAT_0043e9c0 == 0)) && (iVar2 = daemon(0,0), iVar2 < 0))) {
          puVar4 = (undefined *)err(1,"daemon");
LAB_00406a1c:
          iVar2 = cfparse(*(undefined4 *)(puVar4 + -0x1d08));
          if (iVar2 != 0) {
            dprintf(3,"main","failed to parse configuration file");
            goto LAB_004068d8;
          }
        }
        _Var5 = getpid();
        __stream = fopen(PTR_s__var_run_dhcp6c_pid_0043e300,"w")   //possible issue identified - semgrep
        if (__stream != (FILE *)0x0) {
          fprintf(__stream,"%d\n",_Var5);
          fclose(__stream);
        }
        FUN_00404104(0);
        do {
          while( true ) {
            if (DAT_0043e9ec != 0) {
              if ((DAT_0043e9ec & 1) != 0) {
                DAT_0043e9c4 = 1;
                FUN_004041e4(0);
                unlink(PTR_s__var_run_dhcp6c_pid_0043e300)   //possible issue identified - semgrep
                FUN_00402a70();
              }
              if ((DAT_0043e9ec & 2) != 0) {
                dprintf(6,"process_signals","restarting");
                FUN_004041e4(0);
                FUN_00404104(1);
              }
              if (((DAT_0043e9ec & 4) != 0) &&
                 (iVar2 = find_ifconfbyname(&DAT_00427118), iVar2 != 0)) {
                confirm_all_ia(iVar2);
              }
              if ((DAT_0043e9ec & 8) == 0) {
                DAT_0043e9ec = 0;
              }
              else {
                system("event WAN.RESTART")   //possible issue identified - semgrep
                DAT_0043e9ec = 0;
              }
            }
            __timeout = (timeval *)dhcp6_check_timer();
            p_Var6 = (__fd_mask *)local_b0;
            do {
              *p_Var6 = 0;
              p_Var6 = p_Var6 + 1;
            } while (local_30 != (uint **)p_Var6);
            local_d4 = sock;
            local_b0[sock >> 5] = local_b0[sock >> 5] | 1 << (sock & 0x1f);
            if (-1 < (int)DAT_0043e2e0) {
              local_b0[DAT_0043e2e0 >> 5] = local_b0[DAT_0043e2e0 >> 5] | 1 << (DAT_0043e2e0 & 0x1f)
              ;
              if ((int)sock < (int)DAT_0043e2e0) {
                local_d4 = DAT_0043e2e0;
              }
              dhcp6_ctl_setreadfds(local_b0,local_30[0]);
            }
            iVar2 = select(local_d4 + 1,(fd_set *)local_b0,(fd_set *)0x0,(fd_set *)0x0,__timeout);
            if (iVar2 == -1) break;
            if (((int)local_b0[sock >> 5] >> (sock & 0x1f) & 1U) != 0) {
              FUN_00404a1c();
            }
            if (-1 < (int)DAT_0043e2e0) {
              if (((int)local_b0[DAT_0043e2e0 >> 5] >> (DAT_0043e2e0 & 0x1f) & 1U) != 0) {
                dhcp6_ctl_acceptcommand(DAT_0043e2e0,&LAB_00406ef4);
              }
              dhcp6_ctl_readcommand(local_b0);
            }
          }
          piVar7 = __errno_location();
        } while (*piVar7 == 4);
        pcVar1 = strerror(*piVar7);
        dprintf(3,"client6_mainloop","select: %s",pcVar1);
      }
      goto LAB_004068d8;
    }
  }
  pcVar1 = gai_strerror(iVar2);
  dprintf(3,"client6_init","getaddrinfo: %s",pcVar1);
LAB_004068d8:
                    /* WARNING: Subroutine does not return */
  exit(1);
switchD_00406114_caseD_44:
  DAT_0043e9c8 = 2;
  goto LAB_00406098;
}