/* * mo_rehash - oper message handler * * parv[1] = 'm' flushes the MOTD cache and returns * parv[1] = 'l' reopens the log files and returns * parv[1] = 'q' to not rehash the resolver (optional) */ int mo_rehash(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { int flag = 0; if (!HasPriv(sptr, PRIV_REHASH)) return send_reply(sptr, ERR_NOPRIVILEGES); if (parc > 1) { /* special processing */ if (*parv[1] == 'm') { send_reply(sptr, SND_EXPLICIT | RPL_REHASHING, ":Flushing MOTD cache"); motd_recache(); /* flush MOTD cache */ return 0; } else if (*parv[1] == 'l') { send_reply(sptr, SND_EXPLICIT | RPL_REHASHING, ":Reopening log files"); log_reopen(); /* reopen log files */ return 0; } else if (*parv[1] == 'q') flag = 2; } send_reply(sptr, RPL_REHASHING, configfile); sendto_opmask_butone(0, SNO_OLDSNO, "%C is rehashing Server config file", sptr); log_write(LS_SYSTEM, L_INFO, 0, "REHASH From %#C", sptr); return rehash(cptr, flag); }
/* * mo_rehash - oper message handler * * parv[1] = 'm' flushes the MOTD cache and returns * parv[1] = 'l' reopens the log files and returns * parv[1] = 'q' to not rehash the resolver (optional) * parv[1] = 's' to reload SSL certificates * parv[1] = 'a' to restart the IAuth program */ int mo_rehash(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { int flag = 0; if (!HasPriv(sptr, PRIV_REHASH) || ((parc == 3) && !HasPriv(sptr, PRIV_REMOTEREHASH))) return send_reply(sptr, ERR_NOPRIVILEGES); if ((parc == 3) && (hunt_server_cmd(sptr, CMD_REHASH, cptr, 1, "%s %C", 2, parc, parv) != HUNTED_ISME)) return 0; if (parc == 2) { /* special processing */ if (parv[1][1] == '\0') { /* one character server name */ if (*parv[1] == 'm') { send_reply(sptr, SND_EXPLICIT | RPL_REHASHING, ":Flushing MOTD cache"); motd_recache(); /* flush MOTD cache */ return 0; } else if (*parv[1] == 'l') { send_reply(sptr, SND_EXPLICIT | RPL_REHASHING, ":Reopening log files"); log_reopen(); /* reopen log files */ return 0; } else if (*parv[1] == 'a') { send_reply(sptr, SND_EXPLICIT | RPL_REHASHING, ":Restarting IAuth"); auth_restart(); /* Restart IAuth program */ return 0; #ifdef USE_SSL } else if (*parv[1] == 's') { send_reply(sptr, SND_EXPLICIT | RPL_REHASHING, ":Reloading SSL certificates"); ssl_reinit(); return 0; #endif } else if (*parv[1] == 'q') flag = 2; } /* * Maybe the user wants to rehash another server with no parameters. * NOTE: Here we assume that there are no servers named * 'm', 'l', 's', or 'q'. */ else if (HasPriv(sptr, PRIV_REMOTEREHASH)) { if (hunt_server_cmd(sptr, CMD_REHASH, cptr, 1, "%C", 1, parc, parv) != HUNTED_ISME) return 0; } else return send_reply(sptr, ERR_NOPRIVILEGES); } send_reply(sptr, RPL_REHASHING, configfile); sendto_opmask_butone(0, SNO_OLDSNO, "%C is rehashing Server config file", sptr); log_write(LS_SYSTEM, L_INFO, 0, "REHASH From %#C", sptr); return rehash(cptr, flag); }
/*! \brief REHASH MOTD handler * Attempts to recache server's MOTD file(s) * \param source_p Pointer to client issuing the command */ static void rehash_motd(struct Client *source_p) { sendto_one_numeric(source_p, &me, RPL_REHASHING, "MOTD"); sendto_realops_flags(UMODE_SERVNOTICE, L_ALL, SEND_NOTICE, "%s is forcing re-reading of MOTD files", get_oper_name(source_p)); ilog(LOG_TYPE_IRCD, "REHASH MOTD from %s", get_oper_name(source_p)); motd_recache(); }
/*! \brief REHASH command handler * * \param source_p Pointer to allocated Client struct from which the message * originally comes from. This can be a local or remote client. * \param parc Integer holding the number of supplied arguments. * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL * pointers. * \note Valid arguments for this command are: * - parv[0] = command * - parv[1] = additional option */ static int mo_rehash(struct Client *source_p, int parc, char *parv[]) { int found = 0; const char *const option = parv[1]; if (!HasOFlag(source_p, OPER_FLAG_REHASH)) { sendto_one_numeric(source_p, &me, ERR_NOPRIVS, "rehash"); return 0; } if (!EmptyString(option)) { if (!irccmp(option, "DNS")) { sendto_one_numeric(source_p, &me, RPL_REHASHING, "DNS"); sendto_realops_flags(UMODE_SERVNOTICE, L_ALL, SEND_NOTICE, "%s is rehashing DNS", get_oper_name(source_p)); restart_resolver(); found = 1; } else if (!irccmp(option, "MOTD")) { sendto_realops_flags(UMODE_SERVNOTICE, L_ALL, SEND_NOTICE, "%s is forcing re-reading of MOTD files", get_oper_name(source_p)); motd_recache(); found = 1; } if (found) ilog(LOG_TYPE_IRCD, "REHASH %s From %s", option, get_oper_name(source_p)); else sendto_one_notice(source_p, &me, ":%s is not a valid option. " "Choose from DNS, MOTD", option); } else { sendto_one_numeric(source_p, &me, RPL_REHASHING, ConfigGeneral.configfile); sendto_realops_flags(UMODE_SERVNOTICE, L_ALL, SEND_NOTICE, "%s is rehashing configuration file(s)", get_oper_name(source_p)); ilog(LOG_TYPE_IRCD, "REHASH From %s", get_oper_name(source_p)); conf_rehash(0); } return 0; }
int ms_rehash(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { int flag = 0; if ((parc > 2) && (hunt_server_cmd(sptr, CMD_REHASH, cptr, 1, "%s %C", 2, parc, parv) != HUNTED_ISME)) return 0; /* OK, the message has been forwarded, but before we can act... */ if (!feature_bool(FEAT_NETWORK_REHASH)) return 0; if (parc > 1) { /* special processing */ if (parv[1][1] == '\0') { /* one character server name */ if (*parv[1] == 'm') { send_reply(sptr, SND_EXPLICIT | RPL_REHASHING, ":Flushing MOTD cache"); motd_recache(); /* flush MOTD cache */ return 0; } else if (*parv[1] == 'l') { send_reply(sptr, SND_EXPLICIT | RPL_REHASHING, ":Reopening log files"); log_reopen(); /* reopen log files */ return 0; } else if (*parv[1] == 'a') { send_reply(sptr, SND_EXPLICIT | RPL_REHASHING, ":Restarting IAuth"); auth_restart(); /* Restart IAuth program */ return 0; #ifdef USE_SSL } else if (*parv[1] == 's') { send_reply(sptr, SND_EXPLICIT | RPL_REHASHING, ":Reloading SSL certificates"); ssl_reinit(); return 0; #endif } else if (*parv[1] == 'q') flag = 2; } /* * Maybe the user wants to rehash another server with no parameters. * NOTE: Here we assume that there are no servers named * 'm', 'l', 's', or 'q'. */ else if ((parc == 2) && (hunt_server_cmd(sptr, CMD_REHASH, cptr, 1, "%C", 1, parc, parv) != HUNTED_ISME)) return 0; } send_reply(sptr, RPL_REHASHING, configfile); sendto_opmask_butone(0, SNO_OLDSNO, "%C [%s] is remotely rehashing Server config file", sptr, cli_name(cli_user(sptr)->server)); log_write(LS_SYSTEM, L_INFO, 0, "Remote REHASH From %#C [%s]", sptr, cli_name(cli_user(sptr)->server)); return rehash(cptr, flag); }
void set_time(void) { struct timeval newtime = { .tv_sec = 0, .tv_usec = 0 }; if (gettimeofday(&newtime, NULL) == -1) { ilog(LOG_TYPE_IRCD, "Clock Failure (%s), TS can be corrupted", strerror(errno)); sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE, "Clock Failure (%s), TS can be corrupted", strerror(errno)); server_die("Clock Failure", 1); } if (newtime.tv_sec < CurrentTime) { ilog(LOG_TYPE_IRCD, "System clock is running backwards - (%lu < %lu)", (unsigned long)newtime.tv_sec, (unsigned long)CurrentTime); sendto_realops_flags(UMODE_DEBUG, L_ALL, SEND_NOTICE, "System clock is running backwards - (%lu < %lu)", (unsigned long)newtime.tv_sec, (unsigned long)CurrentTime); set_back_events(CurrentTime - newtime.tv_sec); } SystemTime.tv_sec = newtime.tv_sec; SystemTime.tv_usec = newtime.tv_usec; } static void io_loop(void) { while (1) { if (listing_client_list.head) { dlink_node *node = NULL, *node_next = NULL; DLINK_FOREACH_SAFE(node, node_next, listing_client_list.head) safe_list_channels(node->data, 0); } /* Run pending events */ event_run(); comm_select(); exit_aborted_clients(); free_exited_clients(); /* Check to see whether we have to rehash the configuration .. */ if (dorehash) { conf_rehash(1); dorehash = 0; } if (doremotd) { motd_recache(); sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE, "Got signal SIGUSR1, reloading motd file(s)"); doremotd = 0; } } } /* initalialize_global_set_options() * * inputs - none * output - none * side effects - This sets all global set options needed */ static void initialize_global_set_options(void) { GlobalSetOptions.maxclients = ConfigServerInfo.default_max_clients; GlobalSetOptions.autoconn = 1; GlobalSetOptions.spam_time = MIN_JOIN_LEAVE_TIME; GlobalSetOptions.spam_num = MAX_JOIN_LEAVE_COUNT; GlobalSetOptions.floodcount = ConfigGeneral.default_floodcount; GlobalSetOptions.joinfloodcount = ConfigChannel.default_join_flood_count; GlobalSetOptions.joinfloodtime = ConfigChannel.default_join_flood_time; split_servers = ConfigChannel.default_split_server_count; split_users = ConfigChannel.default_split_user_count; if (split_users && split_servers && (ConfigChannel.no_create_on_split || ConfigChannel.no_join_on_split)) { splitmode = 1; splitchecking = 1; } GlobalSetOptions.ident_timeout = IDENT_TIMEOUT; }