int main(int argc, char* argv[]) { StringVec args = StringVec(argv, argv + argc); if(argc > 1 && !argumentsHandler(args)) return 0; std::set_new_handler(allocationHandler); ServiceManager servicer; g_config.startup(); #ifdef __OTSERV_ALLOCATOR_STATS__ boost::thread(boost::bind(&allocatorStatsThread, (void*)NULL)); // TODO: shutdown this thread? #endif #ifdef __EXCEPTION_TRACER__ ExceptionHandler mainExceptionHandler; mainExceptionHandler.InstallHandler(); #endif #ifndef WINDOWS // ignore sigpipe... struct sigaction sigh; sigh.sa_handler = SIG_IGN; sigh.sa_flags = 0; sigemptyset(&sigh.sa_mask); sigaction(SIGPIPE, &sigh, NULL); // register signals signal(SIGHUP, signalHandler); //save signal(SIGTRAP, signalHandler); //clean signal(SIGCHLD, signalHandler); //refresh signal(SIGUSR1, signalHandler); //close server signal(SIGUSR2, signalHandler); //open server signal(SIGCONT, signalHandler); //reload all signal(SIGQUIT, signalHandler); //save & shutdown signal(SIGTERM, signalHandler); //shutdown #endif OutputHandler::getInstance(); Dispatcher::getInstance().addTask(createTask(boost::bind(otserv, args, &servicer))); g_loaderSignal.wait(g_loaderUniqueLock); if(servicer.isRunning()) { std::clog << ">> " << g_config.getString(ConfigManager::SERVER_NAME) << " server Online!" << std::endl << std::endl; servicer.run(); } else std::clog << ">> " << g_config.getString(ConfigManager::SERVER_NAME) << " server Offline! No services available..." << std::endl << std::endl; #ifdef __EXCEPTION_TRACER__ mainExceptionHandler.RemoveHandler(); #endif return 0; }
int main(int argc, char *argv[]) { std::srand((uint32_t)OTSYS_TIME()); StringVec args = StringVec(argv, argv + argc); if(argc > 1 && !argumentsHandler(args)) return 0; #else void serverMain(void* param) { std::cout.rdbuf(&g_logger); std::cerr.rdbuf(&g_logger); std::clog.rdbuf(&g_logger); #endif std::set_new_handler(allocationHandler); ServiceManager servicer; g_config.startup(); #ifdef __OTSERV_ALLOCATOR_STATS__ //boost::thread(boost::bind(&allocatorStatsThread, (void*)NULL)); // TODO: this thread needs a shutdown (timed_lock + interrupt? .interrupt + .unlock) #endif #ifdef __EXCEPTION_TRACER__ ExceptionHandler mainExceptionHandler; mainExceptionHandler.InstallHandler(); #endif #ifndef WINDOWS // ignore sigpipe... struct sigaction sigh; sigh.sa_handler = SIG_IGN; sigh.sa_flags = 0; sigemptyset(&sigh.sa_mask); sigaction(SIGPIPE, &sigh, NULL); // register signals signal(SIGHUP, signalHandler); //save signal(SIGTRAP, signalHandler); //clean signal(SIGCHLD, signalHandler); //refresh signal(SIGUSR1, signalHandler); //close server signal(SIGUSR2, signalHandler); //open server signal(SIGCONT, signalHandler); //reload all signal(SIGQUIT, signalHandler); //save & shutdown signal(SIGTERM, signalHandler); //shutdown #endif Dispatcher::getInstance().addTask(createTask(boost::bind(otserv, #if !defined(WINDOWS) || defined(_CONSOLE) args, #endif &servicer))); g_loaderSignal.wait(g_loaderUniqueLock); boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); if(servicer.isRunning()) { Status::getInstance(); std::clog << ">> " << g_config.getString(ConfigManager::SERVER_NAME) << " server Online!" << std::endl << std::endl; #if defined(WINDOWS) && !defined(_CONSOLE) SendMessage(GUI::getInstance()->m_statusBar, WM_SETTEXT, 0, (LPARAM)">> server Online!"); GUI::getInstance()->m_connections = true; #endif servicer.run(); } else { Status::getInstance(); std::clog << ">> " << g_config.getString(ConfigManager::SERVER_NAME) << " server Offline! No services available..." << std::endl << std::endl; #if defined(WINDOWS) && !defined(_CONSOLE) SendMessage(GUI::getInstance()->m_statusBar, WM_SETTEXT, 0, (LPARAM)">> server Offline! No services available..."); GUI::getInstance()->m_connections = true; #endif } Dispatcher::getInstance().exit(); Scheduler::getInstance().exit(); #ifdef __EXCEPTION_TRACER__ mainExceptionHandler.RemoveHandler(); #endif #if !defined(WINDOWS) || defined(_CONSOLE) return 0; #endif }
int main(int argc, char *argv[]) { StringVec args = StringVec(argv, argv + argc); if(argc > 1 && !argumentsHandler(args)) return 0; #else void serverMain(void* param) { std::cout.rdbuf(&g_logger); std::cerr.rdbuf(&g_logger); #endif std::set_new_handler(allocationHandler); ServiceManager servicer; g_config.startup(); #ifdef __OTSERV_ALLOCATOR_STATS__ boost::thread(boost::bind(&allocatorStatsThread, (void*)NULL)); // TODO: destruct this thread... #endif #ifdef __EXCEPTION_TRACER__ ExceptionHandler mainExceptionHandler; mainExceptionHandler.InstallHandler(); #endif #ifndef WINDOWS // ignore sigpipe... struct sigaction sigh; sigh.sa_handler = SIG_IGN; sigh.sa_flags = 0; sigemptyset(&sigh.sa_mask); sigaction(SIGPIPE, &sigh, NULL); // register signals signal(SIGHUP, signalHandler); //save signal(SIGTRAP, signalHandler); //clean signal(SIGCHLD, signalHandler); //refresh signal(SIGUSR1, signalHandler); //close server signal(SIGUSR2, signalHandler); //open server signal(SIGCONT, signalHandler); //reload all signal(SIGQUIT, signalHandler); //save & shutdown signal(SIGTERM, signalHandler); //shutdown #endif Dispatcher::getInstance().addTask(createTask(boost::bind(otserv, #if !defined(WINDOWS) || defined(__CONSOLE__) args, #endif &servicer))); g_loaderSignal.wait(g_loaderUniqueLock); #if !defined(WINDOWS) || defined(__CONSOLE__) std::string outPath = g_config.getString(ConfigManager::OUT_LOG), errPath = g_config.getString(ConfigManager::ERROR_LOG); if(outPath.length() < 3) outPath = ""; else if(outPath[0] != '/' && outPath[1] != ':') { outPath = getFilePath(FILE_TYPE_LOG, outPath); std::cout << "> Logging output to file: " << outPath << std::endl; } if(errPath.length() < 3) errPath = ""; else if(errPath[0] != '/' && errPath[1] != ':') { errPath = getFilePath(FILE_TYPE_LOG, errPath); std::cout << "> Logging errors to file: " << errPath << std::endl; } if(outPath != "") { boost::shared_ptr<std::ofstream> outFile; outFile.reset(new std::ofstream(outPath.c_str(), (g_config.getBool(ConfigManager::TRUNCATE_LOGS) ? std::ios::trunc : std::ios::app) | std::ios::out)); if(!outFile->is_open()) startupErrorMessage("Could not open output log file for writing!"); std::cout.rdbuf(outFile->rdbuf()); } if(errPath != "") { boost::shared_ptr<std::ofstream> errFile; errFile.reset(new std::ofstream(errPath.c_str(), (g_config.getBool(ConfigManager::TRUNCATE_LOGS) ? std::ios::trunc : std::ios::app) | std::ios::out)); if(!errFile->is_open()) startupErrorMessage("Could not open error log file for writing!"); std::cerr.rdbuf(errFile->rdbuf()); } #endif if(servicer.isRunning()) { std::cout << ">> " << g_config.getString(ConfigManager::SERVER_NAME) << " server Online!" << std::endl << std::endl; #if defined(WINDOWS) && !defined(__CONSOLE__) SendMessage(GUI::getInstance()->m_statusBar, WM_SETTEXT, 0, (LPARAM)">> Status: Online!"); GUI::getInstance()->m_connections = true; #endif servicer.run(); } else { std::cout << ">> " << g_config.getString(ConfigManager::SERVER_NAME) << " server Offline! No services available..." << std::endl << std::endl; #if defined(WINDOWS) && !defined(__CONSOLE__) SendMessage(GUI::getInstance()->m_statusBar, WM_SETTEXT, 0, (LPARAM)">> Status: Offline!"); GUI::getInstance()->m_connections = true; #endif } #ifdef __EXCEPTION_TRACER__ mainExceptionHandler.RemoveHandler(); #endif #if !defined(WINDOWS) || defined(__CONSOLE__) return 0; #endif }