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

int FUN_0041ea20(int *param_1,size_t *param_2,int param_3,undefined4 param_4,void *param_5,
                code *param_6,undefined4 param_7)

{
  size_t *__src;
  FILE *__stream;
  ssize_t sVar1;
  uint uVar2;
  int iVar3;
  int *piVar4;
  char *pcVar5;
  uint uVar6;
  size_t sVar7;
  iovec local_4068;
  undefined4 local_4060;
  int local_405c;
  undefined4 local_4058;
  msghdr local_4054;
  size_t local_4038 [4096];
  size_t *local_38;
  undefined4 *local_34;
  msghdr *local_30;
  
  local_4068.iov_len = *param_2;
  sVar7 = param_1[7] + 1   //possible issue identified - semgrep
  local_4054.msg_name = &local_4060;
  local_4054.msg_namelen = 0xc;
  local_4054.msg_iov = &local_4068;
  local_4054.msg_iovlen = 1;
  param_1[7] = sVar7;
  local_4054.msg_control = (void *)0x0;
  local_4054.msg_controllen = 0;
  local_4054.msg_flags = 0;
  local_4060 = 0x10;
  param_2[2] = sVar7;
  if (param_5 == (void *)0x0) {
    *(ushort *)((int)param_2 + 6) = *(ushort *)((int)param_2 + 6) | 4;
  }
  local_30 = &local_4054;
  local_4068.iov_base = param_2;
  local_405c = param_3;
  local_4058 = param_4;
  local_34 = (undefined4 *)local_4054.msg_name;
  sVar1 = sendmsg(*param_1,local_30,0);
  local_38 = local_4038;
  if (sVar1 < 0) {
    perror("Cannot talk to rtnetlink");
  }
  else {
    memset(local_38,0,0x4000)   //possible issue identified - semgrep
    local_4068.iov_base = local_38;
    while( true ) {
      while( true ) {
        local_4068.iov_len = 0x4000;
        uVar2 = recvmsg(*param_1,local_30,0);
        if (-1 < (int)uVar2) break;
        piVar4 = __errno_location();
        __stream = _stderr;
        iVar3 = *piVar4;
        if ((iVar3 != 4) && (iVar3 != 0xb)) {
          pcVar5 = strerror(iVar3);
          fprintf(__stream,"netlink receive error %s (%d)\n",pcVar5,*piVar4);
          return -1;
        }
      }
      if (uVar2 == 0) break;
      __src = local_38;
      if (local_4054.msg_namelen != 0xc) {
        pcVar5 = "sender address length == %d\n";
        uVar6 = local_4054.msg_namelen;
        goto LAB_0041ec0c;
      }
      for (; 0xf < uVar2; uVar2 = uVar2 - uVar6) {
        uVar6 = *__src;
        if (((int)(uVar6 - 0x10) < 0) || ((int)uVar2 < (int)uVar6)) {
          if ((local_4054.msg_flags & 0x20U) != 0) {
            fwrite("Truncated message\n",1,0x12,_stderr);
            return -1;
          }
          pcVar5 = "!!!malformed message: len=%d\n";
          goto LAB_0041ec0c;
        }
        if (((param_3 == local_405c) && (__src[3] == param_1[2])) && (sVar7 == __src[2])) {
          if ((short)__src[1] == 2) {
            if (uVar6 - 0x10 < 0x14) {
              fwrite("ERROR truncated\n",1,0x10,_stderr);
              return -1;
            }
            piVar4 = __errno_location();
            sVar7 = __src[4]   //possible issue identified - semgrep
            *piVar4 = -sVar7;
            if (-sVar7 == 0) {
              if (param_5 == (void *)0x0) {
                return 0;
              }
              memcpy(param_5,__src,*__src)   //possible issue identified - semgrep
              return 0;
            }
            perror("RTNETLINK answers");
            return -1;
          }
          if (param_5 != (void *)0x0) {
            memcpy(param_5,__src,uVar6)   //possible issue identified - semgrep
            return 0;
          }
          fwrite("Unexpected reply!!!\n",1,0x14,_stderr);
        }
        else if ((param_6 != (code *)0x0) && (iVar3 = (*param_6)(local_34,__src,param_7), iVar3 < 0)
                ) {
          return iVar3;
        }
        uVar6 = uVar6 + 3 & 0xfffffffc;
        __src = (size_t *)((int)__src + uVar6);
      }
      if ((local_4054.msg_flags & 0x20U) == 0) {
        if (uVar2 != 0) {
          pcVar5 = "!!!Remnant of size %d\n";
          uVar6 = uVar2;
LAB_0041ec0c:
          fprintf(_stderr,pcVar5,uVar6);
                    /* WARNING: Subroutine does not return */
          exit(1);
        }
      }
      else {
        fwrite("Message truncated\n",1,0x12,_stderr);
      }
    }
    fwrite("EOF on netlink\n",1,0xf,_stderr);
  }
  return -1;
}