/* ==================== LAN_GetLocalServerAddressString ==================== */ static void LAN_GetServerAddressString( int source, int n, char *buf, int buflen ) { switch (source) { case AS_LOCAL : if (n >= 0 && n < MAX_OTHER_SERVERS) { Q_strncpyz(buf, NET_AdrToStringwPort( cls.localServers[n].adr) , buflen ); return; } break; case AS_MPLAYER: if (n >= 0 && n < MAX_OTHER_SERVERS) { Q_strncpyz(buf, NET_AdrToStringwPort( cls.mplayerServers[n].adr) , buflen ); return; } break; case AS_GLOBAL : if (n >= 0 && n < MAX_GLOBAL_SERVERS) { Q_strncpyz(buf, NET_AdrToStringwPort( cls.globalServers[n].adr) , buflen ); return; } break; case AS_FAVORITES : if (n >= 0 && n < MAX_OTHER_SERVERS) { Q_strncpyz(buf, NET_AdrToStringwPort( cls.favoriteServers[n].adr) , buflen ); return; } break; } buf[0] = '\0'; }
void SV_ResolveowHubHost( void ) { char *host = sv_owHubHost->string; netadr_t *address = &svs.owHubAddress; int result = -1; if ( host && host[ 0 ] ) { Com_Printf( "Resolving |ET:XReaL| Hub %s.\n", host ); result = NET_StringToAdr( host, address, NA_UNSPEC ); switch ( result ) { case 0: Com_Printf( "Completely failed to resolve %s.\n", host ); break; case 1: Com_Printf( "Resolved %s to %s.\n", host, NET_AdrToStringwPort( *address ) ); break; case 2: Com_Printf( "Failed to resolve a port for %s.\n", host ); address->type = NA_BAD; break; default: Com_Printf( "Unknown error %d from NET_StringToAdr()!\n", result ); break; } } // We had to add this to avoid a double-call to SV_ResolveAlphaHubHost(), not sure why yet... sv_owHubHost->modified = qfalse; }
/* ================= SV_MasterGameStat ================= */ void SV_MasterGameStat( const char *data ) { netadr_t adr; if ( !isLanOnly.Get() ) { return; // only dedicated servers send stats } Com_Printf( "Resolving %s\n", MASTER_SERVER_NAME ); switch ( NET_StringToAdr( MASTER_SERVER_NAME, &adr, NA_UNSPEC ) ) { case 0: Com_Printf( "Couldn't resolve master address: %s\n", MASTER_SERVER_NAME ); return; case 2: adr.port = BigShort( PORT_MASTER ); default: break; } Com_Printf( "%s resolved to %s\n", MASTER_SERVER_NAME, NET_AdrToStringwPort( adr ) ); Com_Printf( "Sending gamestat to %s\n", MASTER_SERVER_NAME ); NET_OutOfBandPrint( NS_SERVER, adr, "gamestat %s", data ); }
/* ==================== LAN_GetServerInfo ==================== */ static void LAN_GetServerInfo(int source, int n, char *buf, int buflen) { char info[MAX_STRING_CHARS]; serverInfo_t *server = NULL; info[0] = '\0'; switch (source) { case AS_LOCAL: if (n >= 0 && n < MAX_OTHER_SERVERS) { server = &cls.localServers[n]; } break; case AS_MPLAYER: case AS_GLOBAL: if (n >= 0 && n < MAX_GLOBAL_SERVERS) { server = &cls.globalServers[n]; } break; case AS_FAVORITES: if (n >= 0 && n < MAX_OTHER_SERVERS) { server = &cls.favoriteServers[n]; } break; } if (server && buf) { buf[0] = '\0'; Info_SetValueForKey(info, "hostname", server->hostName); Info_SetValueForKey(info, "mapname", server->mapName); Info_SetValueForKey(info, "clients", va("%i", server->clients)); Info_SetValueForKey(info, "sv_maxclients", va("%i", server->maxClients)); Info_SetValueForKey(info, "ping", va("%i", server->ping)); Info_SetValueForKey(info, "minping", va("%i", server->minPing)); Info_SetValueForKey(info, "maxping", va("%i", server->maxPing)); Info_SetValueForKey(info, "game", server->game); Info_SetValueForKey(info, "gametype", va("%i", server->gameType)); Info_SetValueForKey(info, "nettype", va("%i", server->netType)); Info_SetValueForKey(info, "addr", NET_AdrToStringwPort(server->adr)); Info_SetValueForKey(info, "punkbuster", va("%i", server->punkbuster)); Info_SetValueForKey(info, "g_needpass", va("%i", server->g_needpass)); Info_SetValueForKey(info, "g_humanplayers", va("%i", server->g_humanplayers)); Q_strncpyz(buf, info, buflen); } else { if (buf) { buf[0] = '\0'; } } }
void SV_MasterHeartbeat( void ) { static netadr_t adr[MAX_MASTER_SERVERS]; int i; // "dedicated 1" is for lan play, "dedicated 2" is for inet public play if ( !com_dedicated || com_dedicated->integer != 2 ) { return; // only dedicated servers send heartbeats } // if not time yet, don't send anything if ( svs.time < svs.nextHeartbeatTime ) { return; } svs.nextHeartbeatTime = svs.time + HEARTBEAT_MSEC; // send to group masters for ( i = 0 ; i < MAX_MASTER_SERVERS ; i++ ) { if ( !sv_master[i]->string[0] ) { continue; } // see if we haven't already resolved the name // resolving usually causes hitches on win95, so only // do it when needed if ( sv_master[i]->modified ) { sv_master[i]->modified = qfalse; Com_Printf( "Resolving %s\n", sv_master[i]->string ); if ( !NET_StringToAdr( sv_master[i]->string, &adr[i], NA_UNSPEC ) ) { Com_Printf( "Couldn't resolve address: %s\n", sv_master[i]->string ); continue; } if ( !strchr( sv_master[i]->string, ':' ) ) { adr[i].port = BigShort( PORT_MASTER ); } Com_Printf( "%s resolved to %s\n", sv_master[i]->string, NET_AdrToStringwPort(adr[i])); } Com_Printf ("Sending heartbeat to %s\n", sv_master[i]->string ); // this command should be changed if the server info / status format // ever incompatably changes NET_OutOfBandPrint( NS_SERVER, adr[i], "heartbeat %s\n", HEARTBEAT_GAME ); } }
/* ==================== LAN_GetServerInfo ==================== */ static void LAN_GetServerInfo(int source, int n, char *buf, int buflen) { char info[MAX_STRING_CHARS]; serverInfo_t *server = NULL; info[0] = '\0'; switch (source) { case AS_LOCAL: if(n >= 0 && n < MAX_OTHER_SERVERS) { server = &cls.localServers[n]; } break; case AS_GLOBAL: if(n >= 0 && n < MAX_GLOBAL_SERVERS) { server = &cls.globalServers[n]; } break; case AS_FAVORITES: if(n >= 0 && n < MAX_OTHER_SERVERS) { server = &cls.favoriteServers[n]; } break; } if(server && buf) { buf[0] = '\0'; Info_SetValueForKey(info, "hostname", server->hostName); Info_SetValueForKey(info, "serverload", va("%i", server->load)); Info_SetValueForKey(info, "mapname", server->mapName); Info_SetValueForKey(info, "clients", va("%i", server->clients)); Info_SetValueForKey(info, "sv_maxclients", va("%i", server->maxClients)); Info_SetValueForKey(info, "ping", va("%i", server->ping)); Info_SetValueForKey(info, "minping", va("%i", server->minPing)); Info_SetValueForKey(info, "maxping", va("%i", server->maxPing)); Info_SetValueForKey(info, "game", server->game); Info_SetValueForKey(info, "gametype", va("%i", server->gameType)); Info_SetValueForKey(info, "nettype", va("%i", server->netType)); Info_SetValueForKey(info, "addr", NET_AdrToStringwPort(server->adr)); Info_SetValueForKey(info, "sv_allowAnonymous", va("%i", server->allowAnonymous)); Info_SetValueForKey(info, "friendlyFire", va("%i", server->friendlyFire)); // NERVE - SMF Info_SetValueForKey(info, "maxlives", va("%i", server->maxlives)); // NERVE - SMF Info_SetValueForKey(info, "needpass", va("%i", server->needpass)); // NERVE - SMF Info_SetValueForKey(info, "punkbuster", va("%i", server->punkbuster)); // DHM - Nerve Info_SetValueForKey(info, "gamename", server->gameName); // Arnout Info_SetValueForKey(info, "g_antilag", va("%i", server->antilag)); // TTimo Info_SetValueForKey(info, "weaprestrict", va("%i", server->weaprestrict)); Info_SetValueForKey(info, "balancedteams", va("%i", server->balancedteams)); Q_strncpyz(buf, info, buflen); } else { if(buf) { buf[0] = '\0'; } } }
void SV_MasterHeartbeat(const char *message) { static netadr_t adr[MAX_MASTER_SERVERS][2]; // [2] for v4 and v6 address for the same address string. int i; int res; int netenabled; netenabled = Cvar_VariableIntegerValue("net_enabled"); // "dedicated 1" is for lan play, "dedicated 2" is for inet public play if (!com_dedicated || com_dedicated->integer != 2 || !(netenabled & (NET_ENABLEV4 | NET_ENABLEV6))) return; // only dedicated servers send heartbeats // if not time yet, don't send anything if ( svs.time < svs.nextHeartbeatTime ) return; svs.nextHeartbeatTime = svs.time + HEARTBEAT_MSEC; VM_Call( gvm, GAME_AUTHSERVER_HEARTBEAT ); // send to group masters for (i = 0; i < MAX_MASTER_SERVERS; i++) { if(!sv_master[i]->string[0]) continue; // see if we haven't already resolved the name // resolving usually causes hitches on win95, so only // do it when needed if(sv_master[i]->modified || (adr[i][0].type == NA_BAD && adr[i][1].type == NA_BAD)) { sv_master[i]->modified = qfalse; if(netenabled & NET_ENABLEV4) { Com_Printf("Resolving %s (IPv4)\n", sv_master[i]->string); res = NET_StringToAdr(sv_master[i]->string, &adr[i][0], NA_IP); if(res == 2) { // if no port was specified, use the default master port adr[i][0].port = BigShort(PORT_MASTER); } if(res) Com_Printf( "%s resolved to %s\n", sv_master[i]->string, NET_AdrToStringwPort(adr[i][0])); else Com_Printf( "%s has no IPv4 address.\n", sv_master[i]->string); } if(netenabled & NET_ENABLEV6) { Com_Printf("Resolving %s (IPv6)\n", sv_master[i]->string); res = NET_StringToAdr(sv_master[i]->string, &adr[i][1], NA_IP6); if(res == 2) { // if no port was specified, use the default master port adr[i][1].port = BigShort(PORT_MASTER); } if(res) Com_Printf( "%s resolved to %s\n", sv_master[i]->string, NET_AdrToStringwPort(adr[i][1])); else Com_Printf( "%s has no IPv6 address.\n", sv_master[i]->string); } if(adr[i][0].type == NA_BAD && adr[i][1].type == NA_BAD) { // if the address failed to resolve, clear it // so we don't take repeated dns hits Com_Printf("Couldn't resolve address: %s\n", sv_master[i]->string); Cvar_Set(sv_master[i]->name, ""); sv_master[i]->modified = qfalse; continue; } } Com_Printf ("Sending heartbeat to %s\n", sv_master[i]->string ); // this command should be changed if the server info / status format // ever incompatably changes if(adr[i][0].type != NA_BAD) NET_OutOfBandPrint( NS_SERVER, adr[i][0], "heartbeat %s\n", message); if(adr[i][1].type != NA_BAD) NET_OutOfBandPrint( NS_SERVER, adr[i][1], "heartbeat %s\n", message); } }
/* * ==================== * LAN_GetServerInfo * ==================== */ static void LAN_GetServerInfo( int source, int n, char *buf, int buflen ) { char info[ MAX_STRING_CHARS ]; serverInfo_t *server = nullptr; info[ 0 ] = '\0'; switch ( source ) { case AS_LOCAL: if ( n >= 0 && n < MAX_OTHER_SERVERS ) { server = &cls.localServers[ n ]; } break; case AS_GLOBAL: if ( n >= 0 && n < MAX_GLOBAL_SERVERS ) { server = &cls.globalServers[ n ]; } break; case AS_FAVORITES: if ( n >= 0 && n < MAX_OTHER_SERVERS ) { server = &cls.favoriteServers[ n ]; } break; } if ( server && buf ) { buf[ 0 ] = '\0'; Info_SetValueForKey( info, "hostname", server->hostName, false ); Info_SetValueForKey( info, "serverload", va( "%i", server->load ), false ); Info_SetValueForKey( info, "mapname", server->mapName, false ); Info_SetValueForKey( info, "label", server->label, false ); Info_SetValueForKey( info, "clients", va( "%i", server->clients ), false ); Info_SetValueForKey( info, "bots", va( "%i", server->bots ), false ); Info_SetValueForKey( info, "sv_maxclients", va( "%i", server->maxClients ), false ); Info_SetValueForKey( info, "ping", va( "%i", server->ping ), false ); Info_SetValueForKey( info, "minping", va( "%i", server->minPing ), false ); Info_SetValueForKey( info, "maxping", va( "%i", server->maxPing ), false ); Info_SetValueForKey( info, "game", server->game, false ); Info_SetValueForKey( info, "nettype", Util::enum_str(server->netType), false ); Info_SetValueForKey( info, "addr", NET_AdrToStringwPort( server->adr ), false ); Info_SetValueForKey( info, "friendlyFire", va( "%i", server->friendlyFire ), false ); // NERVE - SMF Info_SetValueForKey( info, "needpass", va( "%i", server->needpass ), false ); // NERVE - SMF Info_SetValueForKey( info, "gamename", server->gameName, false ); // Arnout Q_strncpyz( buf, info, buflen ); } else { if ( buf ) { buf[ 0 ] = '\0'; } } }
static void SV_ResolveMasterServers() { int i, netenabled, res; netenabled = Cvar_VariableIntegerValue( "net_enabled" ); for ( i = 0; i < MAX_MASTER_SERVERS; i++ ) { if ( !sv_master[ i ]->string || !sv_master[ i ]->string[ 0 ] ) { challenges[ i ].type = masterServerAddr[ i ].ipv4.type = masterServerAddr[ i ].ipv6.type = NA_BAD; continue; } // see if we haven't already resolved the name // resolving usually causes hitches on win95, so only // do it when needed if ( sv_master[ i ]->modified || ( masterServerAddr[ i ].ipv4.type == NA_BAD && masterServerAddr[ i ].ipv6.type == NA_BAD ) ) { sv_master[ i ]->modified = false; if ( netenabled & NET_ENABLEV4 ) { Com_Printf( "Resolving %s (IPv4)\n", sv_master[ i ]->string ); res = NET_StringToAdr( sv_master[ i ]->string, &masterServerAddr[ i ].ipv4, NA_IP ); if ( res == 2 ) { // if no port was specified, use the default master port masterServerAddr[ i ].ipv4.port = BigShort( PORT_MASTER ); } if ( res ) { Com_Printf( "%s resolved to %s\n", sv_master[ i ]->string, NET_AdrToStringwPort( masterServerAddr[ i ].ipv4 ) ); } else { Com_Printf( "%s has no IPv4 address.\n", sv_master[ i ]->string ); } } if ( netenabled & NET_ENABLEV6 ) { Com_Printf( "Resolving %s (IPv6)\n", sv_master[ i ]->string ); res = NET_StringToAdr( sv_master[ i ]->string, &masterServerAddr[ i ].ipv6, NA_IP6 ); if ( res == 2 ) { // if no port was specified, use the default master port masterServerAddr[ i ].ipv6.port = BigShort( PORT_MASTER ); } if ( res ) { Com_Printf( "%s resolved to %s\n", sv_master[ i ]->string, NET_AdrToStringwPort( masterServerAddr[ i ].ipv6 ) ); } else { Com_Printf( "%s has no IPv6 address.\n", sv_master[ i ]->string ); } } if ( masterServerAddr[ i ].ipv4.type == NA_BAD && masterServerAddr[ i ].ipv6.type == NA_BAD ) { // if the address failed to resolve, clear it // so we don't take repeated dns hits Com_Printf( "Couldn't resolve address: %s\n", sv_master[ i ]->string ); Cvar_Set( sv_master[ i ]->name, "" ); sv_master[ i ]->modified = false; continue; } } } }
/* =============== SV_MasterHeartbeat =============== */ void SV_MasterHeartbeat( const char *hbname ) { static netadr_t adr[MAX_MASTER_SERVERS][2]; int i, res, netenabled; // Update Server doesn't send heartbeat #if defined (UPDATE_SERVER) return; #endif netenabled = Cvar_VariableIntegerValue("net_enabled"); if ( SV_GameIsSinglePlayer() ) { return; // no heartbeats for SP } // "dedicated 1" is for lan play, "dedicated 2" is for inet public play if (!com_dedicated || com_dedicated->integer != 2 || !(netenabled & (NET_ENABLEV4 | NET_ENABLEV6))) { return; // only dedicated servers send heartbeats } // if not time yet, don't send anything if ( svs.time < svs.nextHeartbeatTime ) { return; } svs.nextHeartbeatTime = svs.time + HEARTBEAT_MSEC; // send to group masters for (i = 0; i < MAX_MASTER_SERVERS; i++) { if(!sv_master[i]->string[0]) { continue; } // see if we haven't already resolved the name // resolving usually causes hitches on win95, so only // do it when needed if(sv_master[i]->modified || (adr[i][0].type == NA_BAD && adr[i][1].type == NA_BAD)) { sv_master[i]->modified = false; if(netenabled & NET_ENABLEV4) { Com_Printf("Resolving %s (IPv4)\n", sv_master[i]->string); res = NET_StringToAdr(sv_master[i]->string, &adr[i][0], NA_IP); if(res == 2) { // if no port was specified, use the default master port adr[i][0].port = BigShort(PORT_MASTER); } if(res) { Com_Printf( "%s resolved to %s\n", sv_master[i]->string, NET_AdrToStringwPort(adr[i][0])); } else { Com_Printf( "%s has no IPv4 address.\n", sv_master[i]->string); } } if(netenabled & NET_ENABLEV6) { Com_Printf("Resolving %s (IPv6)\n", sv_master[i]->string); res = NET_StringToAdr(sv_master[i]->string, &adr[i][1], NA_IP6); if(res == 2) { // if no port was specified, use the default master port adr[i][1].port = BigShort(PORT_MASTER); } if(res) { Com_Printf( "%s resolved to %s\n", sv_master[i]->string, NET_AdrToStringwPort(adr[i][1])); } else { Com_Printf( "%s has no IPv6 address.\n", sv_master[i]->string); } } if(adr[i][0].type == NA_BAD && adr[i][1].type == NA_BAD) { // if the address failed to resolve, clear it // so we don't take repeated dns hits Com_Printf( "Couldn't resolve address: %s\n", sv_master[i]->string ); Cvar_Set( sv_master[i]->name, "" ); sv_master[i]->modified = false; continue; } } Com_Printf( "Sending heartbeat to the official OpenWolf servers list %s\n", sv_master[i]->string ); // this command should be changed if the server info / status format // ever incompatably changes if(adr[i][0].type != NA_BAD) { NET_OutOfBandPrint( NS_SERVER, adr[i][0], "heartbeat %s\n", HEARTBEAT_GAME ); } if(adr[i][1].type != NA_BAD) { NET_OutOfBandPrint( NS_SERVER, adr[i][1], "heartbeat %s\n", HEARTBEAT_GAME ); } } #if defined (USE_PHP) // Send to the main master. if (svs.queryDone) { pthread_exit(&svs.thQuery); svs.queryDone = 0; } else { SV_PHPMaster(); } #endif }