// Copyright (C) 2007-2021 EQ2Emulator Development Team, GPL v3 License #include #include #include "net.hpp" EQStreamFactory eqsf(LoginStream); std::map EQOpcodeManager; NetConnection net; ClientList client_list; LWorldList world_list; LoginDatabase database; ConfigReader configReader; std::map EQOpcodeVersions; Timer statTimer(60000); volatile bool RunLoops = true; void CatchSignal(int sig_num) { std::cout << "Got signal " << sig_num << std::endl; RunLoops = false; } int main(int argc, char** argv) { if (signal(SIGINT, CatchSignal) == SIG_ERR) { std::cerr << "Could not set signal handler" << std::endl; } LogStart(); LogParseConfigs(); net.WelcomeHeader(); srand(time(NULL)); if (!net.ReadLoginConfig()) return 1; net.InitWebServer(net.GetWebLoginAddress(), net.GetWebLoginPort(), net.GetWebCertFile(), net.GetWebKeyFile(), net.GetWebKeyPassword(), net.GetWebHardcodeUser(), net.GetWebHardcodePassword()); const char* structList[] = { "CommonStructs.xml", "LoginStructs.xml" }; for (int s = 0; s < sizeof(structList) / sizeof(const char*); s++) { LogWrite(INIT__INFO, 0, "Init", "Loading Structs File %s..", structList[s]); if (configReader.processXML_Elements(structList[s])) LogWrite(INIT__INFO, 0, "Init", "Loading Structs File %s completed..", structList[s]); else { LogWrite(INIT__ERROR, 0, "Init", "Loading Structs File %s FAILED!", structList[s]); return 1; } } LogWrite(INIT__INFO, 0, "Init", "Initialize World List.."); world_list.Init(); if (eqsf.listen_ip_address) LogWrite(INIT__INFO, 0, "Init", "Login server listening on %s port %i", eqsf.listen_ip_address, net.GetPort()); else LogWrite(INIT__INFO, 0, "Init", "Login server listening on port %i", net.GetPort()); if (!eqsf.Open(net.GetPort())) { LogWrite(INIT__ERROR, 0, "Init", "Failed to open port %i.", net.GetPort()); return 1; } net.login_running = true; net.login_uptime = getCurrentTimestamp(); net.UpdateWindowTitle(); EQStream* eqs; Timer* TimeoutTimer = new Timer(5000); TimeoutTimer->Start(); while (RunLoops) { Timer::SetCurrentTime(); while ((eqs = eqsf.Pop())) { struct in_addr in; in.s_addr = eqs->GetRemoteIP(); LogWrite(LOGIN__INFO, 0, "Login", "New client from IP: %s on port %i", inet_ntoa(in), ntohs(eqs->GetRemotePort())); Client* client = new Client(eqs); eqs->SetClientVersion(0); client_list.Add(client); net.numclients++; net.UpdateWindowTitle(); } if (TimeoutTimer->Check()) { eqsf.CheckTimeout(); } if (statTimer.Check()) { world_list.UpdateWorldStats(); database.RemoveOldWorldServerStats(); database.FixBugReport(); } client_list.Process(); world_list.Process(); Sleep(1); } eqsf.Close(); world_list.Shutdown(); delete TimeoutTimer; return 0; }