summaryrefslogtreecommitdiff
path: root/src/net_query.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/net_query.c')
-rw-r--r--src/net_query.c112
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;
}