X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/4562c604897f18f08e1bee993d455d9c1774f9ad..01fb744c405792dd3f0859a53f74cd4cb5fd166f:/modules/m_rehash.c diff --git a/modules/m_rehash.c b/modules/m_rehash.c index 8bddf18e..cb19d6d7 100644 --- a/modules/m_rehash.c +++ b/modules/m_rehash.c @@ -20,19 +20,15 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA - * - * $Id: m_rehash.c 3161 2007-01-25 07:23:01Z nenolod $ */ #include "stdinc.h" #include "client.h" #include "channel.h" -#include "common.h" #include "match.h" #include "ircd.h" #include "s_serv.h" #include "numeric.h" -#include "res.h" #include "s_conf.h" #include "s_newconf.h" #include "logger.h" @@ -44,17 +40,23 @@ #include "reject.h" #include "hash.h" #include "cache.h" +#include "rb_radixtree.h" +#include "sslproc.h" + +static const char rehash_desc[] = + "Provides the REHASH command to reload configuration and other files"; -static int mo_rehash(struct Client *, struct Client *, int, const char **); -static int me_rehash(struct Client *, struct Client *, int, const char **); +static void mo_rehash(struct MsgBuf *, struct Client *, struct Client *, int, const char **); +static void me_rehash(struct MsgBuf *, struct Client *, struct Client *, int, const char **); struct Message rehash_msgtab = { - "REHASH", 0, 0, 0, MFLG_SLOW, + "REHASH", 0, 0, 0, 0, {mg_unreg, mg_not_oper, mg_ignore, mg_ignore, {me_rehash, 0}, {mo_rehash, 0}} }; mapi_clist_av1 rehash_clist[] = { &rehash_msgtab, NULL }; -DECLARE_MODULE_AV1(rehash, NULL, NULL, rehash_clist, NULL, NULL, "$Revision: 3161 $"); + +DECLARE_MODULE_AV2(rehash, NULL, NULL, rehash_clist, NULL, NULL, NULL, NULL, rehash_desc); struct hash_commands { @@ -67,18 +69,37 @@ rehash_bans_loc(struct Client *source_p) { sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is rehashing bans", get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; - rehash_bans(0); + rehash_bans(); } static void rehash_dns(struct Client *source_p) { - sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is rehashing DNS", + sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is rehashing DNS", get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; - /* reread /etc/resolv.conf and reopen res socket */ - restart_resolver(); + reload_nameservers(); +} + +static void +rehash_ssld(struct Client *source_p) +{ + if (!IsOperAdmin(source_p)) + { + sendto_one(source_p, form_str(ERR_NOPRIVS), + me.name, source_p->name, "admin"); + return; + } + + sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is restarting ssld", + get_oper_name(source_p)); + + restart_ssld(); } static void @@ -87,6 +108,8 @@ rehash_motd(struct Client *source_p) sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is forcing re-reading of MOTD file", get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; cache_user_motd(); } @@ -97,9 +120,11 @@ rehash_omotd(struct Client *source_p) sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is forcing re-reading of OPER MOTD file", get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; free_cachefile(oper_motd); - oper_motd = cache_file(OPATH, "opers.motd", 0); + oper_motd = cache_file(ircd_paths[IRCD_PATH_IRCD_OMOTD], "opers.motd", 0); } static void @@ -111,6 +136,8 @@ rehash_tklines(struct Client *source_p) sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing temp klines", get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; for(i = 0; i < LAST_TEMP_TYPE; i++) { @@ -133,6 +160,8 @@ rehash_tdlines(struct Client *source_p) sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing temp dlines", get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; for(i = 0; i < LAST_TEMP_TYPE; i++) { @@ -155,12 +184,14 @@ rehash_txlines(struct Client *source_p) sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing temp xlines", get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; RB_DLINK_FOREACH_SAFE(ptr, next_ptr, xline_conf_list.head) { aconf = ptr->data; - if(!aconf->hold) + if(!aconf->hold || aconf->lifetime) continue; free_conf(aconf); @@ -172,30 +203,29 @@ static void rehash_tresvs(struct Client *source_p) { struct ConfItem *aconf; + rb_radixtree_iteration_state iter; rb_dlink_node *ptr; rb_dlink_node *next_ptr; - int i; sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing temp resvs", get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; - HASH_WALK_SAFE(i, R_MAX, ptr, next_ptr, resvTable) + RB_RADIXTREE_FOREACH(aconf, &iter, resv_tree) { - aconf = ptr->data; - - if(!aconf->hold) + if(!aconf->hold || aconf->lifetime) continue; + rb_radixtree_delete(resv_tree, aconf->host); free_conf(aconf); - rb_dlinkDestroy(ptr, &resvTable[i]); } - HASH_WALK_END RB_DLINK_FOREACH_SAFE(ptr, next_ptr, resv_conf_list.head) { aconf = ptr->data; - if(!aconf->hold) + if(!aconf->hold || aconf->lifetime) continue; free_conf(aconf); @@ -208,16 +238,31 @@ rehash_rejectcache(struct Client *source_p) { sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing reject cache", get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; flush_reject(); } +static void +rehash_throttles(struct Client *source_p) +{ + sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing throttles", + get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; + flush_throttle(); + +} + static void rehash_help(struct Client *source_p) { sendto_realops_snomask(SNO_GENERAL, L_ALL, - "%s is forcing re-reading of HELP files", + "%s is forcing re-reading of HELP files", get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; load_help(); } @@ -231,11 +276,13 @@ rehash_nickdelay(struct Client *source_p) sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is clearing the nick delay table", get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; RB_DLINK_FOREACH_SAFE(ptr, safe_ptr, nd_list.head) { nd = ptr->data; - + free_nd_entry(nd); } } @@ -245,6 +292,7 @@ static struct hash_commands rehash_commands[] = { {"BANS", rehash_bans_loc }, {"DNS", rehash_dns }, + {"SSLD", rehash_ssld }, {"MOTD", rehash_motd }, {"OMOTD", rehash_omotd }, {"TKLINES", rehash_tklines }, @@ -252,6 +300,7 @@ static struct hash_commands rehash_commands[] = {"TXLINES", rehash_txlines }, {"TRESVS", rehash_tresvs }, {"REJECTCACHE", rehash_rejectcache }, + {"THROTTLES", rehash_throttles }, {"HELP", rehash_help }, {"NICKDELAY", rehash_nickdelay }, {NULL, NULL } @@ -273,9 +322,10 @@ do_rehash(struct Client *source_p, const char *type) { sendto_one(source_p, form_str(RPL_REHASHING), me.name, source_p->name, rehash_commands[x].cmd); - rehash_commands[x].handler(source_p); ilog(L_MAIN, "REHASH %s From %s[%s]", type, get_oper_name(source_p), source_p->sockhost); + rehash_commands[x].handler(source_p); + remote_rehash_oper_p = NULL; return; } } @@ -296,9 +346,12 @@ do_rehash(struct Client *source_p, const char *type) ConfigFileEntry.configfile); sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s is rehashing server config file", get_oper_name(source_p)); + if (!MyConnect(source_p)) + remote_rehash_oper_p = source_p; ilog(L_MAIN, "REHASH From %s[%s]", get_oper_name(source_p), source_p->sockhost); - rehash(0); + rehash(false); + remote_rehash_oper_p = NULL; } } @@ -308,8 +361,8 @@ do_rehash(struct Client *source_p, const char *type) * parv[1] = rehash type or destination * parv[2] = destination */ -static int -mo_rehash(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +static void +mo_rehash(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { const char *type = NULL, *target_server = NULL; @@ -317,7 +370,7 @@ mo_rehash(struct Client *client_p, struct Client *source_p, int parc, const char { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "rehash"); - return 0; + return; } if (parc > 2) @@ -335,33 +388,25 @@ mo_rehash(struct Client *client_p, struct Client *source_p, int parc, const char { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "remoteban"); - return 0; + return; } sendto_match_servs(source_p, target_server, CAP_ENCAP, NOCAPS, "ENCAP %s REHASH %s", target_server, type != NULL ? type : ""); if (match(target_server, me.name) == 0) - return 0; + return; } do_rehash(source_p, type); - - return 0; } -static int -me_rehash(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +static void +me_rehash(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { if (!IsPerson(source_p)) - return 0; - - if (!find_shared_conf(source_p->username, source_p->host, - source_p->servptr->name, SHARED_REHASH)) - return 0; + return; do_rehash(source_p, parc > 1 ? parv[1] : NULL); - - return 0; }