112 lines
2.8 KiB
C++
112 lines
2.8 KiB
C++
// Copyright (C) 2007-2021 EQ2Emulator Development Team, GPL v3 License
|
|
|
|
#include <iostream>
|
|
#include <cstdlib>
|
|
|
|
#include "net.hpp"
|
|
|
|
EQStreamFactory eqsf(LoginStream);
|
|
std::map<int16,OpcodeManager*> EQOpcodeManager;
|
|
NetConnection net;
|
|
ClientList client_list;
|
|
LWorldList world_list;
|
|
LoginDatabase database;
|
|
ConfigReader configReader;
|
|
std::map<int16, int16> 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;
|
|
} |