/*! \brief RESTART 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] = server name */ static int mo_restart(struct Client *source_p, int parc, char *parv[]) { char buf[IRCD_BUFSIZE] = ""; const char *const name = parv[1]; if (!HasOFlag(source_p, OPER_FLAG_RESTART)) { sendto_one_numeric(source_p, &me, ERR_NOPRIVS, "restart"); return 0; } if (EmptyString(name)) { sendto_one_notice(source_p, &me, ":Need server name /restart %s", me.name); return 0; } if (irccmp(name, me.name)) { sendto_one_notice(source_p, &me, ":Mismatch on /restart %s", me.name); return 0; } snprintf(buf, sizeof(buf), "received RESTART command from %s", get_client_name(source_p, HIDE_IP)); server_die(buf, 1); return 0; }
/*! \brief DIE 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] = server name */ static int mo_die(struct Client *source_p, int parc, char *parv[]) { char buf[IRCD_BUFSIZE] = ""; if (!HasOFlag(source_p, OPER_FLAG_DIE)) { sendto_one_numeric(source_p, &me, ERR_NOPRIVS, "die"); return 0; } if (parc < 2 || EmptyString(parv[1])) { sendto_one_notice(source_p, &me, ":Need server name /die %s", me.name); return 0; } if (irccmp(parv[1], me.name)) { sendto_one_notice(source_p, &me, ":Mismatch on /die %s", me.name); return 0; } snprintf(buf, sizeof(buf), "received DIE command from %s", get_client_name(source_p, HIDE_IP)); server_die(buf, 0); return 0; }
/* * mo_restart * */ static void mo_restart(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { char buf[IRCD_BUFSIZE]; if (!IsOperDie(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "restart"); return; } if (EmptyString(parv[1])) { sendto_one(source_p, ":%s NOTICE %s :Need server name /restart %s", me.name, source_p->name, me.name); return; } if (irccmp(parv[1], me.name)) { sendto_one(source_p, ":%s NOTICE %s :Mismatch on /restart %s", me.name, source_p->name, me.name); return; } ircsprintf(buf, "received RESTART command from %s", get_oper_name(source_p)); server_die(buf, YES); }
static void sigterm_callback(struct Event* ev) { assert(0 != ev_signal(ev)); assert(ET_SIGNAL == ev_type(ev)); assert(SIGTERM == sig_signal(ev_signal(ev))); assert(SIGTERM == ev_data(ev)); server_die("received signal SIGTERM"); }
/* Kills the bot. s1 is the reason shown to other bots, * s2 the reason shown on the partyline. (Sup 25Jul2001) */ void kill_bot(char *s1, char *s2) { write_userfile(-1); if (!conf.bot->hub) server_die(); chatout("*** %s\n", s1); botnet_send_chat(-1, conf.bot->nick, s1); botnet_send_bye(s2); fatal(s2, 0); }
/* outofmemory() * * input - NONE * output - NONE * side effects - simply try to report there is a problem. * Abort if it was called more than once */ void outofmemory(void) { static int was_here = 0; if (was_here++) abort(); server_die("out of memory", SERVER_RESTART); }
/* outofmemory() * * input - NONE * output - NONE * side effects - simply try to report there is a problem. * Abort if it was called more than once */ void outofmemory(void) { static bool was_here = false; if (was_here == false) was_here = true; else abort(); server_die("out of memory", true); }
/* * Waits until a message is posted in our window queue and deals with it. */ void comm_select(void) { MSG msg; if (!GetMessage(&msg, NULL, 0, 0)) server_die("WM_QUIT received", NO); set_time(); DispatchMessage(&msg); }
/* * sigint_handler - restart the server */ static void sigint_handler(int sig) { server_die("received signal SIGINT", server_state.foreground ? SERVER_SHUTDOWN : SERVER_RESTART); }
/* * sigterm_handler - exit the server */ static void sigterm_handler(int sig) { server_die("received signal SIGTERM", SERVER_SHUTDOWN); }
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; }
/* * sigint_handler - restart the server */ static void sigint_handler(int sig) { server_die("SIGINT received", !server_state.foreground); }
/* * sigterm_handler - exit the server */ static void sigterm_handler(int sig) { server_die("received signal SIGTERM", 0); }