/* WARNING: Restarted to delay deadcode elimination for space: stack */

int FUN_0040b550(void *param_1,void *param_2,int param_3)

{
  int iVar1;
  undefined4 uVar2;
  uint uVar3;
  undefined1 *puVar4;
  uint uVar5;
  uint uVar6;
  int *piVar7;
  int iVar8;
  int iVar9;
  undefined1 uVar10;
  size_t __n;
  undefined4 *__src;
  undefined4 local_80;
  ushort local_7c;
  undefined4 local_78;
  uint local_74;
  uint local_70;
  uint local_6c;
  undefined4 local_68;
  undefined4 local_64;
  undefined4 local_60;
  undefined4 local_5c;
  undefined4 local_58;
  uint local_54;
  uint local_50;
  undefined4 local_4c;
  uint local_48;
  uint local_44;
  undefined1 local_40 [4];
  undefined1 local_3c [4];
  undefined1 local_38 [4];
  undefined4 local_34;
  undefined1 local_30;
  
  if ((param_1 != (void *)0x0) && (param_2 <= param_1)) {
    return -1;
  }
  switch(*(undefined4 *)(param_3 + 8)) {
  default:
    dprintf(3,"copyout_option","unknown option: code %d");
    return -1;
  case 2:
    local_80 = 0;
    local_7c = 0;
    __src = &local_80;
    __n = 6   //possible issue identified - semgrep
    uVar10 = 0xd;
    break;
  case 3:
  case 5:
    __src = &local_4c;
    local_4c = 0;
    local_48 = 0;
    local_44 = 0;
    local_40 = (undefined1  [4])0x0;
    local_3c = (undefined1  [4])0x0;
    local_38 = (undefined1  [4])0x0;
    local_34 = 0;
    local_30 = 0;
    __n = 0x1d   //possible issue identified - semgrep
    uVar10 = 0x1a;
    break;
  case 4:
    __src = &local_78;
    local_78 = 0;
    local_74 = 0;
    local_70 = 0;
    local_6c = 0;
    __n = 0x10   //possible issue identified - semgrep
    uVar10 = 0x19;
    break;
  case 6:
    __src = &local_78;
    local_78 = 0;
    local_74 = 0;
    local_70 = 0;
    local_6c = 0;
    __n = 0x10   //possible issue identified - semgrep
    uVar10 = 3;
    break;
  case 7:
    __src = &local_68;
    local_68 = 0;
    local_64 = 0;
    local_60 = 0;
    local_5c = 0;
    local_58 = 0;
    local_54 = 0;
    local_50 = 0;
    __n = 0x1c   //possible issue identified - semgrep
    uVar10 = 5;
    if (param_1 != (void *)0x0) goto LAB_0040b628;
    iVar8 = 0;
    goto LAB_0040b62c;
  }
  iVar8 = 0;
  if (param_1 != (void *)0x0) {
LAB_0040b628:
    iVar8 = (int)param_1 + __n   //possible issue identified - semgrep
  }
LAB_0040b62c:
  iVar9 = 0;
  for (piVar7 = *(int **)(param_3 + 0x28); piVar7 != (int *)0x0; piVar7 = (int *)*piVar7) {
    iVar1 = FUN_0040b550(iVar8,param_2,piVar7);
    if (iVar1 < 0) goto switchD_0040b744_caseD_0;
    if (param_1 != (void *)0x0) {
      iVar8 = iVar8 + iVar1;
    }
    iVar9 = iVar9 + iVar1;
  }
  iVar9 = iVar9 + __n   //possible issue identified - semgrep
  if (param_1 == (void *)0x0) {
    return iVar9;
  }
  uVar2 = dhcp6optstr(uVar10);
  dprintf(7,"copyout_option","set %s",uVar2);
  if ((int)param_2 - (int)param_1 < (int)__n) {
switchD_0040b744_caseD_0:
    iVar9 = -1;
  }
  else {
    uVar3 = iVar9 - 4U & 0xffff;
    uVar2 = *(undefined4 *)(param_3 + 8);
    *(undefined1 *)((int)__src + 1) = uVar10;
    *(char *)((int)__src + 3) = (char)uVar3;
    *(undefined1 *)__src = 0;
    *(char *)((int)__src + 2) = (char)(uVar3 >> 8);
    switch(uVar2) {
    default:
      goto switchD_0040b744_caseD_0;
    case 2:
      local_7c = *(ushort *)(param_3 + 0xc) << 8 | *(ushort *)(param_3 + 0xc) >> 8;
      break;
    case 4:
    case 6:
      uVar6 = *(uint *)(param_3 + 0x14);
      uVar3 = *(uint *)(param_3 + 0xc);
      uVar5 = *(uint *)(param_3 + 0x10);
      local_74 = uVar3 << 0x18 | uVar3 >> 0x18 | (uVar3 & 0xff0000) >> 8 | (uVar3 & 0xff00) << 8;
      local_70 = uVar5 << 0x18 | uVar5 >> 0x18 | (uVar5 & 0xff0000) >> 8 | (uVar5 & 0xff00) << 8;
      local_6c = uVar6 << 0x18 | uVar6 >> 0x18 | (uVar6 & 0xff0000) >> 8 | (uVar6 & 0xff00) << 8;
      break;
    case 5:
      uVar3 = *(uint *)(param_3 + 0xc);
      uVar5 = *(uint *)(param_3 + 0x10);
      uVar6 = *(uint *)(param_3 + 0x18);
      iVar8 = *(int *)(param_3 + 0x1c);
      puVar4 = local_40 + 1;
      local_48 = uVar3 << 0x18 | uVar3 >> 0x18 | (uVar3 & 0xff0000) >> 8 | (uVar3 & 0xff00) << 8;
      local_44 = uVar5 << 0x18 | uVar5 >> 0x18 | (uVar5 & 0xff0000) >> 8 | (uVar5 & 0xff00) << 8;
      local_3c = (undefined1  [4])((uint)local_3c & 0xffffff00 | *(uint *)(param_3 + 0x14) >> 0x18);
      local_38 = (undefined1  [4])((uint)local_38 & 0xffffff00 | uVar6 >> 0x18);
      local_34._0_1_ = (undefined1)((uint)iVar8 >> 0x18);
      local_34._1_3_ = (undefined3)*(undefined4 *)(param_3 + 0x20);
      local_30 = (undefined1)((uint)*(undefined4 *)(param_3 + 0x20) >> 0x18);
      local_40[0] = (char)*(undefined4 *)(param_3 + 0x24);
      uVar3 = (uint)puVar4 & 3;
      *(uint *)(puVar4 + -uVar3) =
           *(uint *)(puVar4 + -uVar3) & 0xffffffffU >> (4 - uVar3) * 8 |
           *(uint *)(param_3 + 0x14) << uVar3 * 8;
      puVar4 = local_3c + 1;
      uVar3 = (uint)puVar4 & 3;
      *(uint *)(puVar4 + -uVar3) =
           *(uint *)(puVar4 + -uVar3) & 0xffffffffU >> (4 - uVar3) * 8 | uVar6 << uVar3 * 8;
      puVar4 = local_38 + 1;
      uVar3 = (uint)puVar4 & 3;
      *(uint *)(puVar4 + -uVar3) =
           *(uint *)(puVar4 + -uVar3) & 0xffffffffU >> (4 - uVar3) * 8 | iVar8 << uVar3 * 8;
      break;
    case 7:
      uVar3 = *(uint *)(param_3 + 0xc);
      uVar5 = *(uint *)(param_3 + 0x10);
      local_58 = *(undefined4 *)(param_3 + 0x20);
      local_60 = *(undefined4 *)(param_3 + 0x18);
      local_64 = *(undefined4 *)(param_3 + 0x14);
      local_5c = *(undefined4 *)(param_3 + 0x1c);
      local_54 = uVar3 << 0x18 | uVar3 >> 0x18 | (uVar3 & 0xff0000) >> 8 | (uVar3 & 0xff00) << 8;
      local_50 = uVar5 << 0x18 | uVar5 >> 0x18 | (uVar5 & 0xff0000) >> 8 | (uVar5 & 0xff00) << 8;
    }
    memcpy(param_1,__src,__n)   //possible issue identified - semgrep
  }
  return iVar9;
}