undefined4 sendOffer(int param_1)
{
uint uVar1;
uint uVar2;
bool bVar3;
int iVar4;
char *pcVar5;
undefined4 uVar6;
int iVar7;
uint uVar8;
void *__src;
uint uVar9;
uint *puVar10;
char *__fmt;
undefined1 *__dest;
undefined4 *puVar11;
uint local_34c;
undefined1 auStack_348 [256];
undefined1 auStack_248 [16];
in_addr local_238;
undefined1 auStack_22c [212];
undefined1 auStack_158 [316];
local_34c = DAT_0041bc60;
FUN_004043f0(auStack_248,param_1,2);
iVar4 = find_static_lease_by_chaddr(param_1 + 0x1c);
if (iVar4 != 0) {
local_238.s_addr = *(uint *)(iVar4 + 0x10);
bVar3 = true;
local_34c = 0xffffffff;
goto LAB_00404afc;
}
iVar4 = find_lease_by_chaddr(param_1 + 0x1c);
if (iVar4 == 0) {
puVar10 = (uint *)get_option(param_1,0x32);
if (puVar10 != (uint *)0x0) {
uVar8 = *puVar10;
uVar9 = uVar8 << 0x18 | uVar8 >> 0x18 | (uVar8 & 0xff0000) >> 8 | (uVar8 & 0xff00) << 8;
if (((((DAT_0041bc44 << 0x18 | DAT_0041bc44 >> 0x18 | (DAT_0041bc44 & 0xff0000) >> 8 |
(DAT_0041bc44 & 0xff00) << 8) <= uVar9) &&
(uVar9 <= (DAT_0041bc48 << 0x18 | DAT_0041bc48 >> 0x18 | (DAT_0041bc48 & 0xff0000) >> 8 |
(DAT_0041bc48 & 0xff00) << 8))) &&
(iVar4 = find_static_lease_by_yiaddr(uVar8), iVar4 == 0)) &&
((iVar4 = find_lease_by_yiaddr(uVar8), iVar4 == 0 ||
(iVar4 = lease_expired(iVar4), iVar4 != 0)))) goto LAB_00404c60;
}
LAB_00404d54:
local_238.s_addr = find_address(0);
if ((local_238.s_addr == 0) && (local_238.s_addr = find_address(1), local_238.s_addr == 0)) {
return 0xffffffff;
}
}
else {
iVar7 = lease_expired(iVar4);
if (iVar7 == 0) {
local_34c = *(uint *)(iVar4 + 0x14);
}
uVar8 = *(uint *)(iVar4 + 0x10);
LAB_00404c60:
local_238.s_addr = uVar8;
if (uVar8 == 0) goto LAB_00404d54;
}
__src = (void *)get_option(param_1,0xc);
if (__src == (void *)0x0) {
__dest = (undefined1 *)0x0;
}
else {
__dest = auStack_348;
memcpy(__dest,__src,(uint)*(byte *)((int)__src + -1)) //possible issue identified - semgrep
auStack_348[*(byte *)((int)__src + -1)] = 0;
}
uVar8 = DAT_0041bc78;
iVar4 = add_lease(auStack_22c,local_238.s_addr,DAT_0041bc78,__dest);
if (iVar4 == 0) {
syslog(0xe5,"DHCP: Server lease pool is full, OFFER abandoned.");
return 0xffffffff;
}
uVar9 = get_option(param_1,0x33);
if (uVar9 != 0) {
uVar1 = uVar9 + 3 & 3;
uVar2 = uVar9 & 3;
uVar8 = (*(int *)((uVar9 + 3) - uVar1) << (3 - uVar1) * 8 |
uVar8 & 0xffffffffU >> (uVar1 + 1) * 8) & -1 << (4 - uVar2) * 8 |
*(uint *)(uVar9 - uVar2) >> uVar2 * 8;
local_34c = uVar8 << 0x18 | uVar8 >> 0x18 | uVar8 >> 8 & 0xff00 | (uVar8 & 0xff00) << 8;
if (DAT_0041bc60 < local_34c) {
local_34c = DAT_0041bc60;
}
}
if (local_34c < DAT_0041bc7c) {
bVar3 = false;
local_34c = DAT_0041bc60;
}
else {
bVar3 = false;
}
LAB_00404afc:
add_simple_option(auStack_158,0x33,
local_34c << 0x18 | local_34c >> 0x18 | local_34c >> 8 & 0xff00 |
(local_34c & 0xff00) << 8);
for (puVar11 = DAT_0041bc4c; puVar11 != (undefined4 *)0x0; puVar11 = (undefined4 *)puVar11[1]) {
if (*(char *)*puVar11 != '3') {
add_option_string(auStack_158);
}
}
FUN_00404494(auStack_248);
if (bVar3) {
pcVar5 = inet_ntoa(local_238);
__fmt = "DHCP: Server sending OFFER of %s for static DHCP client.";
}
else {
pcVar5 = inet_ntoa(local_238);
__fmt = "DHCP: Server sending OFFER of %s.";
}
syslog(0xe5,__fmt,pcVar5);
uVar6 = FUN_00404520(auStack_248,0);
return uVar6;
}