* Use camelCase instead of CamelCase and under_squores (as requested by Per, see #435)

* Rename read_all to readNoInt because that function is a read(2) variant that doesn't get interrupted by signals (EINTR)
 * Add Doxygen comments to readNoInt and writeAll

git-svn-id: https://warzone2100.svn.sourceforge.net/svnroot/warzone2100/trunk@7298 4a71c877-e1ca-e34f-864e-861f7616d084
master
Giel van Schijndel 2009-05-03 15:35:50 +00:00 committed by Git SVN Gateway
parent 9c340eb3f7
commit 73a29daefd
1 changed files with 107 additions and 97 deletions

View File

@ -330,7 +330,7 @@ static void freeaddrinfo(struct addrinfo *res)
} }
#endif #endif
static const char* strsockerror(int error) static const char* strSockError(int error)
{ {
#if defined(WZ_OS_WIN) #if defined(WZ_OS_WIN)
switch (error) switch (error)
@ -392,7 +392,11 @@ static const char* strsockerror(int error)
#endif #endif
} }
static ssize_t read_all(Socket* sock, void* buf, size_t max_size) /**
* Similar to read(2) with the exception that this function won't be
* interrupted by signals (EINTR).
*/
static ssize_t readNoInt(Socket* sock, void* buf, size_t max_size)
{ {
ssize_t received; ssize_t received;
@ -405,7 +409,13 @@ static ssize_t read_all(Socket* sock, void* buf, size_t max_size)
return received; return received;
} }
static ssize_t write_all(Socket* sock, const void* buf, size_t size) /**
* Similar to write(2) with the exception that this function will block until
* <em>all</em> data has been written or an error occurs.
*
* @return @c size when succesful or @c SOCKET_ERROR if an error occurred.
*/
static ssize_t writeAll(Socket* sock, const void* buf, size_t size)
{ {
size_t written = 0; size_t written = 0;
@ -507,7 +517,7 @@ static bool setSocketBlocking(const SOCKET fd, bool blocking)
int sockopts = fcntl(fd, F_GETFL); int sockopts = fcntl(fd, F_GETFL);
if (sockopts == SOCKET_ERROR) if (sockopts == SOCKET_ERROR)
{ {
debug(LOG_NET, "Failed to retrieve current socket options: %s", strsockerror(getSockErr())); debug(LOG_NET, "Failed to retrieve current socket options: %s", strSockError(getSockErr()));
return false; return false;
} }
@ -523,7 +533,7 @@ static bool setSocketBlocking(const SOCKET fd, bool blocking)
if (ioctlsocket(fd, FIONBIO, &nonblocking) == SOCKET_ERROR) if (ioctlsocket(fd, FIONBIO, &nonblocking) == SOCKET_ERROR)
#endif #endif
{ {
debug(LOG_NET, "Failed to set socket %sblocking: %s", (blocking ? "" : "non-"), strsockerror(getSockErr())); debug(LOG_NET, "Failed to set socket %sblocking: %s", (blocking ? "" : "non-"), strSockError(getSockErr()));
return false; return false;
} }
@ -570,7 +580,7 @@ static int checkSockets(const SocketSet* set, unsigned int timeout)
if (ret == SOCKET_ERROR) if (ret == SOCKET_ERROR)
{ {
debug(LOG_ERROR, "select failed: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "select failed: %s", strSockError(getSockErr()));
return SOCKET_ERROR; return SOCKET_ERROR;
} }
@ -585,7 +595,7 @@ static int checkSockets(const SocketSet* set, unsigned int timeout)
return ret; return ret;
} }
static void SocketClose(Socket* sock) static void socketClose(Socket* sock)
{ {
if (sock->fd != INVALID_SOCKET) if (sock->fd != INVALID_SOCKET)
{ {
@ -599,7 +609,7 @@ static void SocketClose(Socket* sock)
free(sock); free(sock);
} }
static Socket* SocketAccept(Socket* sock) static Socket* socketAccept(Socket* sock)
{ {
Socket* const conn = malloc(sizeof(*conn)); Socket* const conn = malloc(sizeof(*conn));
if (conn == NULL) if (conn == NULL)
@ -618,8 +628,8 @@ static Socket* SocketAccept(Socket* sock)
if (conn->fd == INVALID_SOCKET) if (conn->fd == INVALID_SOCKET)
{ {
debug(LOG_ERROR, "accept failed: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "accept failed: %s", strSockError(getSockErr()));
SocketClose(conn); socketClose(conn);
return NULL; return NULL;
} }
@ -649,14 +659,14 @@ static Socket* SocketOpen(const struct addrinfo* addr, unsigned int timeout)
if (conn->fd == INVALID_SOCKET) if (conn->fd == INVALID_SOCKET)
{ {
debug(LOG_ERROR, "Failed to create a socket: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Failed to create a socket: %s", strSockError(getSockErr()));
SocketClose(conn); socketClose(conn);
return NULL; return NULL;
} }
if (!setSocketBlocking(conn->fd, false)) if (!setSocketBlocking(conn->fd, false))
{ {
SocketClose(conn); socketClose(conn);
return NULL; return NULL;
} }
@ -675,8 +685,8 @@ static Socket* SocketOpen(const struct addrinfo* addr, unsigned int timeout)
#endif #endif
|| timeout == 0) || timeout == 0)
{ {
debug(LOG_NET, "Failed to start connecting: %s", strsockerror(getSockErr())); debug(LOG_NET, "Failed to start connecting: %s", strSockError(getSockErr()));
SocketClose(conn); socketClose(conn);
return NULL; return NULL;
} }
@ -699,16 +709,16 @@ static Socket* SocketOpen(const struct addrinfo* addr, unsigned int timeout)
if (ret == SOCKET_ERROR) if (ret == SOCKET_ERROR)
{ {
debug(LOG_NET, "Failed to wait for connection: %s", strsockerror(getSockErr())); debug(LOG_NET, "Failed to wait for connection: %s", strSockError(getSockErr()));
SocketClose(conn); socketClose(conn);
return NULL; return NULL;
} }
if (ret == 0) if (ret == 0)
{ {
setSockErr(ETIMEDOUT); setSockErr(ETIMEDOUT);
debug(LOG_NET, "Timed out while waiting for connection to be established: %s", strsockerror(getSockErr())); debug(LOG_NET, "Timed out while waiting for connection to be established: %s", strSockError(getSockErr()));
SocketClose(conn); socketClose(conn);
return NULL; return NULL;
} }
@ -725,22 +735,22 @@ static Socket* SocketOpen(const struct addrinfo* addr, unsigned int timeout)
&& getSockErr() != EISCONN) && getSockErr() != EISCONN)
#endif #endif
{ {
debug(LOG_NET, "Failed to connect: %s", strsockerror(getSockErr())); debug(LOG_NET, "Failed to connect: %s", strSockError(getSockErr()));
SocketClose(conn); socketClose(conn);
return NULL; return NULL;
} }
} }
if (!setSocketBlocking(conn->fd, true)) if (!setSocketBlocking(conn->fd, true))
{ {
SocketClose(conn); socketClose(conn);
return NULL; return NULL;
} }
return conn; return conn;
} }
static Socket* SocketListen(unsigned int port) static Socket* socketListen(unsigned int port)
{ {
struct sockaddr_in addr; struct sockaddr_in addr;
@ -762,16 +772,16 @@ static Socket* SocketListen(unsigned int port)
if (conn->fd == INVALID_SOCKET) if (conn->fd == INVALID_SOCKET)
{ {
debug(LOG_ERROR, "Failed to create an IPv4 socket: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Failed to create an IPv4 socket: %s", strSockError(getSockErr()));
SocketClose(conn); socketClose(conn);
return NULL; return NULL;
} }
if (bind(conn->fd, (const struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR if (bind(conn->fd, (const struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR
|| listen(conn->fd, 5) == SOCKET_ERROR) || listen(conn->fd, 5) == SOCKET_ERROR)
{ {
debug(LOG_ERROR, "Failed to set up IPv4 socket for listening on port %u: %s", port, strsockerror(getSockErr())); debug(LOG_ERROR, "Failed to set up IPv4 socket for listening on port %u: %s", port, strSockError(getSockErr()));
SocketClose(conn); socketClose(conn);
return NULL; return NULL;
} }
@ -1021,7 +1031,7 @@ static BOOL NET_fillBuffer(NETBUFSOCKET* bs, SocketSet* socket_set)
return false; return false;
} }
size = read_all(bs->socket, bufstart, bufsize); size = readNoInt(bs->socket, bufstart, bufsize);
if (size > 0) if (size > 0)
{ {
@ -1039,8 +1049,8 @@ static BOOL NET_fillBuffer(NETBUFSOCKET* bs, SocketSet* socket_set)
{ {
debug(LOG_ERROR, "Fatal connection error: buffer size of (%d) was too small, current byte count was %d", NET_BUFFER_SIZE, bs->bytes); debug(LOG_ERROR, "Fatal connection error: buffer size of (%d) was too small, current byte count was %d", NET_BUFFER_SIZE, bs->bytes);
} }
debug(LOG_WARNING, "SDLNet_TCP_Recv error: %s tcp_socket %p is now invalid", strsockerror(getSockErr()), bs->socket); debug(LOG_WARNING, "SDLNet_TCP_Recv error: %s tcp_socket %p is now invalid", strSockError(getSockErr()), bs->socket);
SocketClose(bs->socket); socketClose(bs->socket);
bs->socket = NULL; bs->socket = NULL;
} }
@ -1219,7 +1229,7 @@ void NETplayerLeaving(UDWORD dpid)
// Although we can get a error result from DelSocket, it don't really matter here. // Although we can get a error result from DelSocket, it don't really matter here.
delSocket(socket_set, connected_bsocket[dpid]->socket); delSocket(socket_set, connected_bsocket[dpid]->socket);
SocketClose(connected_bsocket[dpid]->socket); socketClose(connected_bsocket[dpid]->socket);
connected_bsocket[dpid]->socket = NULL; connected_bsocket[dpid]->socket = NULL;
} }
else else
@ -1417,11 +1427,11 @@ static void NETsendGAMESTRUCT(Socket* sock, const GAMESTRUCT* game)
// Send over the GAMESTRUCT // Send over the GAMESTRUCT
result = write_all(sock, buf, sizeof(buf)); result = writeAll(sock, buf, sizeof(buf));
if (result == SOCKET_ERROR) if (result == SOCKET_ERROR)
{ {
// If packet could not be sent, we should inform user of the error. // If packet could not be sent, we should inform user of the error.
debug(LOG_ERROR, "Failed to send GAMESTRUCT. Reason: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Failed to send GAMESTRUCT. Reason: %s", strSockError(getSockErr()));
debug(LOG_ERROR, "Please make sure TCP ports %u & %u are open!", masterserver_port, gameserver_port); debug(LOG_ERROR, "Please make sure TCP ports %u & %u are open!", masterserver_port, gameserver_port);
} }
} }
@ -1449,12 +1459,12 @@ static bool NETrecvGAMESTRUCT(GAMESTRUCT* game)
|| socket_set == NULL || socket_set == NULL
|| checkSockets(socket_set, 1000) <= 0 || checkSockets(socket_set, 1000) <= 0
|| !tcp_socket->ready || !tcp_socket->ready
|| (result = read_all(tcp_socket, buf, sizeof(buf))) != sizeof(buf)) || (result = readNoInt(tcp_socket, buf, sizeof(buf))) != sizeof(buf))
{ {
if (result == SOCKET_ERROR) if (result == SOCKET_ERROR)
{ {
debug(LOG_WARNING, "Server socket ecountered error: %s", strsockerror(getSockErr())); debug(LOG_WARNING, "Server socket ecountered error: %s", strSockError(getSockErr()));
SocketClose(tcp_socket); socketClose(tcp_socket);
tcp_socket = NULL; tcp_socket = NULL;
} }
return false; return false;
@ -1561,7 +1571,7 @@ int NETinit(BOOL bFirstCall)
WORD ver_required = (2 << 8) + 2; WORD ver_required = (2 << 8) + 2;
if (WSAStartup(ver_required, &stuff) != 0) if (WSAStartup(ver_required, &stuff) != 0)
{ {
debug(LOG_ERROR, "Failed to initialize Winsock: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Failed to initialize Winsock: %s", strSockError(getSockErr()));
return -1; return -1;
} }
} }
@ -1625,7 +1635,7 @@ int NETclose(void)
if(bsocket) if(bsocket)
{ // need delSocket() as well, socket_set or tmp_socket_set? { // need delSocket() as well, socket_set or tmp_socket_set?
debug(LOG_NET, "Closing bsocket %p socket %p (tcp_socket=%p)", bsocket, bsocket->socket, tcp_socket); debug(LOG_NET, "Closing bsocket %p socket %p (tcp_socket=%p)", bsocket, bsocket->socket, tcp_socket);
//SocketClose(bsocket->socket); //socketClose(bsocket->socket);
NET_destroyBufferedSocket(bsocket); NET_destroyBufferedSocket(bsocket);
bsocket=NULL; bsocket=NULL;
} }
@ -1637,7 +1647,7 @@ int NETclose(void)
if(connected_bsocket[i]->socket) if(connected_bsocket[i]->socket)
{ {
debug(LOG_NET, "Closing connected_bsocket[%u], %p", i, connected_bsocket[i]->socket); debug(LOG_NET, "Closing connected_bsocket[%u], %p", i, connected_bsocket[i]->socket);
SocketClose(connected_bsocket[i]->socket); socketClose(connected_bsocket[i]->socket);
} }
NET_destroyBufferedSocket(connected_bsocket[i]); NET_destroyBufferedSocket(connected_bsocket[i]);
connected_bsocket[i]=NULL; connected_bsocket[i]=NULL;
@ -1658,7 +1668,7 @@ int NETclose(void)
{ {
// FIXME: need delSocket() as well, socket_set or tmp_socket_set? // FIXME: need delSocket() as well, socket_set or tmp_socket_set?
debug(LOG_NET, "Closing tmp_socket[%d] %p", i, tmp_socket[i]); debug(LOG_NET, "Closing tmp_socket[%d] %p", i, tmp_socket[i]);
SocketClose(tmp_socket[i]); socketClose(tmp_socket[i]);
tmp_socket[i]=NULL; tmp_socket[i]=NULL;
} }
} }
@ -1674,7 +1684,7 @@ int NETclose(void)
if (tcp_socket) if (tcp_socket)
{ {
debug(LOG_NET, "Closing tcp_socket %p", tcp_socket); debug(LOG_NET, "Closing tcp_socket %p", tcp_socket);
SocketClose(tcp_socket); socketClose(tcp_socket);
tcp_socket=NULL; tcp_socket=NULL;
} }
@ -1792,7 +1802,7 @@ BOOL NETsend(NETMSG *msg, UDWORD player)
if ( player < MAX_CONNECTED_PLAYERS if ( player < MAX_CONNECTED_PLAYERS
&& connected_bsocket[player] != NULL && connected_bsocket[player] != NULL
&& connected_bsocket[player]->socket != NULL && connected_bsocket[player]->socket != NULL
&& (result = write_all(connected_bsocket[player]->socket, && (result = writeAll(connected_bsocket[player]->socket,
msg, size) == size)) msg, size) == size))
{ {
nStats.bytesSent += size; nStats.bytesSent += size;
@ -1802,8 +1812,8 @@ BOOL NETsend(NETMSG *msg, UDWORD player)
else if (result == SOCKET_ERROR) else if (result == SOCKET_ERROR)
{ {
// Write error, most likely client disconnect. // Write error, most likely client disconnect.
debug(LOG_ERROR, "Failed to send message: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Failed to send message: %s", strSockError(getSockErr()));
SocketClose(connected_bsocket[player]->socket); socketClose(connected_bsocket[player]->socket);
connected_bsocket[player]->socket = NULL; connected_bsocket[player]->socket = NULL;
} }
} }
@ -1811,15 +1821,15 @@ BOOL NETsend(NETMSG *msg, UDWORD player)
{ {
// FIXME: We are NOT checking checkSockets/SDLNet_SocketReady // FIXME: We are NOT checking checkSockets/SDLNet_SocketReady
// SDLNet_TCP_Send *can* block! // SDLNet_TCP_Send *can* block!
if (tcp_socket && (result = write_all(tcp_socket, msg, size) == size)) if (tcp_socket && (result = writeAll(tcp_socket, msg, size) == size))
{ {
return true; return true;
} }
else if (result == SOCKET_ERROR) else if (result == SOCKET_ERROR)
{ {
// Write error, most likely client disconnect. // Write error, most likely client disconnect.
debug(LOG_ERROR, "Failed to send message: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Failed to send message: %s", strSockError(getSockErr()));
SocketClose(tcp_socket); socketClose(tcp_socket);
tcp_socket = NULL; tcp_socket = NULL;
} }
@ -1862,13 +1872,13 @@ BOOL NETbcast(NETMSG *msg)
{ {
// FIXME: We are NOT checking checkSockets/SDLNet_SocketReady // FIXME: We are NOT checking checkSockets/SDLNet_SocketReady
// SDLNet_TCP_Send *can* block! // SDLNet_TCP_Send *can* block!
if (write_all(connected_bsocket[i]->socket, msg, size) == SOCKET_ERROR) if (writeAll(connected_bsocket[i]->socket, msg, size) == SOCKET_ERROR)
{ {
// Write error, most likely client disconnect. // Write error, most likely client disconnect.
debug(LOG_ERROR, "Failed to send message: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Failed to send message: %s", strSockError(getSockErr()));
players[i].heartbeat = false; //mark them dead players[i].heartbeat = false; //mark them dead
debug(LOG_WARNING, "Player (dpid %u) connection was broken.", i); debug(LOG_WARNING, "Player (dpid %u) connection was broken.", i);
SocketClose(connected_bsocket[i]->socket); socketClose(connected_bsocket[i]->socket);
connected_bsocket[i]->socket = NULL; connected_bsocket[i]->socket = NULL;
} }
} }
@ -1882,12 +1892,12 @@ BOOL NETbcast(NETMSG *msg)
} }
// FIXME: We are NOT checking checkSockets/SDLNet_SocketReady // FIXME: We are NOT checking checkSockets/SDLNet_SocketReady
// SDLNet_TCP_Send *can* block! // SDLNet_TCP_Send *can* block!
if (write_all(tcp_socket, msg, size) == SOCKET_ERROR) if (writeAll(tcp_socket, msg, size) == SOCKET_ERROR)
{ {
// Write error, most likely client disconnect. // Write error, most likely client disconnect.
debug(LOG_ERROR, "Failed to send message: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Failed to send message: %s", strSockError(getSockErr()));
debug(LOG_WARNING, "Host connection was broken?"); debug(LOG_WARNING, "Host connection was broken?");
SocketClose(tcp_socket); socketClose(tcp_socket);
tcp_socket = NULL; tcp_socket = NULL;
players[HOST_DPID].heartbeat = false; //mark them dead players[HOST_DPID].heartbeat = false; //mark them dead
//Game is pretty much over --should just end everything when HOST dies. //Game is pretty much over --should just end everything when HOST dies.
@ -2220,11 +2230,11 @@ receive_message:
&& connected_bsocket[j] != NULL && connected_bsocket[j] != NULL
&& connected_bsocket[j]->socket != NULL) && connected_bsocket[j]->socket != NULL)
{ {
if (write_all(connected_bsocket[j]->socket, pMsg, size) == SOCKET_ERROR) if (writeAll(connected_bsocket[j]->socket, pMsg, size) == SOCKET_ERROR)
{ {
// Write error, most likely client disconnect. // Write error, most likely client disconnect.
debug(LOG_ERROR, "Failed to send message: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Failed to send message: %s", strSockError(getSockErr()));
SocketClose(connected_bsocket[pMsg->destination]->socket); socketClose(connected_bsocket[pMsg->destination]->socket);
connected_bsocket[pMsg->destination]->socket = NULL; connected_bsocket[pMsg->destination]->socket = NULL;
} }
} }
@ -2240,11 +2250,11 @@ receive_message:
debug(LOG_NET, "Reflecting message type %hhu to %hhu", pMsg->type, pMsg->destination); debug(LOG_NET, "Reflecting message type %hhu to %hhu", pMsg->type, pMsg->destination);
pMsg->size = ntohs(pMsg->size); pMsg->size = ntohs(pMsg->size);
if (write_all(connected_bsocket[pMsg->destination]->socket, pMsg, size) == SOCKET_ERROR) if (writeAll(connected_bsocket[pMsg->destination]->socket, pMsg, size) == SOCKET_ERROR)
{ {
// Write error, most likely client disconnect. // Write error, most likely client disconnect.
debug(LOG_ERROR, "Failed to send message: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Failed to send message: %s", strSockError(getSockErr()));
SocketClose(connected_bsocket[pMsg->destination]->socket); socketClose(connected_bsocket[pMsg->destination]->socket);
connected_bsocket[pMsg->destination]->socket = NULL; connected_bsocket[pMsg->destination]->socket = NULL;
} }
} }
@ -2430,7 +2440,7 @@ static void NETregisterServer(int state)
struct addrinfo* const hosts = resolveHost(masterserver_name, masterserver_port); struct addrinfo* const hosts = resolveHost(masterserver_name, masterserver_port);
if (hosts == NULL) if (hosts == NULL)
{ {
debug(LOG_ERROR, "Cannot resolve masterserver \"%s\": %s", masterserver_name, strsockerror(getSockErr())); debug(LOG_ERROR, "Cannot resolve masterserver \"%s\": %s", masterserver_name, strSockError(getSockErr()));
ssprintf(NetPlay.MOTDbuffer, _("Could not resolve masterserver name (%s)!"), masterserver_name); ssprintf(NetPlay.MOTDbuffer, _("Could not resolve masterserver name (%s)!"), masterserver_name);
server_not_there = true; server_not_there = true;
return; return;
@ -2446,7 +2456,7 @@ static void NETregisterServer(int state)
if(rs_socket == NULL) if(rs_socket == NULL)
{ {
debug(LOG_ERROR, "Cannot connect to masterserver \"%s:%d\": %s", masterserver_name, masterserver_port, strsockerror(getSockErr())); debug(LOG_ERROR, "Cannot connect to masterserver \"%s:%d\": %s", masterserver_name, masterserver_port, strSockError(getSockErr()));
ssprintf(NetPlay.MOTDbuffer, _("Could not communicate with lobby server! Is TCP port %u open?"), masterserver_port); ssprintf(NetPlay.MOTDbuffer, _("Could not communicate with lobby server! Is TCP port %u open?"), masterserver_port);
server_not_there = true; server_not_there = true;
return; return;
@ -2457,7 +2467,7 @@ static void NETregisterServer(int state)
masterset = allocSocketSet(1); masterset = allocSocketSet(1);
if (!masterset) if (!masterset)
{ {
debug(LOG_ERROR, "Couldn't create socket set for master server because: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Couldn't create socket set for master server because: %s", strSockError(getSockErr()));
} }
if (addSocket(masterset, rs_socket)) if (addSocket(masterset, rs_socket))
{ {
@ -2465,17 +2475,17 @@ static void NETregisterServer(int state)
} }
} }
// get the MOTD from the server // get the MOTD from the server
write_all(rs_socket, "motd", sizeof("motd")); writeAll(rs_socket, "motd", sizeof("motd"));
if (checkSockets(masterset, 1000) == SOCKET_ERROR) if (checkSockets(masterset, 1000) == SOCKET_ERROR)
{ {
debug(LOG_NET, "Warning, MOTD CheckSockets Failed. Error %s", strsockerror(getSockErr())); debug(LOG_NET, "Warning, MOTD CheckSockets Failed. Error %s", strSockError(getSockErr()));
} }
if (rs_socket->ready) // true on activity if (rs_socket->ready) // true on activity
{ {
result = read_all(rs_socket, NetPlay.MOTDbuffer, sizeof(NetPlay.MOTDbuffer) - 1); result = readNoInt(rs_socket, NetPlay.MOTDbuffer, sizeof(NetPlay.MOTDbuffer) - 1);
if (result <= 0) if (result <= 0)
{ {
debug(LOG_NET, "Warning, MOTD TCP_Recv failed. result = %d, error %s", result, strsockerror(getSockErr())); debug(LOG_NET, "Warning, MOTD TCP_Recv failed. result = %d, error %s", result, strSockError(getSockErr()));
sstrcpy(NetPlay.MOTDbuffer, "MOTD communication error with lobby server, TCP_Recv failed!"); sstrcpy(NetPlay.MOTDbuffer, "MOTD communication error with lobby server, TCP_Recv failed!");
} }
// Make sure to NUL terminate the MOTD string // Make sure to NUL terminate the MOTD string
@ -2484,11 +2494,11 @@ static void NETregisterServer(int state)
} }
else else
{ {
debug(LOG_NET, "Warning, MOTD Socket Not ready. Is the motd.txt file empty? Error %s", strsockerror(getSockErr())); debug(LOG_NET, "Warning, MOTD Socket Not ready. Is the motd.txt file empty? Error %s", strSockError(getSockErr()));
sstrcpy(NetPlay.MOTDbuffer, "MOTD communication error with lobby server, socket not ready?"); sstrcpy(NetPlay.MOTDbuffer, "MOTD communication error with lobby server, socket not ready?");
} }
write_all(rs_socket, "addg", sizeof("addg")); writeAll(rs_socket, "addg", sizeof("addg"));
// and now send what the server wants // and now send what the server wants
NETsendGAMESTRUCT(rs_socket, &game); NETsendGAMESTRUCT(rs_socket, &game);
} }
@ -2499,7 +2509,7 @@ static void NETregisterServer(int state)
delSocket(masterset,rs_socket); delSocket(masterset,rs_socket);
free(masterset); free(masterset);
masterset = NULL; masterset = NULL;
SocketClose(rs_socket); socketClose(rs_socket);
rs_socket=NULL; rs_socket=NULL;
break; break;
} }
@ -2537,7 +2547,7 @@ static void NETallowJoining(void)
tmp_socket_set = allocSocketSet(MAX_TMP_SOCKETS+1); tmp_socket_set = allocSocketSet(MAX_TMP_SOCKETS+1);
if (tmp_socket_set == NULL) if (tmp_socket_set == NULL)
{ {
debug(LOG_ERROR, "Cannot create socket set: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Cannot create socket set: %s", strSockError(getSockErr()));
return; return;
} }
debug(LOG_NET, "Created tmp_socket_set %p", tmp_socket_set); debug(LOG_NET, "Created tmp_socket_set %p", tmp_socket_set);
@ -2559,20 +2569,20 @@ static void NETallowJoining(void)
break; break;
} }
} }
tmp_socket[i] = SocketAccept(tcp_socket); tmp_socket[i] = socketAccept(tcp_socket);
debug(LOG_NET, "tmp_socket[%d]=%p Accepted", i, tmp_socket[i]); debug(LOG_NET, "tmp_socket[%d]=%p Accepted", i, tmp_socket[i]);
addSocket(tmp_socket_set, tmp_socket[i]); addSocket(tmp_socket_set, tmp_socket[i]);
if (checkSockets(tmp_socket_set, 1000) > 0 if (checkSockets(tmp_socket_set, 1000) > 0
&& tmp_socket[i]->ready && tmp_socket[i]->ready
&& (recv_result = read_all(tmp_socket[i], buffer, 5))) && (recv_result = readNoInt(tmp_socket[i], buffer, 5)))
{ {
if(strcmp(buffer, "list")==0) if(strcmp(buffer, "list")==0)
{ {
debug(LOG_NET, "cmd: list. Sending game list"); debug(LOG_NET, "cmd: list. Sending game list");
if (write_all(tmp_socket[i], &numgames, sizeof(numgames)) == SOCKET_ERROR) if (writeAll(tmp_socket[i], &numgames, sizeof(numgames)) == SOCKET_ERROR)
{ {
// Write error, most likely client disconnect. // Write error, most likely client disconnect.
debug(LOG_ERROR, "Failed to send message: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Failed to send message: %s", strSockError(getSockErr()));
debug(LOG_WARNING, "Couldn't get list from server. Make sure required ports are open. (TCP 9998-9999)"); debug(LOG_WARNING, "Couldn't get list from server. Make sure required ports are open. (TCP 9998-9999)");
} }
else else
@ -2583,7 +2593,7 @@ static void NETallowJoining(void)
} }
delSocket(tmp_socket_set, tmp_socket[i]); delSocket(tmp_socket_set, tmp_socket[i]);
SocketClose(tmp_socket[i]); socketClose(tmp_socket[i]);
tmp_socket[i] = NULL; tmp_socket[i] = NULL;
} }
else if (strcmp(buffer, "join") == 0) else if (strcmp(buffer, "join") == 0)
@ -2594,14 +2604,14 @@ static void NETallowJoining(void)
else else
{ {
delSocket(tmp_socket_set, tmp_socket[i]); delSocket(tmp_socket_set, tmp_socket[i]);
SocketClose(tmp_socket[i]); socketClose(tmp_socket[i]);
tmp_socket[i] = NULL; tmp_socket[i] = NULL;
} }
} }
else else
{ {
delSocket(tmp_socket_set, tmp_socket[i]); delSocket(tmp_socket_set, tmp_socket[i]);
SocketClose(tmp_socket[i]); socketClose(tmp_socket[i]);
tmp_socket[i] = NULL; tmp_socket[i] = NULL;
} }
} }
@ -2610,7 +2620,7 @@ static void NETallowJoining(void)
if ( tmp_socket[i] != NULL if ( tmp_socket[i] != NULL
&& tmp_socket[i]->ready) && tmp_socket[i]->ready)
{ {
int size = read_all(tmp_socket[i], &NetMsg, sizeof(NetMsg)); int size = readNoInt(tmp_socket[i], &NetMsg, sizeof(NetMsg));
if (size <= 0) if (size <= 0)
{ {
@ -2621,11 +2631,11 @@ static void NETallowJoining(void)
} }
else else
{ {
debug(LOG_NET, "Client socket ecountered error: %s", strsockerror(getSockErr())); debug(LOG_NET, "Client socket ecountered error: %s", strSockError(getSockErr()));
} }
delSocket(tmp_socket_set, tmp_socket[i]); delSocket(tmp_socket_set, tmp_socket[i]);
SocketClose(tmp_socket[i]); socketClose(tmp_socket[i]);
tmp_socket[i] = NULL; tmp_socket[i] = NULL;
} }
else if (NetMsg.type == NET_JOIN) else if (NetMsg.type == NET_JOIN)
@ -2722,10 +2732,10 @@ BOOL NEThostGame(const char* SessionName, const char* PlayerName,
// tcp_socket is the connection to the lobby server (or machine) // tcp_socket is the connection to the lobby server (or machine)
if (!tcp_socket) if (!tcp_socket)
tcp_socket = SocketListen(gameserver_port); tcp_socket = socketListen(gameserver_port);
if(tcp_socket == NULL) if(tcp_socket == NULL)
{ {
debug(LOG_ERROR, "Cannot connect to master self: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Cannot connect to master self: %s", strSockError(getSockErr()));
return false; return false;
} }
debug(LOG_NET, "New tcp_socket = %p", tcp_socket); debug(LOG_NET, "New tcp_socket = %p", tcp_socket);
@ -2733,7 +2743,7 @@ BOOL NEThostGame(const char* SessionName, const char* PlayerName,
if(!socket_set) socket_set = allocSocketSet(MAX_CONNECTED_PLAYERS); if(!socket_set) socket_set = allocSocketSet(MAX_CONNECTED_PLAYERS);
if (socket_set == NULL) if (socket_set == NULL)
{ {
debug(LOG_ERROR, "Cannot create socket set: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Cannot create socket set: %s", strSockError(getSockErr()));
return false; return false;
} }
addSocket(socket_set, tcp_socket); addSocket(socket_set, tcp_socket);
@ -2834,7 +2844,7 @@ BOOL NETfindGame(void)
if (hosts == NULL) if (hosts == NULL)
{ {
debug(LOG_ERROR, "Error connecting to client via hostname provided (%s)",iptoconnect); debug(LOG_ERROR, "Error connecting to client via hostname provided (%s)",iptoconnect);
debug(LOG_ERROR, "Cannot resolve hostname :%s",strsockerror(getSockErr())); debug(LOG_ERROR, "Cannot resolve hostname :%s",strSockError(getSockErr()));
setLobbyError(ERROR_CONNECTION); setLobbyError(ERROR_CONNECTION);
return false; return false;
} }
@ -2847,7 +2857,7 @@ BOOL NETfindGame(void)
} }
else if ((hosts = resolveHost(hostname, port)) == NULL) else if ((hosts = resolveHost(hostname, port)) == NULL)
{ {
debug(LOG_ERROR, "Cannot resolve hostname \"%s\": %s", hostname, strsockerror(getSockErr())); debug(LOG_ERROR, "Cannot resolve hostname \"%s\": %s", hostname, strSockError(getSockErr()));
setLobbyError(ERROR_CONNECTION); setLobbyError(ERROR_CONNECTION);
return false; return false;
} }
@ -2856,7 +2866,7 @@ BOOL NETfindGame(void)
{ {
debug(LOG_NET, "Deleting tcp_socket %p", tcp_socket); debug(LOG_NET, "Deleting tcp_socket %p", tcp_socket);
delSocket(socket_set,tcp_socket); delSocket(socket_set,tcp_socket);
SocketClose(tcp_socket); socketClose(tcp_socket);
tcp_socket = NULL; tcp_socket = NULL;
} }
@ -2869,7 +2879,7 @@ BOOL NETfindGame(void)
if (tcp_socket == NULL) if (tcp_socket == NULL)
{ {
debug(LOG_ERROR, "Cannot connect to \"%s:%d\": %s", hostname, port, strsockerror(getSockErr())); debug(LOG_ERROR, "Cannot connect to \"%s:%d\": %s", hostname, port, strSockError(getSockErr()));
setLobbyError(ERROR_CONNECTION); setLobbyError(ERROR_CONNECTION);
freeaddrinfo(hosts); freeaddrinfo(hosts);
return false; return false;
@ -2879,7 +2889,7 @@ BOOL NETfindGame(void)
socket_set = allocSocketSet(1); socket_set = allocSocketSet(1);
if (socket_set == NULL) if (socket_set == NULL)
{ {
debug(LOG_ERROR, "Cannot create socket set: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Cannot create socket set: %s", strSockError(getSockErr()));
setLobbyError(ERROR_CONNECTION); setLobbyError(ERROR_CONNECTION);
freeaddrinfo(hosts); freeaddrinfo(hosts);
return false; return false;
@ -2889,11 +2899,11 @@ BOOL NETfindGame(void)
addSocket(socket_set, tcp_socket); addSocket(socket_set, tcp_socket);
debug(LOG_NET, "Sending list cmd"); debug(LOG_NET, "Sending list cmd");
write_all(tcp_socket, "list", sizeof("list")); writeAll(tcp_socket, "list", sizeof("list"));
if (checkSockets(socket_set, 1000) > 0 if (checkSockets(socket_set, 1000) > 0
&& tcp_socket->ready && tcp_socket->ready
&& (result = read_all(tcp_socket, &gamesavailable, sizeof(gamesavailable)))) && (result = readNoInt(tcp_socket, &gamesavailable, sizeof(gamesavailable))))
{ {
gamesavailable = ntohl(gamesavailable); gamesavailable = ntohl(gamesavailable);
} }
@ -2901,8 +2911,8 @@ BOOL NETfindGame(void)
{ {
if (result == SOCKET_ERROR) if (result == SOCKET_ERROR)
{ {
debug(LOG_NET, "Server socket ecountered error: %s", strsockerror(getSockErr())); debug(LOG_NET, "Server socket ecountered error: %s", strSockError(getSockErr()));
SocketClose(tcp_socket); socketClose(tcp_socket);
tcp_socket = NULL; tcp_socket = NULL;
} }
// when we fail to receive a game count, bail out // when we fail to receive a game count, bail out
@ -2966,13 +2976,13 @@ BOOL NETjoinGame(UDWORD gameNumber, const char* playername)
hosts = resolveHost(hostname, gameserver_port); hosts = resolveHost(hostname, gameserver_port);
if (hosts == NULL) if (hosts == NULL)
{ {
debug(LOG_ERROR, "Cannot resolve hostname \"%s\": %s", hostname, strsockerror(getSockErr())); debug(LOG_ERROR, "Cannot resolve hostname \"%s\": %s", hostname, strSockError(getSockErr()));
return false; return false;
} }
if (tcp_socket != NULL) if (tcp_socket != NULL)
{ {
SocketClose(tcp_socket); socketClose(tcp_socket);
} }
for (cur = hosts; cur; cur = cur->ai_next) for (cur = hosts; cur; cur = cur->ai_next)
@ -2984,7 +2994,7 @@ BOOL NETjoinGame(UDWORD gameNumber, const char* playername)
if (tcp_socket == NULL) if (tcp_socket == NULL)
{ {
debug(LOG_ERROR, "Cannot connect to \"%s:%d\": %s", hostname, gameserver_port, strsockerror(getSockErr())); debug(LOG_ERROR, "Cannot connect to \"%s:%d\": %s", hostname, gameserver_port, strSockError(getSockErr()));
freeaddrinfo(hosts); freeaddrinfo(hosts);
return false; return false;
} }
@ -2992,7 +3002,7 @@ BOOL NETjoinGame(UDWORD gameNumber, const char* playername)
socket_set = allocSocketSet(1); socket_set = allocSocketSet(1);
if (socket_set == NULL) if (socket_set == NULL)
{ {
debug(LOG_ERROR, "Cannot create socket set: %s", strsockerror(getSockErr())); debug(LOG_ERROR, "Cannot create socket set: %s", strSockError(getSockErr()));
freeaddrinfo(hosts); freeaddrinfo(hosts);
return false; return false;
} }
@ -3001,7 +3011,7 @@ BOOL NETjoinGame(UDWORD gameNumber, const char* playername)
// tcp_socket is used to talk to host machine // tcp_socket is used to talk to host machine
addSocket(socket_set, tcp_socket); addSocket(socket_set, tcp_socket);
write_all(tcp_socket, "join", sizeof("join")); writeAll(tcp_socket, "join", sizeof("join"));
if (NETrecvGAMESTRUCT(&NetPlay.games[gameNumber]) if (NETrecvGAMESTRUCT(&NetPlay.games[gameNumber])
&& NetPlay.games[gameNumber].desc.host[0] == '\0') && NetPlay.games[gameNumber].desc.host[0] == '\0')