/* * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version. * Copyright (C) 2008-2016 TrinityCore * Copyright (C) 2005-2009 MaNGOS */ /// \addtogroup Trinityd Trinity Daemon /// @{ /// \file #include "Common.h" #include "Configuration/Config.h" #include "Database/DatabaseEnv.h" #include "Log.h" #include "Master.h" #include #include #include #ifndef _ACORE_CORE_CONFIG #define _ACORE_CORE_CONFIG "worldserver.conf" #endif #ifdef _WIN32 #include "ServiceWin32.h" char serviceName[] = "worldserver"; char serviceLongName[] = "AzerothCore world service"; char serviceDescription[] = "AzerothCore World of Warcraft emulator world service"; /* * -1 - not in service mode * 0 - stopped * 1 - running * 2 - paused */ int m_ServiceStatus = -1; #endif WorldDatabaseWorkerPool WorldDatabase; ///< Accessor to the world database CharacterDatabaseWorkerPool CharacterDatabase; ///< Accessor to the character database LoginDatabaseWorkerPool LoginDatabase; ///< Accessor to the realm/login database uint32 realmID; ///< Id of the realm /// Print out the usage string for this program on the console. void usage(const char* prog) { printf("Usage:\n"); printf(" %s []\n", prog); printf(" -c config_file use config_file as configuration file\n"); #ifdef _WIN32 printf(" Running as service functions:\n"); printf(" --service run as service\n"); printf(" -s install install service\n"); printf(" -s uninstall uninstall service\n"); #endif } /// Launch the Trinity server extern int main(int argc, char** argv) { ///- Command line parsing to get the configuration file name std::string configFile = sConfigMgr->GetConfigPath() + std::string(_ACORE_CORE_CONFIG); int c = 1; while (c < argc) { if (strcmp(argv[c], "--dry-run") == 0) { sConfigMgr->setDryRun(true); } if (!strcmp(argv[c], "-c")) { if (++c >= argc) { printf("Runtime-Error: -c option requires an input argument"); usage(argv[0]); return 1; } else configFile = argv[c]; } #ifdef _WIN32 if (strcmp(argv[c], "-s") == 0) // Services { if (++c >= argc) { printf("Runtime-Error: -s option requires an input argument"); usage(argv[0]); return 1; } if (strcmp(argv[c], "install") == 0) { if (WinServiceInstall()) printf("Installing service\n"); return 1; } else if (strcmp(argv[c], "uninstall") == 0) { if (WinServiceUninstall()) printf("Uninstalling service\n"); return 1; } else { printf("Runtime-Error: unsupported option %s", argv[c]); usage(argv[0]); return 1; } } if (strcmp(argv[c], "--service") == 0) WinServiceRun(); #endif ++c; } // Add file and args in config sConfigMgr->Configure(configFile, std::vector(argv, argv + argc), CONFIG_FILE_LIST); if (!sConfigMgr->LoadAppConfigs()) return 1; sLog->outString("Using configuration file %s.", configFile.c_str()); sLog->outString("Using SSL version: %s (library: %s)", OPENSSL_VERSION_TEXT, SSLeay_version(SSLEAY_VERSION)); sLog->outString("Using ACE version: %s", ACE_VERSION); ///- and run the 'Master' /// @todo Why do we need this 'Master'? Can't all of this be in the Main as for Realmd? int ret = sMaster->Run(); // at sMaster return function exist with codes // 0 - normal shutdown // 1 - shutdown at error // 2 - restart command used, this code can be used by restarter for restart Trinityd return ret; } /// @}