/* 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;
}