From f08df25085c671b979d041b8ec2dd7778313f614 Mon Sep 17 00:00:00 2001 From: Daniel Seiler Date: Sat, 30 Dec 2023 08:00:43 +0100 Subject: [PATCH] feat: split out system() calls from the rest of MasterServer (#1368) --- dMasterServer/CMakeLists.txt | 1 + dMasterServer/InstanceManager.cpp | 54 ++--------------------- dMasterServer/MasterServer.cpp | 40 +---------------- dMasterServer/Start.cpp | 71 +++++++++++++++++++++++++++++++ dMasterServer/Start.h | 6 +++ 5 files changed, 83 insertions(+), 89 deletions(-) create mode 100644 dMasterServer/Start.cpp create mode 100644 dMasterServer/Start.h diff --git a/dMasterServer/CMakeLists.txt b/dMasterServer/CMakeLists.txt index 2161681f..656a026a 100644 --- a/dMasterServer/CMakeLists.txt +++ b/dMasterServer/CMakeLists.txt @@ -1,6 +1,7 @@ set(DMASTERSERVER_SOURCES "InstanceManager.cpp" "ObjectIDManager.cpp" + "Start.cpp" ) add_library(dMasterServer ${DMASTERSERVER_SOURCES}) diff --git a/dMasterServer/InstanceManager.cpp b/dMasterServer/InstanceManager.cpp index 28ee37b5..51aad2cc 100644 --- a/dMasterServer/InstanceManager.cpp +++ b/dMasterServer/InstanceManager.cpp @@ -9,10 +9,11 @@ #include "CDZoneTableTable.h" #include "MasterPackets.h" #include "BitStreamUtils.h" -#include "BinaryPathFinder.h" #include "eConnectionType.h" #include "eMasterMessageType.h" +#include "Start.h" + InstanceManager::InstanceManager(Logger* logger, const std::string& externalIP) { mLogger = logger; mExternalIP = externalIP; @@ -57,33 +58,7 @@ Instance* InstanceManager::GetInstance(LWOMAPID mapID, bool isFriendTransfer, LW instance = new Instance(mExternalIP, port, mapID, ++m_LastInstanceID, cloneID, softCap, maxPlayers); //Start the actual process: -#ifdef _WIN32 - std::string cmd = "start " + (BinaryPathFinder::GetBinaryDir() / "WorldServer.exe").string() + " -zone "; -#else - std::string cmd; - if (std::atoi(Game::config->GetValue("use_sudo_world").c_str())) { - cmd = "sudo " + (BinaryPathFinder::GetBinaryDir() / "WorldServer").string() + " -zone "; - } else { - cmd = (BinaryPathFinder::GetBinaryDir() / "WorldServer").string() + " -zone "; - } -#endif - - cmd.append(std::to_string(mapID)); - cmd.append(" -port "); - cmd.append(std::to_string(port)); - cmd.append(" -instance "); - cmd.append(std::to_string(m_LastInstanceID)); - cmd.append(" -maxclients "); - cmd.append(std::to_string(maxPlayers)); - - cmd.append(" -clone "); - cmd.append(std::to_string(cloneID)); - -#ifndef _WIN32 - cmd.append("&"); //Sends our next process to the background on Linux -#endif - - auto ret = system(cmd.c_str()); + StartWorldServer(mapID, port, m_LastInstanceID, maxPlayers, cloneID); m_Instances.push_back(instance); @@ -318,28 +293,7 @@ Instance* InstanceManager::CreatePrivateInstance(LWOMAPID mapID, LWOCLONEID clon instance = new Instance(mExternalIP, port, mapID, ++m_LastInstanceID, cloneID, maxPlayers, maxPlayers, true, password); //Start the actual process: - std::string cmd = "start " + (BinaryPathFinder::GetBinaryDir() / "WorldServer").string() + " -zone "; - -#ifndef _WIN32 - cmd = (BinaryPathFinder::GetBinaryDir() / "WorldServer").string() + " -zone "; -#endif - - cmd.append(std::to_string(mapID)); - cmd.append(" -port "); - cmd.append(std::to_string(port)); - cmd.append(" -instance "); - cmd.append(std::to_string(m_LastInstanceID)); - cmd.append(" -maxclients "); - cmd.append(std::to_string(maxPlayers)); - - cmd.append(" -clone "); - cmd.append(std::to_string(cloneID)); - -#ifndef WIN32 - cmd.append("&"); //Sends our next process to the background on Linux -#endif - - auto ret = system(cmd.c_str()); + StartWorldServer(mapID, port, m_LastInstanceID, maxPlayers, cloneID); m_Instances.push_back(instance); diff --git a/dMasterServer/MasterServer.cpp b/dMasterServer/MasterServer.cpp index 1f62a64e..d7d21243 100644 --- a/dMasterServer/MasterServer.cpp +++ b/dMasterServer/MasterServer.cpp @@ -43,6 +43,7 @@ #include "PacketUtils.h" #include "FdbToSqlite.h" #include "BitStreamUtils.h" +#include "Start.h" namespace Game { Logger* logger = nullptr; @@ -58,8 +59,6 @@ bool shutdownSequenceStarted = false; void ShutdownSequence(int32_t signal = -1); int32_t FinalizeShutdown(int32_t signal = -1); Logger* SetupLogger(); -void StartAuthServer(); -void StartChatServer(); void HandlePacket(Packet* packet); std::map activeSessions; SystemAddress authServerMasterPeerSysAddr; @@ -814,43 +813,6 @@ void HandlePacket(Packet* packet) { } } -void StartChatServer() { - if (Game::shouldShutdown) { - LOG("Currently shutting down. Chat will not be restarted."); - return; - } -#ifdef __APPLE__ - //macOS doesn't need sudo to run on ports < 1024 - auto result = system(((BinaryPathFinder::GetBinaryDir() / "ChatServer").string() + "&").c_str()); -#elif _WIN32 - auto result = system(("start " + (BinaryPathFinder::GetBinaryDir() / "ChatServer.exe").string()).c_str()); -#else - if (std::atoi(Game::config->GetValue("use_sudo_chat").c_str())) { - auto result = system(("sudo " + (BinaryPathFinder::GetBinaryDir() / "ChatServer").string() + "&").c_str()); - } else { - auto result = system(((BinaryPathFinder::GetBinaryDir() / "ChatServer").string() + "&").c_str()); -} -#endif -} - -void StartAuthServer() { - if (Game::shouldShutdown) { - LOG("Currently shutting down. Auth will not be restarted."); - return; - } -#ifdef __APPLE__ - auto result = system(((BinaryPathFinder::GetBinaryDir() / "AuthServer").string() + "&").c_str()); -#elif _WIN32 - auto result = system(("start " + (BinaryPathFinder::GetBinaryDir() / "AuthServer.exe").string()).c_str()); -#else - if (std::atoi(Game::config->GetValue("use_sudo_auth").c_str())) { - auto result = system(("sudo " + (BinaryPathFinder::GetBinaryDir() / "AuthServer").string() + "&").c_str()); - } else { - auto result = system(((BinaryPathFinder::GetBinaryDir() / "AuthServer").string() + "&").c_str()); -} -#endif -} - void ShutdownSequence(int32_t signal) { if (shutdownSequenceStarted) { return; diff --git a/dMasterServer/Start.cpp b/dMasterServer/Start.cpp new file mode 100644 index 00000000..8ef571f3 --- /dev/null +++ b/dMasterServer/Start.cpp @@ -0,0 +1,71 @@ +#include "Start.h" +#include "Logger.h" +#include "dConfig.h" +#include "Game.h" +#include "BinaryPathFinder.h" + +void StartChatServer() { + if (Game::shouldShutdown) { + LOG("Currently shutting down. Chat will not be restarted."); + return; + } +#ifdef __APPLE__ + //macOS doesn't need sudo to run on ports < 1024 + auto result = system(((BinaryPathFinder::GetBinaryDir() / "ChatServer").string() + "&").c_str()); +#elif _WIN32 + auto result = system(("start " + (BinaryPathFinder::GetBinaryDir() / "ChatServer.exe").string()).c_str()); +#else + if (std::atoi(Game::config->GetValue("use_sudo_chat").c_str())) { + auto result = system(("sudo " + (BinaryPathFinder::GetBinaryDir() / "ChatServer").string() + "&").c_str()); + } else { + auto result = system(((BinaryPathFinder::GetBinaryDir() / "ChatServer").string() + "&").c_str()); +} +#endif +} + +void StartAuthServer() { + if (Game::shouldShutdown) { + LOG("Currently shutting down. Auth will not be restarted."); + return; + } +#ifdef __APPLE__ + auto result = system(((BinaryPathFinder::GetBinaryDir() / "AuthServer").string() + "&").c_str()); +#elif _WIN32 + auto result = system(("start " + (BinaryPathFinder::GetBinaryDir() / "AuthServer.exe").string()).c_str()); +#else + if (std::atoi(Game::config->GetValue("use_sudo_auth").c_str())) { + auto result = system(("sudo " + (BinaryPathFinder::GetBinaryDir() / "AuthServer").string() + "&").c_str()); + } else { + auto result = system(((BinaryPathFinder::GetBinaryDir() / "AuthServer").string() + "&").c_str()); +} +#endif +} + +void StartWorldServer(LWOMAPID mapID, uint16_t port, LWOINSTANCEID lastInstanceID, int maxPlayers, LWOCLONEID cloneID) { +#ifdef _WIN32 + std::string cmd = "start " + (BinaryPathFinder::GetBinaryDir() / "WorldServer.exe").string() + " -zone "; +#else + std::string cmd; + if (std::atoi(Game::config->GetValue("use_sudo_world").c_str())) { + cmd = "sudo " + (BinaryPathFinder::GetBinaryDir() / "WorldServer").string() + " -zone "; + } else { + cmd = (BinaryPathFinder::GetBinaryDir() / "WorldServer").string() + " -zone "; + } +#endif + + cmd.append(std::to_string(mapID)); + cmd.append(" -port "); + cmd.append(std::to_string(port)); + cmd.append(" -instance "); + cmd.append(std::to_string(lastInstanceID)); + cmd.append(" -maxclients "); + cmd.append(std::to_string(maxPlayers)); + cmd.append(" -clone "); + cmd.append(std::to_string(cloneID)); + +#ifndef _WIN32 + cmd.append("&"); //Sends our next process to the background on Linux +#endif + + auto ret = system(cmd.c_str()); +} diff --git a/dMasterServer/Start.h b/dMasterServer/Start.h new file mode 100644 index 00000000..98c83233 --- /dev/null +++ b/dMasterServer/Start.h @@ -0,0 +1,6 @@ +#pragma once +#include "dCommonVars.h" + +void StartAuthServer(); +void StartChatServer(); +void StartWorldServer(LWOMAPID mapID, uint16_t port, LWOINSTANCEID lastInstanceID, int maxPlayers, LWOCLONEID cloneID);