diff options
Diffstat (limited to 'src/net_query.c')
-rw-r--r-- | src/net_query.c | 112 |
1 files changed, 70 insertions, 42 deletions
diff --git a/src/net_query.c b/src/net_query.c index 07d947b5..9a6b223b 100644 --- a/src/net_query.c +++ b/src/net_query.c @@ -35,32 +35,47 @@ #include "net_io.h" #include "net_packet.h" #include "net_query.h" +#include "net_structrw.h" #include "net_sdl.h" +typedef struct +{ + net_addr_t *addr; + net_querydata_t data; +} queryresponse_t; + static net_context_t *query_context; -static net_addr_t **responders; +static queryresponse_t *responders; static int num_responses; // Add a new address to the list of hosts that has responded -static void NET_Query_AddResponder(net_addr_t *addr) +static queryresponse_t *AddResponder(net_addr_t *addr, + net_querydata_t *data) { + queryresponse_t *response; + responders = realloc(responders, - sizeof(net_addr_t *) * (num_responses + 1)); - responders[num_responses] = addr; + sizeof(queryresponse_t) * (num_responses + 1)); + + response = &responders[num_responses]; + response->addr = addr; + response->data = *data; ++num_responses; + + return response; } // Returns true if the reply is from a host that has not previously // responded. -static boolean NET_Query_CheckResponder(net_addr_t *addr) +static boolean CheckResponder(net_addr_t *addr) { int i; for (i=0; i<num_responses; ++i) { - if (responders[i] == addr) + if (responders[i].addr == addr) { return false; } @@ -128,64 +143,77 @@ static char *GameDescription(GameMode_t mode, GameMission_t mission) } } -static void NET_Query_ParsePacket(net_addr_t *addr, net_packet_t *packet) +static void PrintHeader(void) { - unsigned int packet_type; - char *server_version; - unsigned int in_game; - unsigned int num_players, max_players; - unsigned int servermode, servermission; - char *server_description; int i; - // Have we already received a packet from this host? + formatted_printf(18, "Address"); + formatted_printf(8, "Players"); + puts("Description"); - if (!NET_Query_CheckResponder(addr)) + for (i=0; i<70; ++i) + putchar('='); + putchar('\n'); +} + +static void PrintResponse(queryresponse_t *response) +{ + formatted_printf(18, "%s: ", NET_AddrToString(response->addr)); + formatted_printf(8, "%i/%i", response->data.num_players, + response->data.max_players); + + if (response->data.gamemode != indetermined) { - return; + printf("(%s) ", GameDescription(response->data.gamemode, + response->data.gamemission)); } - if (!NET_ReadInt16(packet, &packet_type) - || !(server_version = NET_ReadString(packet)) - || !NET_ReadInt8(packet, &in_game) - || !NET_ReadInt8(packet, &num_players) - || !NET_ReadInt8(packet, &max_players) - || !NET_ReadInt8(packet, &servermode) - || !NET_ReadInt8(packet, &servermission) - || !(server_description = NET_ReadString(packet))) + if (response->data.server_state) { - return; + printf("(game running) "); } - if (num_responses <= 0) + NET_SafePuts(response->data.description); +} + +static void NET_Query_ParsePacket(net_addr_t *addr, net_packet_t *packet) +{ + unsigned int packet_type; + net_querydata_t querydata; + queryresponse_t *response; + + // Have we already received a packet from this host? + + if (!CheckResponder(addr)) { - // If this is the first response, print the table header + return; + } - formatted_printf(18, "Address"); - formatted_printf(8, "Players"); - puts("Description"); + // Read the header - for (i=0; i<70; ++i) - putchar('='); - putchar('\n'); + if (!NET_ReadInt16(packet, &packet_type) + || packet_type != NET_PACKET_TYPE_QUERY_RESPONSE) + { + return; } - formatted_printf(18, "%s: ", NET_AddrToString(addr)); - formatted_printf(8, "%i/%i", num_players, max_players); + // Read query data - if (servermode != indetermined) + if (!NET_ReadQueryData(packet, &querydata)) { - printf("(%s) ", GameDescription(servermode, servermission)); + return; } - if (in_game) + if (num_responses <= 0) { - printf("(game running) "); + // If this is the first response, print the table header + + PrintHeader(); } - NET_SafePuts(server_description); + response = AddResponder(addr, &querydata); - NET_Query_AddResponder(addr); + PrintResponse(response); } static void NET_Query_GetResponse(void) @@ -234,7 +262,7 @@ static net_addr_t *NET_Query_QueryLoop(net_addr_t *addr, } if (num_responses > 0) - return responders[0]; + return responders[0].addr; else return NULL; } |