]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/ircd.c
Remove ^M on line endings.
[irc/rqf/shadowircd.git] / src / ircd.c
index 5d6e284b570b5d65b2fa394cc1df63449e8fb44e..25dec90c0c8e8146e8ffd1757b5719b39f01cc96 100644 (file)
  *  $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"
 #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;
 }