diff -ruN -Xfreeciv-lan/diff_ignore freeciv-cvs-Nov-23/client/clinet.c freeciv-lan/client/clinet.c --- freeciv-cvs-Nov-23/client/clinet.c 2003-11-22 22:07:46.000000000 -0800 +++ freeciv-lan/client/clinet.c 2003-11-25 19:25:46.000000000 -0800 @@ -24,6 +24,9 @@ #ifdef HAVE_ARPA_INET_H #include #endif +#ifdef HAVE_NETDB_H +#include +#endif #ifdef HAVE_NETINET_IN_H #include #endif @@ -777,6 +780,14 @@ to the request-packet sent from the client. **************************************************************************/ struct server_list *get_lan_server_list(void) { + +# if defined(__VMS) && !defined(_DECC_V4_SOURCE) + size_t fromlen; +# else + int fromlen; +# endif + struct sockaddr_in fromend; + struct hostent *from; char msgbuf[128]; int type; struct data_in din; @@ -786,11 +797,30 @@ char status[256]; char players[256]; char metastring[1024]; + fd_set readfs, exceptfs; + struct timeval tv; + + FD_ZERO(&readfs); + FD_ZERO(&exceptfs); + FD_SET(socklan, &exceptfs); + FD_SET(socklan, &readfs); + tv.tv_sec = 0; + tv.tv_usec = 0; + + if (select(socklan + 1, &readfs, NULL, &exceptfs, &tv) == -1) { + freelog(LOG_ERROR, "select failed: %s", mystrerror(errno)); + } + + if (!FD_ISSET(socklan, &readfs)) { + return FALSE; + } dio_input_init(&din, msgbuf, sizeof(msgbuf)); + fromlen = sizeof(fromend); /* Try to receive a packet from a server. */ - if (0 < recvfrom(socklan, msgbuf, sizeof(msgbuf), 0, NULL, NULL)) { + if (0 < recvfrom(socklan, msgbuf, sizeof(msgbuf), 0, + (struct sockaddr *) &fromend, &fromlen)) { struct server *pserver = (struct server*)fc_malloc(sizeof(struct server)); @@ -805,6 +835,12 @@ dio_get_string(&din, players, sizeof(players)); dio_get_string(&din, metastring, sizeof(metastring)); + if (!mystrcasecmp("none", servername)) { + from = gethostbyaddr((char *)&fromend.sin_addr, + sizeof(fromend.sin_addr), AF_INET); + sz_strlcpy(servername, inet_ntoa(fromend.sin_addr)); + } + /* UDP can send duplicate or delayed packets. */ server_list_iterate(*lan_servers, aserver) { if (!mystrcasecmp(aserver->name, servername) diff -ruN -Xfreeciv-lan/diff_ignore freeciv-cvs-Nov-23/server/sernet.c freeciv-lan/server/sernet.c --- freeciv-cvs-Nov-23/server/sernet.c 2003-11-22 22:08:00.000000000 -0800 +++ freeciv-lan/server/sernet.c 2003-11-25 19:23:57.000000000 -0800 @@ -978,17 +978,32 @@ char msgbuf[128]; struct data_in din; int type; + fd_set readfs, exceptfs; + struct timeval tv; - if (0 < recvfrom(socklan, msgbuf, sizeof(msgbuf), 0, NULL, NULL)) { - dio_input_init(&din, msgbuf, 1); - dio_get_uint8(&din, &type); - if (type == SERVER_LAN_VERSION) { - freelog(LOG_DEBUG, - "Received request for server LAN announcement."); - send_lanserver_response(); - } else { - freelog(LOG_DEBUG, - "Received invalid request for server LAN announcement."); + FD_ZERO(&readfs); + FD_ZERO(&exceptfs); + FD_SET(socklan, &exceptfs); + FD_SET(socklan, &readfs); + + tv.tv_sec = 0; + tv.tv_usec = 0; + + if (select(socklan + 1, &readfs, NULL, &exceptfs, &tv) == -1) { + freelog(LOG_ERROR, "select failed: %s", mystrerror(errno)); + } + + if (FD_ISSET(socklan, &readfs)) { + if (0 < recvfrom(socklan, msgbuf, sizeof(msgbuf), 0, NULL, NULL)) { + dio_input_init(&din, msgbuf, 1); + dio_get_uint8(&din, &type); + if (type == SERVER_LAN_VERSION) { + freelog(LOG_DEBUG, "Received request for server LAN announcement."); + send_lanserver_response(); + } else { + freelog(LOG_DEBUG, + "Received invalid request for server LAN announcement."); + } } } } @@ -1039,12 +1054,11 @@ return; } + /* Create a description of server state to send to clients. */ if (my_gethostname(hostname, sizeof(hostname)) != 0) { - freelog(LOG_ERROR, "gethostname failed: %s", mystrerror(errno)); - return; + sz_strlcpy(hostname, "none"); } - /* Create a description of server state to send to clients. */ my_snprintf(version, sizeof(version), "%d.%d.%d%s", MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION, VERSION_LABEL);