void SignalHandler(int sig) { switch (sig) { case SIGUSR1: { LoadLogFile(); break; } case SIGUSR2: { if (pNetGame) { pNetGame->LoadBanList(); } break; } case SIGINT: case SIGTERM: { bQuitApp = true; break; } } }
BOOL LoadLogFiles(HKEY eventlogKey) { LONG result; DWORD MaxLognameLen, LognameLen; WCHAR *Buf = NULL; INT i; PLOGFILE pLogFile; RegQueryInfoKey(eventlogKey, NULL, NULL, NULL, NULL, &MaxLognameLen, NULL, NULL, NULL, NULL, NULL, NULL); MaxLognameLen++; Buf = HeapAlloc(MyHeap, 0, MaxLognameLen * sizeof(WCHAR)); if (!Buf) { DPRINT1("Error: can't allocate heap!\n"); return FALSE; } i = 0; LognameLen = MaxLognameLen; while (RegEnumKeyEx(eventlogKey, i, Buf, &LognameLen, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { HKEY SubKey; DPRINT("%S\n", Buf); result = RegOpenKeyEx(eventlogKey, Buf, 0, KEY_ALL_ACCESS, &SubKey); if (result != ERROR_SUCCESS) { DPRINT1("Failed to open %S key.\n", Buf); HeapFree(MyHeap, 0, Buf); return FALSE; } pLogFile = LoadLogFile(SubKey, Buf); if (pLogFile != NULL) { DPRINT("Loaded %S\n", Buf); LoadEventSources(SubKey, pLogFile); } else { DPRINT1("Failed to load %S\n", Buf); } RegCloseKey(SubKey); LognameLen = MaxLognameLen; i++; } HeapFree(MyHeap, 0, Buf); return TRUE; }
int main (int argc, char** argv) { #ifdef LINUX struct sigaction sv; sigemptyset(&sv.sa_mask); sv.sa_flags = 0; sv.sa_handler = SignalHandler; sigaction(SIGTERM, &sv, NULL); sigaction(SIGQUIT, &sv, NULL); sigaction(SIGINT, &sv, NULL); // sigaction(SIGHUP, &sv, NULL); sigaction(SIGUSR1, &sv, NULL); sigaction(SIGUSR2, &sv, NULL); bool bOutputEnable = false; #endif bool bEnableAnnounce = true; int iMaxPlayers = DEFAULT_MAX_PLAYERS; int iListenPort = DEFAULT_LISTEN_PORT; int iRconPort = DEFAULT_RCON_PORT; int iRconMaxAdmins = DEFAULT_RCON_MAXUSERS; bool bLanModeEnable = false; bool bEnableTimestamp = true; bool bEnableInstagib = false; bool bGameMod = false; bool bEnableAC = false; bool bAllowQuery = true; // Open the log file LoadLogFile(); // Create the command line string and process if needed. char szCmdLine[1024]; memset(szCmdLine,0,1024); int cmdcnt=1; if(argc > 1) { while(cmdcnt != argc) { strcat(szCmdLine, argv[cmdcnt]); strcat(szCmdLine, " "); cmdcnt++; } InitSettingsFromCommandLine(szCmdLine); } // Write welcome message. logprintf(""); logprintf("SA-MP Dedicated Server"); logprintf("----------------------"); logprintf("v" SAMP_VERSION ", (C)2005-2009 SA-MP Team\n"); #ifdef _DEBUG logprintf("Debug Build Info:\n NET_VERSION=%d\n BUILD_DATE=%s\n BUILD_TIME=%s\n", NETGAME_VERSION, __DATE__, __TIME__); #endif // Create a challenge number for the clients to be able to connect srand(time(NULL)); _uiRndSrvChallenge = (unsigned int)rand(); // Create the Console pConsole = new CConsole(); pConsole->AddVariable("announce",CON_VARTYPE_BOOL, 0, &bEnableAnnounce); if(gServerSettings.iMaxPlayers) { iMaxPlayers = gServerSettings.iMaxPlayers; pConsole->AddVariable("maxplayers", CON_VARTYPE_INT, 0, &iMaxPlayers); pConsole->ModifyVariableFlags("maxplayers", CON_VARFLAG_READONLY); } else { pConsole->AddVariable("maxplayers", CON_VARTYPE_INT, 0, &iMaxPlayers, ServerMaxPlayersChanged); } if(gServerSettings.iPort) { iListenPort = gServerSettings.iPort; pConsole->AddVariable("port", CON_VARTYPE_INT, 0, &iListenPort); pConsole->ModifyVariableFlags("port", CON_VARFLAG_READONLY); } else { pConsole->AddVariable("port", CON_VARTYPE_INT, 0, &iListenPort); } if(strlen(gServerSettings.szBindIp)) { pConsole->AddStringVariable("bind", 0, gServerSettings.szBindIp); pConsole->ModifyVariableFlags("bind", CON_VARFLAG_READONLY); } else { pConsole->AddStringVariable("bind", 0, NULL); } pConsole->AddVariable("lanmode",CON_VARTYPE_BOOL,0, &bLanModeEnable); pConsole->AddVariable("query",CON_VARTYPE_BOOL, 0, &bAllowQuery); #ifdef RAKRCON pConsole->AddVariable("rcon_port", CON_VARTYPE_INT, 0, &iRconPort); pConsole->AddVariable("rcon_maxadmins", CON_VARTYPE_INT, 0, &iRconMaxAdmins); pConsole->AddStringVariable("rcon_bind", 0, NULL); #endif #ifdef LINUX pConsole->AddVariable("output",CON_VARTYPE_BOOL,0,&bOutputEnable); #endif pConsole->AddVariable("timestamp",CON_VARTYPE_BOOL,0,&bEnableTimestamp); pConsole->AddStringVariable("password", 0, NULL, ServerPasswordChanged); pConsole->AddStringVariable("hostname", 0, "SA:MP Server"); pConsole->AddStringVariable("mapname", CON_VARFLAG_RULE, "San Andreas"); pConsole->AddStringVariable("weburl", CON_VARFLAG_RULE, "www.sa-mp.com"); pConsole->AddStringVariable("rcon_password", 0, "changeme"); pConsole->AddStringVariable("gravity", CON_VARFLAG_RULE, "0.008"); pConsole->AddStringVariable("weather", CON_VARFLAG_RULE, "10"); //pConsole->AddStringVariable("tirepopping", CON_VARFLAG_RULE, "0"); pConsole->AddStringVariable("gamemodetext", 0, "Unknown"); pConsole->AddStringVariable("filterscripts", 0, ""); pConsole->AddStringVariable("plugins", 0, ""); pConsole->AddStringVariable("nosign", 0, ""); pConsole->AddVariable("anticheat",CON_VARTYPE_BOOL, /* CON_VARFLAG_RULE */ 0, &bEnableAC); pConsole->AddVariable("instagib", CON_VARTYPE_BOOL, CON_VARFLAG_RULE, &bEnableInstagib, ServerInstagibChanged); pConsole->AddVariable("myriad", CON_VARTYPE_BOOL, 0, &bGameMod); // Add 16 gamemode variables. int x=0; char t[64]; while(x!=16) { sprintf(t,"gamemode%u",x); pConsole->AddStringVariable(t,0,""); x++; } // Exec the server config! pConsole->Execute("exec server"); if ( !strcmp( pConsole->GetStringVariable("rcon_password"), "changeme" ) ) { logprintf("Error: Your password must be changed from the default password, please change it."); return 0; } // Change some var flags to read-only (can only be accessed from server.cfg). pConsole->ModifyVariableFlags("maxplayers", CON_VARFLAG_READONLY); pConsole->ModifyVariableFlags("bind", CON_VARFLAG_READONLY); pConsole->ModifyVariableFlags("port", CON_VARFLAG_READONLY); pConsole->ModifyVariableFlags("rcon_bind", CON_VARFLAG_READONLY); pConsole->ModifyVariableFlags("rcon_port", CON_VARFLAG_READONLY); pConsole->ModifyVariableFlags("filterscripts", CON_VARFLAG_READONLY); pConsole->ModifyVariableFlags("plugins", CON_VARFLAG_READONLY); pConsole->ModifyVariableFlags("anticheat", CON_VARFLAG_READONLY /* | CON_VARFLAG_RULE */); pConsole->ModifyVariableFlags("nosign", CON_VARFLAG_READONLY); // Add the version as a rule pConsole->AddStringVariable("version", CON_VARFLAG_RULE | CON_VARFLAG_READONLY, SAMP_VERSION); // If we're running in Windows, allow console input and catch exit messages. // TODO: Same thing for Linux. #ifdef WIN32 SetConsoleCtrlHandler(CtrlHandler, TRUE); hConsoleExecuteEvent = CreateEvent(NULL, TRUE, FALSE, NULL); DWORD dwThreadId; HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ConsoleInputThread, NULL, 0, &dwThreadId); // Setup the exception handler on windows SetUnhandledExceptionFilter(exc_handler); #endif // Load up the plugins pPlugins = new CPlugins(); pPlugins->LoadPlugins("plugins"); // Create the NetGame. pNetGame = new CNetGame(); pNetGame->Init(true); // Start the rcon server PCHAR szBindAddress = pConsole->GetStringVariable("rcon_bind"); if (!szBindAddress || szBindAddress[0] == 0) szBindAddress = pConsole->GetStringVariable("bind"); if (!szBindAddress || szBindAddress[0] == 0) szBindAddress = NULL; #ifdef RAKRCON pRcon = new CRcon(pConsole->GetStringVariable("rcon_password"), pConsole->GetIntVariable("rcon_port"), pConsole->GetIntVariable("rcon_maxadmins"), szBindAddress); pRcon->Process(); #endif // While the app is running... while (!bQuitApp) { pNetGame->Process(); #ifdef RAKRCON pRcon->Process(); #endif if(TRUE == bGameModeFinished) { pNetGame->ShutdownForGameModeRestart(); bGameModeFinished = FALSE; } #ifdef WIN32 SetEvent(hConsoleExecuteEvent); WaitForSingleObject(hConsoleExecuteEvent, INFINITE); #endif SLEEP(10); } #ifdef RAKRCON delete pRcon; #endif delete pNetGame; delete pPlugins; // If WIN32: Kill the input thread. #ifdef WIN32 TerminateThread(hThread, 0); CloseHandle(hConsoleExecuteEvent); #endif delete pConsole; fclose(pLogFile); return 0; }