diff --git a/src/bnetd/command.cpp b/src/bnetd/command.cpp index aa96329..d2abc79 100644 --- a/src/bnetd/command.cpp +++ b/src/bnetd/command.cpp @@ -3922,7 +3922,61 @@ namespace pvpgn static int _handle_rehash_command(t_connection * c, char const *text) { - server_restart_wraper(); + int mode = restart_mode_all; // all by default + + text = skip_command(text); + + if (text[0] == '\0') + { + message_send_text(c, message_type_info, c, "Usage:"); + message_send_text(c, message_type_info, c, "/rehash <mode>"); + message_send_text(c, message_type_info, c, " <mode> = all | channels | realms | autoupdate | news | versioncheck | ipbans | helpfile | banners | tracker | commandgroups | aliasfile | transfile | tournament | icons | anongame | topiclist | lua"); + return 0; + } + + if (!strcasecmp(text, "all")) + mode = restart_mode_channels; + else if (!strcasecmp(text, "channels")) + mode = restart_mode_channels; + else if (!strcasecmp(text, "realms")) + mode = restart_mode_realms; + else if (!strcasecmp(text, "autoupdate")) + mode = restart_mode_autoupdate; + else if (!strcasecmp(text, "news")) + mode = restart_mode_news; + else if (!strcasecmp(text, "versioncheck")) + mode = restart_mode_versioncheck; + else if (!strcasecmp(text, "ipbans")) + mode = restart_mode_ipbans; + else if (!strcasecmp(text, "helpfile")) + mode = restart_mode_helpfile; + else if (!strcasecmp(text, "banners")) + mode = restart_mode_banners; + else if (!strcasecmp(text, "tracker")) + mode = restart_mode_tracker; + else if (!strcasecmp(text, "commandgroups")) + mode = restart_mode_commandgroups; + else if (!strcasecmp(text, "aliasfile")) + mode = restart_mode_aliasfile; + else if (!strcasecmp(text, "transfile")) + mode = restart_mode_transfile; + else if (!strcasecmp(text, "tournament")) + mode = restart_mode_tournament; + else if (!strcasecmp(text, "icons")) + mode = restart_mode_icons; + else if (!strcasecmp(text, "anongame")) + mode = restart_mode_anongame; + else if (!strcasecmp(text, "topiclist")) + mode = restart_mode_topiclist; + else if (!strcasecmp(text, "lua")) + mode = restart_mode_lua; + else + { + message_send_text(c, message_type_info, c, "Invalid mode."); + return 0; + } + + server_restart_wraper(mode); return 0; } diff --git a/src/bnetd/server.cpp b/src/bnetd/server.cpp index 56148ec..614f4c4 100644 --- a/src/bnetd/server.cpp +++ b/src/bnetd/server.cpp @@ -139,8 +139,8 @@ namespace pvpgn sigexittime = std::time(NULL) + (std::time_t)prefs_get_shutdown_delay(); } - extern void server_restart_wraper(void){ - do_restart = 1; + extern void server_restart_wraper(int mode){ + do_restart = mode; } extern void server_save_wraper(void){ @@ -1352,81 +1352,136 @@ namespace pvpgn if (do_restart) { - eventlog(eventlog_level_info, __FUNCTION__, "reading configuration files"); - if (cmdline_get_preffile()) + if (do_restart == restart_mode_all) { - if (prefs_load(cmdline_get_preffile()) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not parse configuration file"); + eventlog(eventlog_level_info, __FUNCTION__, "reading configuration files"); + if (cmdline_get_preffile()) + { + if (prefs_load(cmdline_get_preffile()) < 0) + eventlog(eventlog_level_error, __FUNCTION__, "could not parse configuration file"); + } + else + if (prefs_load(BNETD_DEFAULT_CONF_FILE) < 0) + eventlog(eventlog_level_error, __FUNCTION__, "using default configuration"); + + if (eventlog_open(prefs_get_logfile()) < 0) + eventlog(eventlog_level_error, __FUNCTION__, "could not use the file \"%s\" for the eventlog", prefs_get_logfile()); + + /* FIXME: load new network settings */ + + /* reload server name */ + server_set_hostname(); + + attrlayer_load_default(); } - else - if (prefs_load(BNETD_DEFAULT_CONF_FILE) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "using default configuration"); - if (eventlog_open(prefs_get_logfile()) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not use the file \"%s\" for the eventlog", prefs_get_logfile()); + if (do_restart == restart_mode_all || do_restart == restart_mode_channels) + { + channellist_reload(); + } - /* FIXME: load new network settings */ + if (do_restart == restart_mode_all || do_restart == restart_mode_realms) + { + if (realmlist_reload(prefs_get_realmfile()) < 0) + eventlog(eventlog_level_error, __FUNCTION__, "could not reload realm list"); + } - /* reload server name */ - server_set_hostname(); + if (do_restart == restart_mode_all || do_restart == restart_mode_autoupdate) + { + autoupdate_unload(); + if (autoupdate_load(prefs_get_mpqfile()) < 0) + eventlog(eventlog_level_error, __FUNCTION__, "could not load autoupdate list"); + } - attrlayer_load_default(); + if (do_restart == restart_mode_all || do_restart == restart_mode_news) + { + news_unload(); + if (news_load(prefs_get_newsfile()) < 0) + eventlog(eventlog_level_error, __FUNCTION__, "could not load news list"); + } - channellist_reload(); + if (do_restart == restart_mode_all || do_restart == restart_mode_versioncheck) + { + versioncheck_unload(); + if (versioncheck_load(prefs_get_versioncheck_file()) < 0) + eventlog(eventlog_level_error, __FUNCTION__, "could not load versioncheck list"); + } - if (realmlist_reload(prefs_get_realmfile()) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not reload realm list"); + if (do_restart == restart_mode_all || do_restart == restart_mode_ipbans) + { + if (ipbanlist_destroy() < 0) + eventlog(eventlog_level_error, __FUNCTION__, "could not unload old IP ban list"); + ipbanlist_create(); + if (ipbanlist_load(prefs_get_ipbanfile()) < 0) + eventlog(eventlog_level_error, __FUNCTION__, "could not load new IP ban list"); + } - autoupdate_unload(); - if (autoupdate_load(prefs_get_mpqfile()) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not load autoupdate list"); + if (do_restart == restart_mode_all || do_restart == restart_mode_helpfile) + { + helpfile_unload(); + if (helpfile_init(prefs_get_helpfile()) < 0) + eventlog(eventlog_level_error, __FUNCTION__, "could not load the helpfile"); + } - news_unload(); - if (news_load(prefs_get_newsfile()) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not load news list"); + if (do_restart == restart_mode_all || do_restart == restart_mode_banners) + { + adbannerlist.reset(new AdBannerComponent(prefs_get_adfile())); + } - versioncheck_unload(); - if (versioncheck_load(prefs_get_versioncheck_file()) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not load versioncheck list"); + if (do_restart == restart_mode_all || do_restart == restart_mode_tracker) + { + if (prefs_get_track()) + tracker_set_servers(prefs_get_trackserv_addrs()); + } - if (ipbanlist_destroy() < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not unload old IP ban list"); - ipbanlist_create(); - if (ipbanlist_load(prefs_get_ipbanfile()) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not load new IP ban list"); + if (do_restart == restart_mode_all || do_restart == restart_mode_commandgroups) + { + if (command_groups_reload(prefs_get_command_groups_file()) < 0) + eventlog(eventlog_level_error, __FUNCTION__, "could not load new command_groups list"); + } - helpfile_unload(); - if (helpfile_init(prefs_get_helpfile()) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not load the helpfile"); + if (do_restart == restart_mode_all || do_restart == restart_mode_aliasfile) + { + aliasfile_unload(); + aliasfile_load(prefs_get_aliasfile()); + } - adbannerlist.reset(new AdBannerComponent(prefs_get_adfile())); + if (do_restart == restart_mode_all || do_restart == restart_mode_transfile) + { + if (trans_reload(prefs_get_transfile(), TRANS_BNETD) < 0) + eventlog(eventlog_level_error, __FUNCTION__, "could not reload trans list"); + } - if (prefs_get_track()) - tracker_set_servers(prefs_get_trackserv_addrs()); - if (command_groups_reload(prefs_get_command_groups_file()) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not load new command_groups list"); + if (do_restart == restart_mode_all || do_restart == restart_mode_tournament) + { + tournament_reload(prefs_get_tournament_file()); + } - aliasfile_unload(); - aliasfile_load(prefs_get_aliasfile()); + if (do_restart == restart_mode_all || do_restart == restart_mode_icons) + { + customicons_unload(); + customicons_load(prefs_get_customicons_file()); + } - if (trans_reload(prefs_get_transfile(), TRANS_BNETD) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not reload trans list"); + if (do_restart == restart_mode_all || do_restart == restart_mode_anongame) + { + anongame_infos_unload(); + anongame_infos_load(prefs_get_anongame_infos_file()); + } - tournament_reload(prefs_get_tournament_file()); - - customicons_unload(); - customicons_load(prefs_get_customicons_file()); - - anongame_infos_unload(); - anongame_infos_load(prefs_get_anongame_infos_file()); - - topiclist_unload(); - if (topiclist_load(prefs_get_topicfile()) < 0) - eventlog(eventlog_level_error, __FUNCTION__, "could not load new topic list"); + if (do_restart == restart_mode_all || do_restart == restart_mode_topiclist) + { + topiclist_unload(); + if (topiclist_load(prefs_get_topicfile()) < 0) + eventlog(eventlog_level_error, __FUNCTION__, "could not load new topic list"); + } #ifdef WITH_LUA - lua_unload(); - lua_load(prefs_get_scriptdir()); + if (do_restart == restart_mode_all || do_restart == restart_mode_lua) + { + lua_unload(); + lua_load(prefs_get_scriptdir()); + } #endif eventlog(eventlog_level_info, __FUNCTION__, "done reconfiguring"); diff --git a/src/bnetd/server.h b/src/bnetd/server.h index cce484f..6723efe 100644 --- a/src/bnetd/server.h +++ b/src/bnetd/server.h @@ -71,6 +71,29 @@ namespace pvpgn namespace bnetd { + enum restart_mode + { + restart_mode_none, // always first (0) + + restart_mode_all, + restart_mode_channels, + restart_mode_realms, + restart_mode_autoupdate, + restart_mode_news, + restart_mode_versioncheck, + restart_mode_ipbans, + restart_mode_helpfile, + restart_mode_banners, + restart_mode_tracker, + restart_mode_commandgroups, + restart_mode_aliasfile, + restart_mode_transfile, + restart_mode_tournament, + restart_mode_icons, + restart_mode_anongame, + restart_mode_topiclist, + restart_mode_lua + }; extern unsigned int server_get_uptime(void); extern unsigned int server_get_starttime(void); @@ -81,7 +104,7 @@ namespace pvpgn extern int server_process(void); extern void server_quit_wraper(void); - extern void server_restart_wraper(void); + extern void server_restart_wraper(int mode); extern void server_save_wraper(void); } diff --git a/src/win32/winmain.cpp b/src/win32/winmain.cpp index bf70e56..5c4d2cc 100644 --- a/src/win32/winmain.cpp +++ b/src/win32/winmain.cpp @@ -287,7 +287,7 @@ namespace pvpgn else if (id == IDM_SAVE) server_save_wraper(); else if (id == IDM_RESTART) - server_restart_wraper(); + server_restart_wraper(restart_mode_all); else if (id == IDM_SHUTDOWN) server_quit_wraper(); else if (id == IDM_CLEAR)