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