]> jfr.im git - irc/rqf/shadowircd.git/blobdiff - src/ircd.c
Show reason for failed outgoing SSL handshakes to opers.
[irc/rqf/shadowircd.git] / src / ircd.c
index 7094d0779c0f7696b7fa7baecdd6f0d5123a39f5..a3b5f825b4cfd162ee01c99bff6a6bd5e0123cfa 100644 (file)
@@ -34,9 +34,8 @@
 #include "client.h"
 #include "common.h"
 #include "hash.h"
-#include "irc_string.h"
+#include "match.h"
 #include "ircd_signal.h"
-#include "sprintf_irc.h"
 #include "msg.h"               /* msgtab */
 #include "hostmask.h"
 #include "numeric.h"
@@ -65,6 +64,7 @@
 #include "patchlevel.h"
 #include "serno.h"
 #include "sslproc.h"
+#include "chmode.h"
 
 /* /quote set variables */
 struct SetOptions GlobalSetOptions;
@@ -80,15 +80,14 @@ 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 global_client_list;
 
+/* unknown/client pointer lists */
 rb_dlink_list unknown_list;        /* unknown clients ON this server only */
+rb_dlink_list lclient_list;    /* local clients only ON this server */
 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 */
@@ -120,18 +119,6 @@ int zlib_ok = 1;
 
 int testing_conf = 0;
 
-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;
@@ -388,10 +375,10 @@ initialize_global_set_options(void)
 
        GlobalSetOptions.ident_timeout = IDENT_TIMEOUT;
 
-       strlcpy(GlobalSetOptions.operstring,
+       rb_strlcpy(GlobalSetOptions.operstring,
                ConfigFileEntry.default_operstring,
                sizeof(GlobalSetOptions.operstring));
-       strlcpy(GlobalSetOptions.adminstring,
+       rb_strlcpy(GlobalSetOptions.adminstring,
                ConfigFileEntry.default_adminstring,
                sizeof(GlobalSetOptions.adminstring));
 
@@ -502,6 +489,47 @@ setup_corefile(void)
 
 struct ev_entry *check_splitmode_ev = NULL;
 
+static int
+seed_with_urandom(void)
+{
+       unsigned int seed;
+       int fd;
+
+       fd = open("/dev/urandom", O_RDONLY);
+       if(fd >= 0)
+       {
+               if(read(fd, &seed, sizeof(seed)) == sizeof(seed))
+               {
+                       close(fd);
+                       srand(seed);
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+static void
+seed_with_clock(void)
+{
+       const struct timeval *tv;       
+       rb_set_time();
+       tv = rb_current_time_tv();
+       srand(tv->tv_sec ^ (tv->tv_usec | (getpid() << 20)));
+}
+
+static void
+seed_random(void *unused)
+{
+       unsigned int seed;
+       if(rb_get_random(&seed, sizeof(seed)) == -1)
+       {
+               if(!seed_with_urandom())
+                       seed_with_clock();
+               return;
+       }
+       srand(seed);
+}
+
 /*
  * main
  *
@@ -523,13 +551,13 @@ main(int argc, char *argv[])
                return -1;
        }
 
+       rb_set_time();
+
        /*
         * Setup corefile size immediately after boot -kre
         */
        setup_corefile();
 
-       /* 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));
        memset(&meLocalUser, 0, sizeof(meLocalUser));
        me.localClient = &meLocalUser;
@@ -566,7 +594,7 @@ main(int argc, char *argv[])
 
        if(printVersion)
        {
-               printf("ircd: version %s\n", ircd_version);
+               printf("ircd: version %s(%s)\n", ircd_version, serno);
                exit(EXIT_SUCCESS);
        }
 
@@ -578,10 +606,6 @@ main(int argc, char *argv[])
 
        setup_signals();
 
-#ifdef __CYGWIN__
-       server_state_foreground = 1;
-#endif
-
        if (testing_conf)
                server_state_foreground = 1;
 
@@ -619,7 +643,6 @@ main(int argc, char *argv[])
        init_host_hash();
        clear_hash_parse();
        init_client();
-       initUser();
        init_hook();
        init_channels();
        initclass();
@@ -655,7 +678,7 @@ main(int argc, char *argv[])
                ierror("no server name specified in serverinfo block.");
                return -1;
        }
-       strlcpy(me.name, ServerInfo.name, sizeof(me.name));
+       rb_strlcpy(me.name, ServerInfo.name, sizeof(me.name));
 
        if(ServerInfo.sid[0] == '\0')
        {
@@ -671,7 +694,7 @@ main(int argc, char *argv[])
                ierror("no server description specified in serverinfo block.");
                return -3;
        }
-       strlcpy(me.info, ServerInfo.description, sizeof(me.info));
+       rb_strlcpy(me.info, ServerInfo.description, sizeof(me.info));
 
        if(ServerInfo.ssl_cert != NULL && ServerInfo.ssl_private_key != NULL)
        {
@@ -704,6 +727,7 @@ main(int argc, char *argv[])
        rb_dlinkAddAlloc(&me, &global_serv_list);
 
        construct_umodebuf();
+        construct_noparam_modes();
 
        check_class();
        write_pidfile(pidFileName);
@@ -718,15 +742,12 @@ main(int argc, char *argv[])
         * nick collisions.  what a stupid idea. set an event for the IO loop --fl
         */
        rb_event_addish("try_connections", try_connections, NULL, STARTUP_CONNECTIONS_TIME);
-       rb_event_addonce("try_connections_startup", try_connections, NULL, 0);
-
-       /* Setup the timeout check. I'll shift it later :)  -- adrian */
-       rb_event_addish("rb_checktimeouts", rb_checktimeouts, NULL, 1);
-
-       rb_event_add("check_rehash", check_rehash, NULL, 1);
+       rb_event_addonce("try_connections_startup", try_connections, NULL, 2);
+       rb_event_add("check_rehash", check_rehash, NULL, 3);
+       rb_event_addish("reseed_srand", seed_random, NULL, 300); /* reseed every 10 minutes */
 
        if(splitmode)
-               check_splitmode_ev = rb_event_add("check_splitmode", check_splitmode, NULL, 2);
+               check_splitmode_ev = rb_event_add("check_splitmode", check_splitmode, NULL, 5);
 
        print_startup(getpid());