From e4dddbe7c0134e481b63a9f27bbf4de6f253b7a1 Mon Sep 17 00:00:00 2001 From: codemastr Date: Wed, 11 Feb 2004 03:44:31 +0000 Subject: [PATCH] Fixed a problem with config loading and module errors --- Changes | 1 + src/s_conf.c | 13 ++-- src/s_serv.c | 182 ++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 138 insertions(+), 58 deletions(-) diff --git a/Changes b/Changes index 7a26ef8d8..4b74ab8e9 100644 --- a/Changes +++ b/Changes @@ -2842,3 +2842,4 @@ seen. gmtime warning still there what you can do about it in a (hopefully) simple and understandable language ;). - Fixed a snomask bug reported by Cat / HERZ (#0001531). - Started using the umode->allowed stuff a bit ourselves, just to be sure. +- Fixed a problem with module reloading (#0001533) reported by penna. diff --git a/src/s_conf.c b/src/s_conf.c index 58676b8cc..ed45b9eaf 100644 --- a/src/s_conf.c +++ b/src/s_conf.c @@ -6353,6 +6353,7 @@ int _conf_loadmodule(ConfigFile *conf, ConfigEntry *ce) config_status("%s:%i: loadmodule %s: failed to load: %s", ce->ce_fileptr->cf_filename, ce->ce_varlinenum, files.gl_pathv[i], ret); + return -1; } } globfree(&files); @@ -6366,15 +6367,19 @@ int _conf_loadmodule(ConfigFile *conf, ConfigEntry *ce) return -1; } if ((ret = Module_Create(FindData.cFileName))) { - config_status("%s:%i: loadmodule %s: failed to load: %s", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - FindData.cFileName, ret); + config_status("%s:%i: loadmodule %s: failed to load: %s", + ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + FindData.cFileName, ret); + return -1; } while (FindNextFile(hFind, &FindData) != 0) { - if (((ret = Module_Create(FindData.cFileName)))) + if ((ret = Module_Create(FindData.cFileName))) + { config_status("%s:%i: loadmodule %s: failed to load: %s", ce->ce_fileptr->cf_filename, ce->ce_varlinenum, FindData.cFileName, ret); + return -1; + } } FindClose(hFind); #else diff --git a/src/s_serv.c b/src/s_serv.c index 3ad89a14e..fce0d5e58 100644 --- a/src/s_serv.c +++ b/src/s_serv.c @@ -3035,73 +3035,147 @@ CMD_FUNC(m_rehash) */ CMD_FUNC(m_restart) { - int x; - if (MyClient(sptr) && !OPCanRestart(sptr)) - { - sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); - return 0; - } - if (!MyClient(sptr) && !IsNetAdmin(sptr) - && !IsULine(sptr)) - { - sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); - return 0; - } - if (parc > 3) - { - /* Remote restart. */ - if (MyClient(sptr) && !IsNetAdmin(sptr)) - { - sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, - parv[0]); - return 0; - } + char *reason = NULL; + /* Check permissions */ + if (MyClient(sptr) && !OPCanRestart(sptr)) + { + sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); + return 0; + } + if (!MyClient(sptr) && !IsNetAdmin(sptr) + && !IsULine(sptr)) + { + sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); + return 0; + } - if ((x = - hunt_server_token(cptr, sptr, MSG_RESTART, TOK_RESTART, "%s %s :%s", 2, parc, - parv)) != HUNTED_ISME) - return 0; - } - - if (conf_drpass) + /* Syntax: /restart */ + if (parc == 1) { - if (parc < 2) + if (conf_drpass) { sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, - parv[0], "RESTART"); - return 0; + parv[0], "RESTART"); + return 0; } - x = Auth_Check(cptr, conf_drpass->restartauth, parv[1]); - if (x == -1) - { - sendto_one(sptr, err_str(ERR_PASSWDMISMATCH), me.name, - parv[0]); - return 0; - } - if (x < 1) - { - return 0; - } - /* Hack to make the code after this if { } easier: we assign the comment to the - * first param, as if we had not had an X:line. We do not need the password - * now anyways. Accordingly we decrement parc ;) -- NikB - */ - parv[1] = parv[2]; - parc--; } + else if (parc == 2) + { + int ret; + ret = hunt_server_token_quiet(cptr, sptr, MSG_RESTART, TOK_RESTART, + "%s", 1, parc, parv); + /* Syntax: /rehash */ + if (ret == HUNTED_PASS) + return 0; + else if (ret == HUNTED_ISME) + { + if (conf_drpass) + { + sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, + parv[0], "RESTART"); + return 0; + } + } + /* Syntax: /restart */ + else if (conf_drpass) + { + int ret; + ret = Auth_Check(cptr, conf_drpass->restartauth, parv[1]); + if (ret == -1) + { + sendto_one(sptr, err_str(ERR_PASSWDMISMATCH), me.name, + parv[0]); + return 0; + } + if (ret < 1) + return 0; + } + /* Syntax: /rehash */ + else + reason = parv[1]; + } + else if (parc == 3) + { + int ret; + /* Syntax: /restart & /restart */ + ret = hunt_server_token_quiet(cptr, sptr, MSG_RESTART, TOK_RESTART, + "%s :%s", 1, parc, parv); + if (ret == HUNTED_PASS) + return 0; + else if (ret == HUNTED_ISME) + { + if (conf_drpass) + { + int ret; + ret = Auth_Check(cptr, conf_drpass->restartauth, parv[2]); + if (ret == -1) + { + sendto_one(sptr, err_str(ERR_PASSWDMISMATCH), me.name, + parv[0]); + return 0; + } + if (ret < 1) + return 0; + } + else + reason = parv[2]; + } + /* Syntax: /restart */ + else + { + if (conf_drpass) + { + int ret; + ret = Auth_Check(cptr, conf_drpass->restartauth, parv[1]); + if (ret == -1) + { + sendto_one(sptr, err_str(ERR_PASSWDMISMATCH), me.name, + parv[0]); + return 0; + } + if (ret < 1) + return 0; + } + reason = parv[2]; + } + } + else + { + if (hunt_server_token(cptr, sptr, MSG_RESTART, TOK_RESTART, "%s %s :%s", 1, + parc, parv) != HUNTED_ISME) + return 0; + else + { + if (conf_drpass) + { + int ret; + ret = Auth_Check(cptr, conf_drpass->restartauth, parv[2]); + if (ret == -1) + { + sendto_one(sptr, err_str(ERR_PASSWDMISMATCH), me.name, + parv[0]); + return 0; + } + if (ret < 1) + return 0; + } + reason = parv[3]; + } + } + if (cptr != sptr) { sendto_serv_butone(&me, ":%s GLOBOPS :%s is remotely restarting server (%s)", - me.name, sptr->name, parv[3]); + me.name, sptr->name, reason ? reason : "No reason"); sendto_ops("%s is remotely restarting IRCd (%s)", parv[0], - parv[3]); + reason ? reason : "No reason"); } - - sendto_ops("Server is Restarting by request of %s", parv[0]); - server_reboot((!MyClient(sptr) ? (parc > 2 ? parv[3] : "No reason") - : (parc > 1 ? parv[2] : "No reason"))); + else + sendto_ops("Server is Restarting by request of %s", parv[0]); + sendto_ops("REASON: %s", reason ? reason : "No reason"); +// server_reboot(reason ? reason : "No reason"); return 0; }