/* * CL_ReadServerCache */ void CL_ReadServerCache( void ) { int filelen, filehandle; qbyte *buf = NULL; char *ptr, *token; netadr_t adr; char adrString[64]; qboolean favorite = qfalse; filelen = FS_FOpenFile( SERVERSFILE, &filehandle, FS_READ ); if( !filehandle || filelen < 1 ) { FS_FCloseFile( filehandle ); } else { buf = Mem_TempMalloc( filelen + 1 ); filelen = FS_Read( buf, filelen, filehandle ); FS_FCloseFile( filehandle ); } if( !buf ) return; ptr = ( char * )buf; while( ptr ) { token = COM_ParseExt( &ptr, qtrue ); if( !token[0] ) break; if( !Q_stricmp( token, "master" ) ) { favorite = qfalse; continue; } if( !Q_stricmp( token, "favorites" ) ) { favorite = qtrue; continue; } if( NET_StringToAddress( token, &adr ) ) { Q_strncpyz( adrString, token, sizeof( adrString ) ); token = COM_ParseExt( &ptr, qfalse ); if( !token[0] ) continue; if( favorite ) CL_AddServerToList( &favoritesList, adrString, (unsigned int)atoi( token ) ); else CL_AddServerToList( &masterList, adrString, (unsigned int)atoi( token ) ); } } Mem_TempFree( buf ); }
/** * @sa SV_DiscoveryCallback */ static void CL_ServerListDiscoveryCallback (struct datagram_socket *s, const char *buf, int len, struct sockaddr *from) { const char match[] = "discovered"; if (len == sizeof(match) && memcmp(buf, match, len) == 0) { char node[MAX_VAR]; char service[MAX_VAR]; cgi->NET_SockaddrToStrings(s, from, node, sizeof(node), service, sizeof(service)); CL_AddServerToList(node, service); } }
static void CL_QueryMasterServerThread (const char *responseBuf) { const char *serverListBuf; const char *token; char node[MAX_VAR], service[MAX_VAR]; int i, num; if (!responseBuf) { cgi->Com_Printf("Could not query masterserver\n"); return; } serverListBuf = responseBuf; Com_DPrintf(DEBUG_CLIENT, "masterserver response: %s\n", serverListBuf); token = Com_Parse(&serverListBuf); num = atoi(token); if (num >= MAX_SERVERLIST) { cgi->Com_DPrintf(DEBUG_CLIENT, "Too many servers: %i\n", num); num = MAX_SERVERLIST; } for (i = 0; i < num; i++) { /* host */ token = Com_Parse(&serverListBuf); if (!*token || !serverListBuf) { cgi->Com_Printf("Could not finish the masterserver response parsing\n"); break; } Q_strncpyz(node, token, sizeof(node)); /* port */ token = Com_Parse(&serverListBuf); if (!*token || !serverListBuf) { cgi->Com_Printf("Could not finish the masterserver response parsing\n"); break; } Q_strncpyz(service, token, sizeof(service)); CL_AddServerToList(node, service); } }
/* * CL_ParseGetServersResponseMessage * Handle a reply from getservers message to master server */ static void CL_ParseGetServersResponseMessage( msg_t *msg, qboolean extended ) { const char *header; char adrString[64]; qbyte addr[16]; unsigned short port; netadr_t adr; MSG_BeginReading( msg ); MSG_ReadLong( msg ); // skip the -1 //jump over the command name header = ( extended ? "getserversExtResponse" : "getserversResponse" ); if( !MSG_SkipData( msg, strlen( header ) ) ) { Com_Printf( "Invalid master packet ( missing %s )\n", header ); return; } while( msg->readcount + 7 <= msg->cursize ) { char prefix = MSG_ReadChar( msg ); switch( prefix ) { case '\\': MSG_ReadData( msg, addr, 4 ); port = ShortSwap( MSG_ReadShort( msg ) ); // both endians need this swapped. Q_snprintfz( adrString, sizeof( adrString ), "%u.%u.%u.%u:%u", addr[0], addr[1], addr[2], addr[3], port ); break; case '/': if( extended ) { MSG_ReadData( msg, addr, 16 ); port = ShortSwap( MSG_ReadShort( msg ) ); // both endians need this swapped. Q_snprintfz( adrString, sizeof( adrString ), "[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]:%hu", addr[ 0], addr[ 1], addr[ 2], addr[ 3], addr[ 4], addr[ 5], addr[ 6], addr[ 7], addr[ 8], addr[ 9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15], port ); } else { Com_Printf( "Invalid master packet ( IPv6 prefix in a non-extended response )\n" ); return; } break; default: Com_Printf( "Invalid master packet ( missing separator )\n" ); return; } if( port == 0 ) // last server seen return; Com_DPrintf( "%s\n", adrString ); if( !NET_StringToAddress( adrString, &adr ) ) { Com_Printf( "Bad address: %s\n", adrString ); continue; } CL_AddServerToList( &masterList, adrString, 0 ); } }