X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/21c9d815d7293b2fa7e531e8f9f69db2e3399554..b717a466d06010bfd93e5a71c734c6461733cf69:/src/ircd.c diff --git a/src/ircd.c b/src/ircd.c index 5d6e284..25dec90 100644 --- a/src/ircd.c +++ b/src/ircd.c @@ -24,10 +24,10 @@ * $Id: ircd.c 3380 2007-04-03 22:25:11Z jilles $ */ +#include "ratbox_lib.h" #include "stdinc.h" #include "setup.h" #include "config.h" - #include "ircd.h" #include "channel.h" #include "class.h" @@ -37,7 +37,6 @@ #include "irc_string.h" #include "ircd_signal.h" #include "sprintf_irc.h" -#include "s_gline.h" #include "msg.h" /* msgtab */ #include "hostmask.h" #include "numeric.h" @@ -46,7 +45,7 @@ #include "restart.h" #include "s_auth.h" #include "s_conf.h" -#include "s_log.h" +#include "logger.h" #include "s_serv.h" /* try_connections */ #include "s_user.h" #include "s_stats.h" @@ -65,20 +64,82 @@ #include "monitor.h" #include "patchlevel.h" #include "serno.h" +#include "sslproc.h" -#include "ratbox_lib.h" +/* /quote set variables */ +struct SetOptions GlobalSetOptions; -/* - * Try and find the correct name to use with getrlimit() for setting the max. - * number of files allowed to be open by this process. - */ -int _charybdis_data_version = CHARYBDIS_DV; +/* configuration set from ircd.conf */ +struct config_file_entry ConfigFileEntry; +/* server info set from ircd.conf */ +struct server_info ServerInfo; +/* admin info set from ircd.conf */ +struct admin_info AdminInfo; + +struct Counter Count; +struct ServerStatistics ServerStats; + +int maxconnections; +struct timeval SystemTime; +struct Client me; /* That's me */ +struct LocalUser meLocalUser; /* That's also part of me */ + +rb_dlink_list lclient_list = { NULL, NULL, 0 }; +rb_dlink_list global_client_list = { NULL, NULL, 0 }; +rb_dlink_list global_channel_list = { NULL, NULL, 0 }; + +rb_dlink_list unknown_list; /* unknown clients ON this server only */ +rb_dlink_list serv_list; /* local servers to this server ONLY */ +rb_dlink_list global_serv_list; /* global servers on the network */ +rb_dlink_list local_oper_list; /* our opers, duplicated in lclient_list */ +rb_dlink_list oper_list; /* network opers */ + +time_t startup_time; + +int default_server_capabs = CAP_MASK; + +int splitmode; +int splitchecking; +int split_users; +int split_servers; +int eob_count; + +unsigned long initialVMTop = 0; /* top of virtual memory at init */ +const char *logFileName = LPATH; +const char *pidFileName = PPATH; + +char **myargv; +int dorehash = 0; +int dorehashbans = 0; +int doremotd = 0; +int kline_queued = 0; +int server_state_foreground = 0; +int opers_see_all_users = 0; +int ssl_ok = 0; +int zlib_ok = 1; -extern int ServerRunning; -extern struct LocalUser meLocalUser; -extern char **myargv; +int testing_conf = 0; -extern int maxconnections; /* XXX */ +struct config_channel_entry ConfigChannel; +rb_bh *channel_heap; +rb_bh *ban_heap; +rb_bh *topic_heap; +rb_bh *member_heap; + +rb_bh *client_heap = NULL; +rb_bh *lclient_heap = NULL; +rb_bh *pclient_heap = NULL; + +char current_uid[IDLEN]; + +/* patricia */ +rb_bh *prefix_heap; +rb_bh *node_heap; +rb_bh *patricia_heap; + +rb_bh *linebuf_heap; + +rb_bh *dnode_heap; /* * print_startup - print startup information @@ -124,9 +185,12 @@ ircd_restart_cb(const char *str) static void ircd_die_cb(const char *str) { - /* Try to get the message out to currently logged in operators. */ - sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Server panic! %s", str); - inotice("server panic: %s", str); + if(str != NULL) + { + /* Try to get the message out to currently logged in operators. */ + sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "Server panic! %s", str); + inotice("server panic: %s", str); + } unlink(pidFileName); exit(EXIT_FAILURE); @@ -147,14 +211,17 @@ init_sys(void) if(!getrlimit(RLIMIT_NOFILE, &limit)) { - limit.rlim_cur = limit.rlim_max; /* make soft limit the max */ - if(setrlimit(RLIMIT_NOFILE, &limit) == -1) + maxconnections = limit.rlim_cur; + if(maxconnections <= MAX_BUFFER) { - fprintf(stderr, "error setting max fd's to %ld\n", (long) limit.rlim_cur); + fprintf(stderr, "ERROR: Shell FD limits are too low.\n"); + fprintf(stderr, "ERROR: ircd-ratbox reserves %d FDs, shell limits must be above this\n", MAX_BUFFER); exit(EXIT_FAILURE); } + return; } -#endif /* RLIMIT_NOFILE */ +#endif /* RLIMIT_FD_MAX */ + maxconnections = MAXCONNECTIONS; } static int @@ -225,32 +292,6 @@ struct lgetopt myopts[] = { {NULL, NULL, STRING, NULL}, }; -void -set_time(void) -{ - struct timeval newtime; - newtime.tv_sec = 0; - newtime.tv_usec = 0; -#ifdef HAVE_GETTIMEOFDAY - if(gettimeofday(&newtime, NULL) == -1) - { - ilog(L_MAIN, "Clock Failure (%d)", errno); - sendto_realops_snomask(SNO_GENERAL, L_ALL, - "Clock Failure (%d), TS can be corrupted", errno); - - restart("Clock Failure"); - } -#else - newtime.tv_sec = time(NULL); - -#endif - if(newtime.tv_sec < rb_current_time()) - rb_set_back_events(rb_current_time() - newtime.tv_sec); - - SystemTime.tv_sec = newtime.tv_sec; - SystemTime.tv_usec = newtime.tv_usec; -} - static void check_rehash(void *unused) { @@ -279,26 +320,6 @@ check_rehash(void *unused) } } -void -charybdis_io_loop(void) -{ - time_t delay; - - while (ServerRunning) - { - /* Run pending events, then get the number of seconds to the next - * event - */ - - delay = rb_event_next(); - if(delay <= rb_current_time()) - rb_event_run(); - - - rb_select(250); - } -} - /* * initalialize_global_set_options * @@ -312,7 +333,11 @@ initialize_global_set_options(void) memset(&GlobalSetOptions, 0, sizeof(GlobalSetOptions)); /* memset( &ConfigFileEntry, 0, sizeof(ConfigFileEntry)); */ - GlobalSetOptions.maxclients = ServerInfo.max_clients; + GlobalSetOptions.maxclients = ServerInfo.default_max_clients; + + if(GlobalSetOptions.maxclients > (maxconnections - MAX_BUFFER) || (GlobalSetOptions.maxclients <= 0)) + GlobalSetOptions.maxclients = maxconnections - MAX_BUFFER; + GlobalSetOptions.autoconn = 1; GlobalSetOptions.spam_time = MIN_JOIN_LEAVE_TIME; @@ -470,16 +495,11 @@ main(int argc, char *argv[]) return -1; } - /* - * save server boot time right away, so getrusage works correctly - */ - set_time(); /* * Setup corefile size immediately after boot -kre */ setup_corefile(); - ServerRunning = 0; /* It ain't random, but it ought to be a little harder to guess */ srand(SystemTime.tv_sec ^ (SystemTime.tv_usec | (getpid() << 20))); memset(&me, 0, sizeof(me)); @@ -496,9 +516,10 @@ main(int argc, char *argv[]) rb_dlinkAddTail(&me, &me.node, &global_client_list); - memset((void *) &Count, 0, sizeof(Count)); - memset((void *) &ServerInfo, 0, sizeof(ServerInfo)); - memset((void *) &AdminInfo, 0, sizeof(AdminInfo)); + memset(&Count, 0, sizeof(Count)); + memset(&ServerInfo, 0, sizeof(ServerInfo)); + memset(&AdminInfo, 0, sizeof(AdminInfo)); + memset(&ServerStats, 0, sizeof(struct ServerStatistics)); /* Initialise the channel capability usage counts... */ init_chcap_usage_counts(); @@ -559,6 +580,7 @@ main(int argc, char *argv[]) /* Init the event subsystem */ init_sys(); rb_lib_init(ircd_log_cb, ircd_restart_cb, ircd_die_cb, !server_state_foreground, maxconnections, DNODE_HEAP_SIZE, FD_HEAP_SIZE); + rb_linebuf_init(LINEBUF_HEAP_SIZE); init_main_logfile(); newconf_init(); @@ -574,7 +596,6 @@ main(int argc, char *argv[]) init_channels(); initclass(); initwhowas(); - init_stats(); init_reject(); init_cache(); init_monitor(); @@ -596,6 +617,8 @@ main(int argc, char *argv[]) mod_add_path(MODULE_DIR "/autoload"); #endif + init_ssld(); + initialize_server_capabs(); /* Set up default_server_capabs */ initialize_global_set_options(); @@ -622,6 +645,18 @@ main(int argc, char *argv[]) } strlcpy(me.info, ServerInfo.description, sizeof(me.info)); + if(ServerInfo.ssl_cert != NULL && ServerInfo.ssl_private_key != NULL) + { + /* just do the rb_setup_ssl_server to validate the config */ + if(!rb_setup_ssl_server(ServerInfo.ssl_cert, ServerInfo.ssl_private_key, ServerInfo.ssl_dh_params)) + { + ilog(L_MAIN, "WARNING: Unable to setup SSL."); + ssl_ok = 0; + } + else + ssl_ok = 1; + } + if (testing_conf) { fprintf(stderr, "\nConfig testing complete.\n"); @@ -649,8 +684,6 @@ main(int argc, char *argv[]) ilog(L_MAIN, "Server Ready"); - rb_event_addish("cleanup_glines", cleanup_glines, NULL, CLEANUP_GLINES_TIME); - /* We want try_connections to be called as soon as possible now! -- adrian */ /* No, 'cause after a restart it would cause all sorts of nick collides */ /* um. by waiting even longer, that just means we have even *more* @@ -659,8 +692,6 @@ main(int argc, char *argv[]) rb_event_addish("try_connections", try_connections, NULL, STARTUP_CONNECTIONS_TIME); rb_event_addonce("try_connections_startup", try_connections, NULL, 0); - rb_event_addish("collect_zipstats", collect_zipstats, NULL, ZIPSTATS_TIME); - /* Setup the timeout check. I'll shift it later :) -- adrian */ rb_event_addish("rb_checktimeouts", rb_checktimeouts, NULL, 1); @@ -669,11 +700,9 @@ main(int argc, char *argv[]) if(splitmode) check_splitmode_ev = rb_event_add("check_splitmode", check_splitmode, NULL, 2); - ServerRunning = 1; - print_startup(getpid()); - charybdis_io_loop(); + rb_lib_loop(0); return 0; }