L L4D2node

NET_OpenSocket

0x001c2840 · 1808 bytes · __cdecl

_Z14NET_OpenSocketPKcRii

Decompiled

undefined (3 params)

/* WARNING: Type propagation algorithm not settling */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* NET_OpenSocket(char const*, int&, int) */

int NET_OpenSocket(char *param_1,int *param_2,int param_3)

{
  ushort uVar1;
  int iVar2;
  int *piVar3;
  int iVar4;
  undefined4 uVar5;
  int iVar6;
  int in_GS_OFFSET;
  undefined4 local_44;
  int local_40;
  int local_3c [3];
  sockaddr local_30;
  int local_20;
  
  local_40 = -1;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  if (param_3 == 6) {
    iVar2 = (**(code **)(_g_pVCR + 0xc))();
    if (iVar2 != 2) {
      local_40 = socket(2,1,6);
    }
  }
  else {
    iVar2 = (**(code **)(_g_pVCR + 0xc))();
    if (iVar2 != 2) {
      local_40 = socket(2,2,param_3);
    }
  }
  (**(code **)(_g_pVCR + 0x74))("socket()",&local_40,4);
  if (local_40 == -1) {
    NET_GetLastError();
    if (net_error != 0x61) {
      uVar5 = NET_ErrorString(net_error);
      Msg("WARNING: NET_OpenSocket: socket failed: %s",uVar5);
      iVar2 = 0;
      goto LAB_001c2cda;
    }
  }
  else {
    local_44 = 1;
    iVar2 = (**(code **)(_g_pVCR + 0xc))();
    if (iVar2 != 2) {
      local_3c[0] = ioctl(local_40,0x5421,&local_44);
    }
    (**(code **)(_g_pVCR + 0x74))("ioctlsocket",local_3c,4);
    if (local_3c[0] == -1) {
      NET_GetLastError();
      uVar5 = NET_ErrorString(net_error);
      Msg("WARNING: NET_OpenSocket: ioctl FIONBIO: %s\n",uVar5);
    }
    local_44 = 1;
    if (param_3 == 6) {
      iVar2 = (**(code **)(_g_pVCR + 0xc))();
      if (iVar2 != 2) {
        local_3c[0] = setsockopt(local_40,1,9,&local_44,4);
      }
      (**(code **)(_g_pVCR + 0x74))("setsockopt",local_3c,4);
      if (local_3c[0] == -1) {
        NET_GetLastError();
        uVar5 = NET_ErrorString(net_error);
        Msg("WARNING: NET_OpenSocket: setsockopt SO_KEEPALIVE: %s\n",uVar5);
        iVar2 = 0;
        goto LAB_001c2cda;
      }
      local_3c[2] = 0;
      local_3c[1] = 0;
      iVar2 = (**(code **)(_g_pVCR + 0xc))();
      if (iVar2 != 2) {
        local_3c[0] = setsockopt(local_40,1,0xd,local_3c + 1,8);
      }
      (**(code **)(_g_pVCR + 0x74))("setsockopt",local_3c,4);
      if (local_3c[0] == -1) {
        NET_GetLastError();
        uVar5 = NET_ErrorString(net_error);
        Msg("WARNING: NET_OpenSocket: setsockopt SO_LINGER: %s\n",uVar5);
        iVar2 = 0;
        goto LAB_001c2cda;
      }
      local_44 = 1;
      iVar2 = (**(code **)(_g_pVCR + 0xc))();
      if (iVar2 != 2) {
        local_3c[0] = setsockopt(local_40,6,1,&local_44,4);
      }
      (**(code **)(_g_pVCR + 0x74))("setsockopt",local_3c,4);
      if (local_3c[0] == -1) {
        NET_GetLastError();
        uVar5 = NET_ErrorString(net_error);
        Msg("WARNING: NET_OpenSocket: setsockopt TCP_NODELAY: %s\n",uVar5);
        iVar2 = 0;
        goto LAB_001c2cda;
      }
      local_44 = 0x37ab0;
      iVar2 = (**(code **)(_g_pVCR + 0xc))();
      if (iVar2 != 2) {
        local_3c[0] = setsockopt(local_40,1,7,&local_44,4);
      }
      (**(code **)(_g_pVCR + 0x74))("setsockopt",local_3c,4);
      if (local_3c[0] == -1) {
        NET_GetLastError();
        uVar5 = NET_ErrorString(net_error);
        Msg("WARNING: NET_OpenSocket: setsockopt SO_SNDBUF: %s\n",uVar5);
        iVar2 = 0;
        goto LAB_001c2cda;
      }
      local_44 = 0x37ab0;
      iVar2 = (**(code **)(_g_pVCR + 0xc))();
      if (iVar2 != 2) {
        local_3c[0] = setsockopt(local_40,1,8,&local_44,4);
      }
      (**(code **)(_g_pVCR + 0x74))("setsockopt",local_3c,4);
      iVar2 = local_40;
      if (local_3c[0] != -1) goto LAB_001c2cda;
      NET_GetLastError();
      uVar5 = NET_ErrorString(net_error);
      Msg("WARNING: NET_OpenSocket: setsockopt SO_RCVBUF: %s\n",uVar5);
    }
    else {
      iVar2 = (**(code **)(_g_pVCR + 0xc))();
      if (iVar2 != 2) {
        local_3c[0] = setsockopt(local_40,1,6,&local_44,4);
      }
      (**(code **)(_g_pVCR + 0x74))("setsockopt",local_3c,4);
      if (local_3c[0] == -1) {
        NET_GetLastError();
        uVar5 = NET_ErrorString(net_error);
        Msg("WARNING: NET_OpenSocket: setsockopt SO_BROADCAST: %s\n",uVar5);
        iVar2 = 0;
        goto LAB_001c2cda;
      }
      piVar3 = (int *)CommandLine_Tier0();
      iVar2 = (**(code **)(*piVar3 + 0x28))(piVar3,"-reuse");
      if (iVar2 != 0) {
        local_44 = 1;
        iVar2 = (**(code **)(_g_pVCR + 0xc))();
        if (iVar2 != 2) {
          local_3c[0] = setsockopt(local_40,1,2,&local_44,4);
        }
        (**(code **)(_g_pVCR + 0x74))("setsockopt",local_3c,4);
        if (local_3c[0] == -1) {
          NET_GetLastError();
          uVar5 = NET_ErrorString(net_error);
          Msg("WARNING: NET_OpenSocket: setsockopt SO_REUSEADDR: %s\n",uVar5);
          iVar2 = 0;
          goto LAB_001c2cda;
        }
      }
      if (((param_1 == (char *)0x0) || (*param_1 == '\0')) ||
         (iVar2 = _V_strcmp(param_1,"localhost"), iVar2 == 0)) {
        local_30.sa_data[2] = '\0';
        local_30.sa_data[3] = '\0';
        local_30.sa_data[4] = '\0';
        local_30.sa_data[5] = '\0';
      }
      else {
        NET_StringToSockaddr(param_1,&local_30);
      }
      iVar4 = 0x96;
      local_30.sa_family = 2;
      if (g_nForkID < 1) {
        iVar4 = 10;
      }
      iVar6 = 0;
      iVar2 = *param_2;
      do {
        if (iVar2 == -1) {
          local_30.sa_data[0] = '\0';
          local_30.sa_data[1] = '\0';
        }
        else {
          uVar1 = (short)iVar2 + (short)iVar6;
          local_30.sa_data._0_2_ = uVar1 >> 8 | uVar1 * 0x100;
        }
        iVar2 = (**(code **)(_g_pVCR + 0xc))();
        if (iVar2 != 2) {
          local_3c[0] = bind(local_40,&local_30,0x10);
        }
        (**(code **)(_g_pVCR + 0x74))("bind",local_3c,4);
        if (local_3c[0] != -1) {
          if (*param_2 != -1) {
            iVar2 = local_40;
            if (iVar6 == 0) goto LAB_001c2cda;
            iVar2 = *param_2 + iVar6;
            *param_2 = iVar2;
            ConDMsg("Socket bound to non-default port %i because original port was already in use.\n"
                    ,iVar2);
          }
          break;
        }
        NET_GetLastError();
        iVar2 = *param_2;
        if ((iVar2 == -1) || (net_error != 0x62)) {
          uVar5 = NET_ErrorString(net_error);
          Msg("WARNING: NET_OpenSocket: bind: %s\n",uVar5);
          if (local_40 == 0) goto LAB_001c2cd8;
          goto LAB_001c2db3;
        }
        iVar6 = iVar6 + 1;
      } while (iVar6 < iVar4);
      iVar2 = local_40;
      if (iVar6 != iVar4) goto LAB_001c2cda;
      Msg("WARNING: UDP_OpenSocket: unable to bind socket\n");
      if (local_40 != 0) {
LAB_001c2db3:
        NET_CloseSocket(local_40,-1);
        iVar2 = 0;
        goto LAB_001c2cda;
      }
    }
  }
LAB_001c2cd8:
  iVar2 = 0;
LAB_001c2cda:
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return iVar2;
}

SourceMod gamedata

paste into addons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)

Just a Signatures{} block, ready to drop into a gamedata file. Wire it up in your plugin however you like - SDKCall, DHooks, raw memory ops, or anything else.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)