static void
metasort( void )
/* Sort the server list in a manner similiar to how the metaserver
sorts the servers. Useful for when the order of servers in the
UDP metacache does not reflect the current player counts. Or when
a request for updated server stats make one server more populated
than it was before */
{
struct servers *sp;
char tempaddress[LINE];
int tempport, tempage;
time_t tempwhen;
int temprefresh, templifetime, tempplayers, tempstatus;
char temptypeflag;
char tempcomment[LINE];
#ifdef METAPING
u_long tempip_addr;
DWORD temppkt_rtt[RTT_AVG_BUFLEN];
#endif
int i, j, change;
/* Tracks if we performed a sorting action */
change = 0;
/* Only need to sort to the 2nd to last server, since we compare that
server to the one above it on the list. */
for (i = 0; i < (num_servers - 1); i++)
{
sp = serverlist;
/* Sorting order is: status, then player_count/queue_size */
/* If status is equal, the server with more players should be higher */
if (serverlist[i].status == serverlist[i+1].status)
{
if (serverlist[i].players > serverlist[i+1].players)
change = 1;
}
else
{
/* If the server above it has a wait queue, don't swap. */
if (serverlist[i+1].status != statusWait)
{
/* Server has wait queue? Swap up (since we know the one above
doesn't have a queue */
if (serverlist[i].status == statusWait)
change = 1;
/* Server has lower status? Swap up */
else if (serverlist[i].status < serverlist[i+1].status)
change = 1;
}
}
if (change)
{
/* Copy bottom entry (i) into temp space */
strcpy (tempaddress, serverlist[i].address);
tempport = serverlist[i].port;
tempage = serverlist[i].age;
tempwhen = serverlist[i].when;
temprefresh = serverlist[i].refresh;
templifetime = serverlist[i].lifetime;
tempplayers = serverlist[i].players;
tempstatus = serverlist[i].status;
temptypeflag = serverlist[i].typeflag;
strcpy (tempcomment, serverlist[i].comment);
#ifdef METAPING
tempip_addr = serverlist[i].ip_addr;
for (j = 0; j < RTT_AVG_BUFLEN; j++)
temppkt_rtt[j] = serverlist[i].pkt_rtt[j];
#endif
/* Move top entry (i+1) into bottom entry (i) */
strcpy (serverlist[i].address, serverlist[i+1].address);
serverlist[i].port = serverlist[i+1].port;
serverlist[i].age = serverlist[i+1].age;
serverlist[i].when = serverlist[i+1].when;
serverlist[i].refresh = serverlist[i+1].refresh;
serverlist[i].lifetime = serverlist[i+1].lifetime;
serverlist[i].players = serverlist[i+1].players;
serverlist[i].status = serverlist[i+1].status;
serverlist[i].typeflag = serverlist[i+1].typeflag;
strcpy (serverlist[i].comment, serverlist[i+1].comment);
#ifdef METAPING
serverlist[i].ip_addr = serverlist[i+1].ip_addr;
for (j = 0; j < RTT_AVG_BUFLEN; j++)
serverlist[i].pkt_rtt[j] = serverlist[i+1].pkt_rtt[j];
#endif
/* Copy temp entry into top entry (i+1) */
strcpy (serverlist[i+1].address, tempaddress);
serverlist[i+1].port = tempport;
serverlist[i+1].age = tempage;
serverlist[i+1].when = tempwhen;
serverlist[i+1].refresh = temprefresh;
serverlist[i+1].lifetime = templifetime;
serverlist[i+1].players = tempplayers;
serverlist[i+1].status = tempstatus;
serverlist[i+1].typeflag = temptypeflag;
strcpy (serverlist[i+1].comment, tempcomment);
#ifdef METAPING
serverlist[i+1].ip_addr = tempip_addr;
for (j = 0; j < RTT_AVG_BUFLEN; j++)
serverlist[i+1].pkt_rtt[j] = temppkt_rtt[j];
#endif
/* Start back at beginning - could be more efficient */
i = 0;
change = 0;
}
}
}