diff --git a/qw/source/master.c b/qw/source/master.c index 5d00e46f5..edcf8d500 100644 --- a/qw/source/master.c +++ b/qw/source/master.c @@ -56,9 +56,9 @@ #define S2M_HEARTBEAT 'a' #define S2M_SHUTDOWN 'C' #endif -#ifndef MASTER_TIMEOUT -# define MASTER_TIMEOUT 300 -#endif + +#define MASTER_TIMEOUT 300 +#define SLIST_MULTIPLE 1 typedef struct { struct sockaddr_in addr; @@ -66,18 +66,22 @@ typedef struct { } server_t; int -QW_AddHeartbeat (server_t **servers_p, int slen, struct sockaddr_in *addr, char *buf) +QW_AddHeartbeat (server_t **servers_p, int slen, + struct sockaddr_in *addr, char *buf) { server_t *servers = *servers_p; int freeslot = -1; int i; int sequence, players; + char *c; sequence = atoi (buf + 2); - players = atoi (strchr (buf + 2, '\n') + 1); + c = strchr (buf + 2, '\n'); + players = c ? atoi (c + 1) : 0; for (i = 0; i < slen; i++) { - if (servers[i].addr.sin_addr.s_addr == addr->sin_addr.s_addr + if (servers[i].updated + && servers[i].addr.sin_addr.s_addr == addr->sin_addr.s_addr && servers[i].addr.sin_port == addr->sin_port) { time (&servers[i].updated); #if 1 @@ -93,16 +97,18 @@ QW_AddHeartbeat (server_t **servers_p, int slen, struct sockaddr_in *addr, char } if (freeslot == -1) { server_t *newservers; - newservers = realloc (servers, sizeof (server_t) * (slen + 50)); + newservers = realloc (servers, sizeof (server_t) + * (slen + SLIST_MULTIPLE)); if (!newservers) { + printf ("realloc failed\n"); return slen; // boo. } - for (i = slen; i < slen + 50; i++) { + + for (i = slen; i < slen + SLIST_MULTIPLE; i++) newservers[i].updated = 0; - } - memcpy (newservers, servers, slen * sizeof (server_t)); + freeslot = slen; - slen += 50; + slen += SLIST_MULTIPLE; *servers_p = newservers; } servers[freeslot].addr = *addr; @@ -136,7 +142,9 @@ QW_TimeoutHearts (server_t *servers, int slen) } void -QW_HeartShutdown (struct sockaddr_in *addr,server_t *servers, int slen) { +QW_HeartShutdown (struct sockaddr_in *addr, server_t *servers, + int slen) +{ int i; for (i = 0; i < slen; i++) { if (servers[i].addr.sin_addr.s_addr == addr->sin_addr.s_addr @@ -153,8 +161,8 @@ QW_HeartShutdown (struct sockaddr_in *addr,server_t *servers, int slen) { } void -QW_SendHearts (int sock, struct sockaddr_in *addr, - server_t *servers, int serverlen) +QW_SendHearts (int sock, struct sockaddr_in *addr, server_t *servers, + int serverlen) { unsigned char *out; int count, cpos; @@ -162,11 +170,15 @@ QW_SendHearts (int sock, struct sockaddr_in *addr, count = 0; - for (i = 0; i < serverlen; i++) { + for (i = 0; i < serverlen; i++) if (servers[i].updated != 0) count++; - } + out = malloc ((count + 1) * 6); + if (!out) { + printf ("malloc failed\n"); + return; + } cpos = 1; out[0] = out[1] = out[2] = out[3] = 0xff; out[4] = 0x64; @@ -175,17 +187,17 @@ QW_SendHearts (int sock, struct sockaddr_in *addr, for (i = 0; i < serverlen; i++) { if (servers[i].updated != 0) { unsigned char *p = out + (cpos * 6); - p[0] = ((unsigned char*) &servers[i].addr.sin_addr.s_addr)[0]; - p[1] = ((unsigned char*) &servers[i].addr.sin_addr.s_addr)[1]; - p[2] = ((unsigned char*) &servers[i].addr.sin_addr.s_addr)[2]; - p[3] = ((unsigned char*) &servers[i].addr.sin_addr.s_addr)[3]; + p[0] = ((unsigned char *) &servers[i].addr.sin_addr.s_addr)[0]; + p[1] = ((unsigned char *) &servers[i].addr.sin_addr.s_addr)[1]; + p[2] = ((unsigned char *) &servers[i].addr.sin_addr.s_addr)[2]; + p[3] = ((unsigned char *) &servers[i].addr.sin_addr.s_addr)[3]; p[4] = (unsigned char) (ntohs(servers[i].addr.sin_port) >> 8); p[5] = (unsigned char) (ntohs(servers[i].addr.sin_port) & 0xFF); ++cpos; } } - sendto (sock, out, (count + 1) * 6, 0, - (struct sockaddr*) addr, sizeof (struct sockaddr_in)); + sendto (sock, out, (count + 1) * 6, 0, (struct sockaddr *) addr, + sizeof (struct sockaddr_in)); free (out); } @@ -193,9 +205,9 @@ void QW_Pong (int sock, struct sockaddr_in *addr) { char data[6] = {0xFF, 0xFF, 0xFF, 0xFF, A2A_ACK, 0}; - printf ("ping\n"); + printf ("Ping\n"); sendto (sock, data, sizeof (data), 0, - (struct sockaddr*) addr, sizeof (struct sockaddr_in)); + (struct sockaddr *) addr, sizeof (struct sockaddr_in)); } @@ -203,23 +215,29 @@ void QW_Master (struct sockaddr_in *addr) { int sock; - server_t *servers = malloc (sizeof (server_t) * 50); - int serverlen = 50; + server_t *servers; + int serverlen = SLIST_MULTIPLE; int i; - if (servers == NULL) + servers = malloc (sizeof (server_t) * serverlen); + if (!servers) { + printf ("initial malloc failed\n"); return; - - for (i = 0; i < 50; i++) { - servers[i].updated = 0; } - sock = socket (AF_INET,SOCK_DGRAM, 0); - if (sock < 0) - return; + for (i = 0; i < serverlen; i++) + servers[i].updated = 0; - if (bind (sock, (struct sockaddr*)addr, sizeof (struct sockaddr_in))) + sock = socket (AF_INET, SOCK_DGRAM, 0); + if (sock < 0) { + printf ("socket failed\n"); return; + } + + if (bind (sock, (struct sockaddr *) addr, sizeof (struct sockaddr_in))) { + printf ("bind failed\n"); + return; + } listen (sock, 4); // probably don't need this. @@ -228,9 +246,10 @@ QW_Master (struct sockaddr_in *addr) struct sockaddr_in recvaddr; int recvsize = sizeof (struct sockaddr_in); int size; + buf[30] = '\0'; // a sentinal for string ops size = recvfrom (sock, buf, sizeof (buf) - 1, 0, - (struct sockaddr*) &recvaddr, &recvsize); + (struct sockaddr *) &recvaddr, &recvsize); if (size == -1) { printf ("recvfrom failed\n"); continue; @@ -247,12 +266,12 @@ QW_Master (struct sockaddr_in *addr) for (j = 0; j < size; j++) if (isprint (buf[j])) printf ("%c", buf[j]); - else { + else switch (buf[j]) { case '\n': printf ("\\n"); break; case '\0': printf ("\\0"); break; default: printf ("(%02x)", buf[j]); - } + } } printf ("'\n"); #endif @@ -263,7 +282,8 @@ QW_Master (struct sockaddr_in *addr) QW_SendHearts (sock, &recvaddr, servers, serverlen); break; case S2M_HEARTBEAT: - serverlen = QW_AddHeartbeat (&servers, serverlen, &recvaddr, buf); + serverlen = QW_AddHeartbeat (&servers, serverlen, + &recvaddr, buf); break; case S2M_SHUTDOWN: QW_HeartShutdown (&recvaddr, servers, serverlen);