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; }
static void do_list(struct Client *source_p, char *arg) { struct ListTask *lt = NULL; int no_masked_channels = 1; if (source_p->connection->list_task) { free_list_task(source_p); sendto_one_numeric(source_p, &me, RPL_LISTEND); return; } lt = MyCalloc(sizeof(struct ListTask)); lt->users_max = UINT_MAX; lt->created_max = UINT_MAX; lt->topicts_max = UINT_MAX; source_p->connection->list_task = lt; if (!EmptyString(arg)) { char *opt, *save = NULL; dlink_list *list = NULL; int i = 0, errors = 0; for (opt = strtoken(&save, arg, ","); opt; opt = strtoken(&save, NULL, ",")) { switch (*opt) { case '<': if ((i = atoi(opt + 1)) > 0) lt->users_max = (unsigned int)i - 1; else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->users_min = (unsigned int)i + 1; else errors = 1; break; case 'C': case 'c': switch (*++opt) { case '<': if ((i = atoi(opt + 1)) >= 0) lt->created_max = (unsigned int)(CurrentTime - 60 * i); else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->created_min = (unsigned int)(CurrentTime - 60 * i); else errors = 1; break; default: errors = 1; } break; case 'T': case 't': switch (*++opt) { case '<': if ((i = atoi(opt + 1)) >= 0) lt->topicts_min = (unsigned int)(CurrentTime - 60 * i); else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->topicts_max = (unsigned int)(CurrentTime - 60 * i); else errors = 1; break; case ':': if (strlcpy(lt->topic, opt + 1, sizeof(lt->topic)) == 0) errors = 1; break; default: errors = 1; } break; default: if (*opt == '!') { list = <->hide_mask; opt++; } else list = <->show_mask; if (has_wildcards(opt + !!IsChanPrefix(*opt))) { if (list == <->show_mask) no_masked_channels = 0; } else if (!IsChanPrefix(*opt)) errors = 1; if (!errors) dlinkAdd(xstrdup(opt), make_dlink_node(), list); } } if (errors) { free_list_task(source_p); sendto_one_numeric(source_p, &me, ERR_LISTSYNTAX); return; } } dlinkAdd(source_p, <->node, &listing_client_list); sendto_one_numeric(source_p, &me, RPL_LISTSTART); safe_list_channels(source_p, no_masked_channels && lt->show_mask.head != NULL); }
static void do_list(struct Client *source_p, int parc, char *parv[]) { struct ListTask *lt; int no_masked_channels; if (MyConnect(source_p)) { if (source_p->localClient->list_task != NULL) { free_list_task(source_p->localClient->list_task, source_p); sendto_one(source_p, form_str(RPL_LISTEND), me.name, source_p->name); return; } } lt = (struct ListTask *) MyMalloc(sizeof(struct ListTask)); lt->users_max = UINT_MAX; lt->created_max = UINT_MAX; lt->topicts_max = UINT_MAX; if (MyConnect(source_p)) source_p->localClient->list_task = lt; no_masked_channels = 1; if (parc > 1) { char *opt, *save; dlink_list *list; int i, errors = 0; for (opt = strtoken(&save, parv[1], ","); opt != NULL; opt = strtoken(&save, NULL, ",")) switch (*opt) { case '<': if ((i = atoi(opt + 1)) > 0) lt->users_max = (unsigned int) i - 1; else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->users_min = (unsigned int) i + 1; else errors = 1; break; case '-': break; case 'C': case 'c': switch (*++opt) { case '<': if ((i = atoi(opt + 1)) >= 0) lt->created_max = (unsigned int) (CurrentTime - 60 * i); else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->created_min = (unsigned int) (CurrentTime - 60 * i); else errors = 1; break; default: errors = 1; } break; case 'T': case 't': switch (*++opt) { case '<': if ((i = atoi(opt + 1)) >= 0) lt->topicts_min = (unsigned int) (CurrentTime - 60 * i); else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->topicts_max = (unsigned int) (CurrentTime - 60 * i); else errors = 1; break; default: errors = 1; } break; default: if (*opt == '!') { list = <->hide_mask; opt++; } else list = <->show_mask; if (has_wildcards(opt + !!IsChanPrefix(*opt))) { if (list == <->show_mask) no_masked_channels = 0; } else if (!IsChanPrefix(*opt)) errors = 1; if (!errors) { char *s; DupString(s, opt); dlinkAdd(s, make_dlink_node(), list); } } if (errors) { free_list_task(lt, source_p); sendto_one(source_p, form_str(ERR_LISTSYNTAX), MyConnect(source_p) ? me.name : ID(&me), MyConnect(source_p) ? source_p->name : ID(source_p)); return; } } if (MyConnect(source_p)) dlinkAdd(source_p, make_dlink_node(), &listing_client_list); sendto_one(source_p, form_str(RPL_LISTSTART), MyConnect(source_p) ? me.name : ID(&me), MyConnect(source_p) ? source_p->name : ID(source_p)); safe_list_channels(source_p, lt, no_masked_channels && lt->show_mask.head != NULL, !MyConnect(source_p)); }