#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"
#include "patchlevel.h"
#include "serno.h"
#include "sslproc.h"
+#include "chmode.h"
/* /quote set variables */
struct SetOptions GlobalSetOptions;
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));
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
*
if(printVersion)
{
- printf("ircd: version %s\n", ircd_version);
+ printf("ircd: version %s(%s)\n", ircd_version, serno);
exit(EXIT_SUCCESS);
}
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')
{
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)
{
rb_dlinkAddAlloc(&me, &global_serv_list);
construct_umodebuf();
+ construct_noparam_modes();
check_class();
write_pidfile(pidFileName);
*/
rb_event_addish("try_connections", try_connections, NULL, STARTUP_CONNECTIONS_TIME);
rb_event_addonce("try_connections_startup", try_connections, NULL, 0);
-
rb_event_add("check_rehash", check_rehash, NULL, 1);
+ 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);