diff --git a/src/mserv.c b/src/mserv.c index a842e92e9..ddabdb6c0 100644 --- a/src/mserv.c +++ b/src/mserv.c @@ -323,7 +323,7 @@ static INT32 GetServersList(void) // // MS_Connect() // -static INT32 MS_SubConnect(const char *ip_addr, const char *str_port, INT32 async, struct sockaddr *bindaddr, socklen_t bindaddrlen) +static INT32 MS_Connect(const char *ip_addr, const char *str_port, INT32 async) { #ifdef NONET (void)ip_addr; @@ -356,48 +356,44 @@ static INT32 MS_SubConnect(const char *ip_addr, const char *str_port, INT32 asyn socket_fd = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol); if (socket_fd != (SOCKET_TYPE)ERRSOCKET) { - if (!bindaddr || bind(socket_fd, bindaddr, bindaddrlen) == 0) + if (async) // do asynchronous connection { - if (async) // do asynchronous connection - { #ifdef FIONBIO #ifdef WATTCP - char res = 1; + char res = 1; #else - unsigned long res = 1; + unsigned long res = 1; #endif - ioctl(socket_fd, FIONBIO, &res); + ioctl(socket_fd, FIONBIO, &res); #endif - if (connect(socket_fd, runp->ai_addr, (socklen_t)runp->ai_addrlen) == ERRSOCKET) - { -#ifdef _WIN32 // humm, on win32/win64 it doesn't work with EINPROGRESS (stupid windows) - if (WSAGetLastError() != WSAEWOULDBLOCK) -#else - if (errno != EINPROGRESS) -#endif - { - con_state = MSCS_FAILED; - CloseConnection(); - I_freeaddrinfo(ai); - return MS_CONNECT_ERROR; - } - } - con_state = MSCS_WAITING; - FD_ZERO(&wset); - FD_SET(socket_fd, &wset); - select_timeout.tv_sec = 0, select_timeout.tv_usec = 0; - I_freeaddrinfo(ai); - return 0; - } - else if (connect(socket_fd, runp->ai_addr, (socklen_t)runp->ai_addrlen) != ERRSOCKET) + if (connect(socket_fd, runp->ai_addr, (socklen_t)runp->ai_addrlen) == ERRSOCKET) { - I_freeaddrinfo(ai); - return 0; +#ifdef _WIN32 // humm, on win32/win64 it doesn't work with EINPROGRESS (stupid windows) + if (WSAGetLastError() != WSAEWOULDBLOCK) +#else + if (errno != EINPROGRESS) +#endif + { + con_state = MSCS_FAILED; + CloseConnection(); + I_freeaddrinfo(ai); + return MS_CONNECT_ERROR; + } } + con_state = MSCS_WAITING; + FD_ZERO(&wset); + FD_SET(socket_fd, &wset); + select_timeout.tv_sec = 0, select_timeout.tv_usec = 0; + I_freeaddrinfo(ai); + return 0; + } + else if (connect(socket_fd, runp->ai_addr, (socklen_t)runp->ai_addrlen) != ERRSOCKET) + { + I_freeaddrinfo(ai); + return 0; } - close(socket_fd); } runp = runp->ai_next; } @@ -406,45 +402,6 @@ static INT32 MS_SubConnect(const char *ip_addr, const char *str_port, INT32 asyn return MS_CONNECT_ERROR; } -static INT32 MS_Connect(const char *ip_addr, const char *str_port, INT32 async) -{ - const char *lhost; - struct my_addrinfo hints; - struct my_addrinfo *ai, *aip; - int c; - if (M_CheckParm("-bindaddr") && ( lhost = M_GetNextParm() )) - { - memset (&hints, 0x00, sizeof(hints)); -#ifdef AI_ADDRCONFIG - hints.ai_flags = AI_ADDRCONFIG; -#endif - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - if (( c = I_getaddrinfo(lhost, 0, &hints, &ai) ) != 0) - { - CONS_Printf( - "mserv.c: bind to %s: %s\n", - lhost, - gai_strerror(c)); - return MS_GETHOSTBYNAME_ERROR; - } - for (aip = ai; aip; aip = aip->ai_next) - { - c = MS_SubConnect(ip_addr, str_port, async, aip->ai_addr, aip->ai_addrlen); - if (c == 0) - { - I_freeaddrinfo(ai); - return 0; - } - } - I_freeaddrinfo(ai); - return c; - } - else - return MS_SubConnect(ip_addr, str_port, async, 0, 0); -} - #define NUM_LIST_SERVER MAXSERVERLIST const msg_server_t *GetShortServersList(INT32 room) {