// File: /workspace/github_c_makefile_star2_O3/loversmile[P]sugarcrm/sugar_stdsoap2.c
// Function: soap_bind
SOAP_FMAC2
soap_bind(struct soap *soap, const char *host, int port, int backlog)
{
#ifdef WITH_IPV6
  struct addrinfo *addrinfo = NULL;
  struct addrinfo hints;
  struct addrinfo res;
  int err;
#ifdef IPV6_V6ONLY
  int unset = 0;
#ifdef SOL_IP
  int level = SOL_IP;
#else
  int level = IPPROTO_IPV6;
#endif
#endif
#endif
#ifndef WITH_LEAN
  int len = SOAP_BUFLEN;
  int set = 1;
#endif
  if (soap_valid_socket(soap->master))
  { soap->fclosesocket(soap, soap->master);
    soap->master = SOAP_INVALID_SOCKET;
  }
  soap->socket = SOAP_INVALID_SOCKET;
  soap->errmode = 1;
  if (tcp_init(soap))
  { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR);
    return SOAP_INVALID_SOCKET;
  }
#ifdef WITH_IPV6
  memset((void*)&hints, 0, sizeof(hints));
  hints.ai_family = PF_UNSPEC;
#ifndef WITH_LEAN
  if ((soap->omode & SOAP_IO_UDP))
    hints.ai_socktype = SOCK_DGRAM;
  else
