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; } } }