#endif
    hints.ai_socktype = SOCK_STREAM;
  hints.ai_flags = AI_PASSIVE;
  soap->errmode = 2;
  err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
  if (addrinfo)
  { res = *addrinfo;
    memcpy(&soap->peer, addrinfo->ai_addr, addrinfo->ai_addrlen);
    soap->peerlen = addrinfo->ai_addrlen;
    res.ai_addr = (struct sockaddr*)&soap->peer;
    res.ai_addrlen = soap->peerlen;
    freeaddrinfo(addrinfo);
  }
  if (err || !addrinfo)
  { soap_set_receiver_error(soap, SOAP_GAI_STRERROR(err), "getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR);
    return SOAP_INVALID_SOCKET;
  }
  soap->master = (int)socket(res.ai_family, res.ai_socktype, res.ai_protocol);
#else
#ifndef WITH_LEAN
  if ((soap->omode & SOAP_IO_UDP))
    soap->master = (int)socket(AF_INET, SOCK_DGRAM, 0);
  else
#endif
    soap->master = (int)socket(AF_INET, SOCK_STREAM, 0);
#endif
  soap->errmode = 0;
  if (!soap_valid_socket(soap->master))
  { soap->errnum = soap_socket_errno(soap->master);
    soap_set_receiver_error(soap, tcp_error(soap), "socket failed in soap_bind()", SOAP_TCP_ERROR);
    return SOAP_INVALID_SOCKET;
  }
#ifndef WITH_LEAN
  if ((soap->omode & SOAP_IO_UDP))
    soap->socket = soap->master;
#endif
#ifdef SOCKET_CLOSE_ON_EXEC
#ifdef WIN32
#ifndef UNDER_CE
  SetHandleInformation((HANDLE)soap->master, HANDLE_FLAG_INHERIT, 0);
#endif
#else
  fcntl(soap->master, F_SETFD, 1);
#endif
#endif
#ifndef WITH_LEAN
  if (soap->bind_flags && setsockopt(soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int)))
  { soap->errnum = soap_socket_errno(soap->master);
    soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR);
    return SOAP_INVALID_SOCKET;
  }
  if (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) && setsockopt(soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
  { soap->errnum = soap_socket_errno(soap->master);
    soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR);
    return SOAP_INVALID_SOCKET;
  }
  if (setsockopt(soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
  { soap->errnum = soap_socket_errno(soap->master);
    soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR);
    return SOAP_INVALID_SOCKET;
  }
  if (setsockopt(soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
  { soap->errnum = soap_socket_errno(soap->master);
    soap_set_receiver_error(soap, tcp_error(soap), "setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR);
    return SOAP_INVALID_SOCKET;
  }
#ifdef TCP_NODELAY
  if (!(soap->omode & SOAP_IO_UDP) && setsockopt(soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
  { soap->errnum = soap_socket_errno(soap->master);
    soap_set_receiver_error(soap, tcp_error(soap), "setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR);
    return SOAP_INVALID_SOCKET;
  }
#endif
#endif
#ifdef WITH_IPV6
#ifdef IPV6_V6ONLY
  if (setsockopt(soap->master, level, IPV6_V6ONLY, (char*)&unset, sizeof(int)))
  { soap->errnum = soap_socket_errno(soap->master);
    soap_set_receiver_error(soap, tcp_error(soap), "setsockopt IPV6_V6ONLY failed in soap_bind()", SOAP_TCP_ERROR);
    return SOAP_INVALID_SOCKET;
  }
#endif
  soap->errmode = 0;
  if (bind(soap->master, res.ai_addr, (int)res.ai_addrlen))
  { soap->errnum = soap_socket_errno(soap->master);
    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
    soap_closesock(soap);
    soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR);
    return SOAP_INVALID_SOCKET;
  }  
#else
  soap->peerlen = sizeof(soap->peer);
  memset((void*)&soap->peer, 0, sizeof(soap->peer));
  soap->peer.sin_family = AF_INET;
  soap->errmode = 2;
  if (host)
  { if (soap->fresolve(soap, host, &soap->peer.sin_addr))
    { soap_set_receiver_error(soap, tcp_error(soap), "get host by name failed in soap_bind()", SOAP_TCP_ERROR);
      return SOAP_INVALID_SOCKET;
    }
  }
  else
    soap->peer.sin_addr.s_addr = htonl(INADDR_ANY);
  soap->peer.sin_port = htons((short)port);
  soap->errmode = 0;
  if (bind(soap->master, (struct sockaddr*)&soap->peer, (int)soap->peerlen))
  { soap->errnum = soap_socket_errno(soap->master);
    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
    soap_closesock(soap);
    soap_set_receiver_error(soap, tcp_error(soap), "bind failed in soap_bind()", SOAP_TCP_ERROR);
    return SOAP_INVALID_SOCKET;
  }
#endif
  if (!(soap->omode & SOAP_IO_UDP) && listen(soap->master, backlog))
  { soap->errnum = soap_socket_errno(soap->master);
    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
    soap_closesock(soap);
    soap_set_receiver_error(soap, tcp_error(soap), "listen failed in soap_bind()", SOAP_TCP_ERROR);
    return SOAP_INVALID_SOCKET;
  }  
  return soap->master;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
movl %ecx, %ebp
movl %edx, %r14d
movq %rsi, %r15
movq %rdi, %rbx
movl $0x10000, 0x4(%rsp)     # imm = 0x10000
movl $0x1, (%rsp)
movl 0x60d0(%rdi), %esi
cmpl $-0x1, %esi
je 0x3dac4
movq %rbx, %rdi
callq *0x5fd8(%rbx)
movl $0xffffffff, 0x60d0(%rbx) # imm = 0xFFFFFFFF
movl $0xffffffff, 0x60d4(%rbx) # imm = 0xFFFFFFFF
movl $0x1, 0x19218(%rbx)
movl 0xc(%rbx), %eax
andl $0x4, %eax
cmpl $0x1, %eax
movl $0x2, %esi
sbbl $0x0, %esi
movl $0x2, %edi
xorl %edx, %edx
callq 0x3400
movl %eax, 0x60d0(%rbx)
movl $0x0, 0x19218(%rbx)
cmpl $-0x1, %eax
je 0x3db74
movl 0xc(%rbx), %ecx
testb $0x4, %cl
je 0x3db18
movl %eax, 0x60d4(%rbx)
movl 0x68(%rbx), %edx
testl %edx, %edx
je 0x3dbb5
movq %rsp, %rcx
movl %eax, %edi
movl $0x1, %esi
movl $0x4, %r8d
callq 0x30c0
testl %eax, %eax
je 0x3dbac
callq 0x3060
movl (%rax), %eax
movl %eax, 0x1921c(%rbx)
movq %rbx, %rdi
callq 0x3deb7
cmpw $0x2, 0x2(%rbx)
leaq 0x15627(%rip), %rcx     # 0x53184
leaq 0x15610(%rip), %rsi     # 0x53174
cmoveq %rcx, %rsi
leaq 0x14704(%rip), %r8      # 0x52273
jmp 0x3dcc5
callq 0x3060
movl (%rax), %eax
movl %eax, 0x1921c(%rbx)
movq %rbx, %rdi
callq 0x3deb7
cmpw $0x2, 0x2(%rbx)
leaq 0x155ef(%rip), %rcx     # 0x53184
leaq 0x155d8(%rip), %rsi     # 0x53174
cmoveq %rcx, %rsi
leaq 0x146af(%rip), %r8      # 0x52256
jmp 0x3dcc5
movl 0xc(%rbx), %ecx
movl 0x60d0(%rbx), %eax
orl 0x8(%rbx), %ecx
testb $0x10, %cl
je 0x3dc19
movq %rsp, %rcx
movl %eax, %edi
movl $0x1, %esi
movl $0x9, %edx
movl $0x4, %r8d
callq 0x30c0
testl %eax, %eax
je 0x3dc13
callq 0x3060
movl (%rax), %eax
movl %eax, 0x1921c(%rbx)
movq %rbx, %rdi
callq 0x3deb7
cmpw $0x2, 0x2(%rbx)
leaq 0x15588(%rip), %rcx     # 0x53184
leaq 0x15571(%rip), %rsi     # 0x53174
cmoveq %rcx, %rsi
leaq 0x14686(%rip), %r8      # 0x52294
jmp 0x3dcc5
movl 0x60d0(%rbx), %eax
leaq 0x4(%rsp), %rcx
movl %eax, %edi
movl $0x1, %esi
movl $0x7, %edx
movl $0x4, %r8d
callq 0x30c0
testl %eax, %eax
je 0x3dc6e
callq 0x3060
movl (%rax), %eax
movl %eax, 0x1921c(%rbx)
movq %rbx, %rdi
callq 0x3deb7
cmpw $0x2, 0x2(%rbx)
leaq 0x1552a(%rip), %rcx     # 0x53184
leaq 0x15513(%rip), %rsi     # 0x53174
cmoveq %rcx, %rsi
leaq 0x14656(%rip), %r8      # 0x522c2
jmp 0x3dcc5
movl 0x60d0(%rbx), %edi
leaq 0x4(%rsp), %rcx
movl $0x1, %esi
movl $0x8, %edx
movl $0x4, %r8d
callq 0x30c0
testl %eax, %eax
je 0x3dce8
callq 0x3060
movl (%rax), %eax
movl %eax, 0x1921c(%rbx)
movq %rbx, %rdi
callq 0x3deb7
cmpw $0x2, 0x2(%rbx)
leaq 0x154d1(%rip), %rcx     # 0x53184
leaq 0x154ba(%rip), %rsi     # 0x53174
cmoveq %rcx, %rsi
leaq 0x14628(%rip), %r8      # 0x522ed
movq %rbx, %rdi
xorl %edx, %edx
movq %rax, %rcx
movl $0x1c, %r9d
callq 0x4a997
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
testb $0x4, 0xc(%rbx)
jne 0x3dd45
movl 0x60d0(%rbx), %edi
movq %rsp, %rcx
movl $0x6, %esi
movl $0x1, %edx
movl $0x4, %r8d
callq 0x30c0
testl %eax, %eax
je 0x3dd45
callq 0x3060
movl (%rax), %eax
movl %eax, 0x1921c(%rbx)
movq %rbx, %rdi
callq 0x3deb7
cmpw $0x2, 0x2(%rbx)
leaq 0x15453(%rip), %rcx     # 0x53184
leaq 0x1543c(%rip), %rsi     # 0x53174
cmoveq %rcx, %rsi
leaq 0x145d5(%rip), %r8      # 0x52318
jmp 0x3dcc5
movq $0x10, 0x1b338(%rbx)
xorps %xmm0, %xmm0
movups %xmm0, 0x1b324(%rbx)
movw $0x2, 0x1b324(%rbx)
movl $0x2, 0x19218(%rbx)
testq %r15, %r15
je 0x3ddb4
leaq 0x1b328(%rbx), %rdx
movq %rbx, %rdi
movq %r15, %rsi
callq *0x5fc0(%rbx)
testl %eax, %eax
je 0x3ddbb
movq %rbx, %rdi
callq 0x3deb7
cmpw $0x2, 0x2(%rbx)
leaq 0x153e7(%rip), %rcx     # 0x53184
leaq 0x153d0(%rip), %rsi     # 0x53174
cmoveq %rcx, %rsi
leaq 0x14596(%rip), %r8      # 0x52345
jmp 0x3dcc5
movl $0x10, %edx
jmp 0x3ddc1
movl 0x1b338(%rbx), %edx
rolw $0x8, %r14w
leaq 0x1b324(%rbx), %rsi
movw %r14w, 0x1b326(%rbx)
movl $0x0, 0x19218(%rbx)
movl 0x60d0(%rbx), %edi
callq 0x32e0
testl %eax, %eax
je 0x3de2e
callq 0x3060
movl (%rax), %eax
movl %eax, 0x1921c(%rbx)
movq %rbx, %rdi
callq 0x3baf5
movq %rbx, %rdi
callq 0x3deb7
cmpw $0x2, 0x2(%rbx)
leaq 0x1536d(%rip), %rcx     # 0x53184
leaq 0x15356(%rip), %rsi     # 0x53174
cmoveq %rcx, %rsi
leaq 0x14543(%rip), %r8      # 0x5236c
jmp 0x3dcc5
testb $0x4, 0xc(%rbx)
jne 0x3de85
movl 0x60d0(%rbx), %edi
movl %ebp, %esi
callq 0x32b0
testl %eax, %eax
je 0x3de85
callq 0x3060
movl (%rax), %eax
movl %eax, 0x1921c(%rbx)
movq %rbx, %rdi
callq 0x3baf5
movq %rbx, %rdi
callq 0x3deb7
cmpw $0x2, 0x2(%rbx)
leaq 0x15316(%rip), %rcx     # 0x53184
leaq 0x152ff(%rip), %rsi     # 0x53174
cmoveq %rcx, %rsi
leaq 0x14507(%rip), %r8      # 0x52387
jmp 0x3dcc5
movl 0x60d0(%rbx), %eax
jmp 0x3dcdd