#include "monitor.h"
#include "patchlevel.h"
#include "serno.h"
-
-/*
- * 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;
-
-extern int ServerRunning;
-extern struct LocalUser meLocalUser;
-extern char **myargv;
-
-int maxconnections; /* XXX */
+#include "sslproc.h"
/* /quote set variables */\r
struct SetOptions GlobalSetOptions;
/* server info set from ircd.conf */\r
struct server_info ServerInfo;\r
/* admin info set from ircd.conf */\r
-struct admin_info AdminInfo;\r
-\r
+struct admin_info AdminInfo;
+
struct Counter Count;\r
struct ServerStatistics ServerStats;
+int maxconnections;
+struct timeval SystemTime;
+struct Client me; /* That's me */\r
+struct LocalUser meLocalUser; /* That's also part of me */
+
+rb_dlink_list lclient_list = { NULL, NULL, 0 };\r
+rb_dlink_list global_client_list = { NULL, NULL, 0 };\r
+rb_dlink_list global_channel_list = { NULL, NULL, 0 };\r
+\r
+rb_dlink_list unknown_list; /* unknown clients ON this server only */\r
+rb_dlink_list serv_list; /* local servers to this server ONLY */\r
+rb_dlink_list global_serv_list; /* global servers on the network */\r
+rb_dlink_list local_oper_list; /* our opers, duplicated in lclient_list */\r
+rb_dlink_list oper_list; /* network opers */
+
+time_t startup_time;\r
+\r
+int default_server_capabs = CAP_MASK;\r
+\r
+int splitmode;\r
+int splitchecking;\r
+int split_users;\r
+int split_servers;\r
+int eob_count;\r
+\r
+unsigned long initialVMTop = 0; /* top of virtual memory at init */\r
+const char *logFileName = LPATH;\r
+const char *pidFileName = PPATH;
+
+char **myargv;
+int dorehash = 0;\r
+int dorehashbans = 0;\r
+int doremotd = 0;\r
+int kline_queued = 0;\r
+int server_state_foreground = 0;\r
+int opers_see_all_users = 0;\r
+int ssl_ok = 0;\r
+int zlib_ok = 1;\r
+\r
+int testing_conf = 0;\r
+\r
+struct config_channel_entry ConfigChannel;\r
+rb_bh *channel_heap;\r
+rb_bh *ban_heap;\r
+rb_bh *topic_heap;\r
+rb_bh *member_heap;\r
+\r
+rb_bh *client_heap = NULL;\r
+rb_bh *lclient_heap = NULL;\r
+rb_bh *pclient_heap = NULL;\r
+\r
+char current_uid[IDLEN];\r
+\r
+/* patricia */\r
+rb_bh *prefix_heap;\r
+rb_bh *node_heap;\r
+rb_bh *patricia_heap;\r
+\r
+rb_bh *linebuf_heap;\r
+\r
+rb_bh *dnode_heap;
+
/*
* print_startup - print startup information
*/
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)\r
+ {
+ /* 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);
static void
init_sys(void)
{
-#if defined(RLIMIT_NOFILE) && defined(HAVE_SYS_RESOURCE_H)
- struct rlimit limit;
-
- if(!getrlimit(RLIMIT_NOFILE, &limit))
- {
- limit.rlim_cur = limit.rlim_max; /* make soft limit the max */
- if(setrlimit(RLIMIT_NOFILE, &limit) == -1)
- {
- fprintf(stderr, "error setting max fd's to %ld\n", (long) limit.rlim_cur);
- exit(EXIT_FAILURE);
- }
- }
-
- maxconnections = limit.rlim_cur;
-#endif /* RLIMIT_NOFILE */
+#if defined(RLIMIT_NOFILE) && defined(HAVE_SYS_RESOURCE_H)\r
+ struct rlimit limit;\r
+\r
+ if(!getrlimit(RLIMIT_NOFILE, &limit))\r
+ {\r
+ maxconnections = limit.rlim_cur;\r
+ if(maxconnections <= MAX_BUFFER)\r
+ {\r
+ fprintf(stderr, "ERROR: Shell FD limits are too low.\n");\r
+ fprintf(stderr, "ERROR: ircd-ratbox reserves %d FDs, shell limits must be above this\n", MAX_BUFFER);\r
+ exit(EXIT_FAILURE);\r
+ }\r
+ return;\r
+ }\r
+#endif /* RLIMIT_FD_MAX */\r
+ maxconnections = MAXCONNECTIONS;
}
static int
memset(&GlobalSetOptions, 0, sizeof(GlobalSetOptions));
/* memset( &ConfigFileEntry, 0, sizeof(ConfigFileEntry)); */
- GlobalSetOptions.maxclients = ServerInfo.max_clients;
+ GlobalSetOptions.maxclients = ServerInfo.default_max_clients;\r
+\r
+ if(GlobalSetOptions.maxclients > (maxconnections - MAX_BUFFER) || (GlobalSetOptions.maxclients <= 0))\r
+ GlobalSetOptions.maxclients = maxconnections - MAX_BUFFER;
+
GlobalSetOptions.autoconn = 1;
GlobalSetOptions.spam_time = MIN_JOIN_LEAVE_TIME;
*/
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));
mod_add_path(MODULE_DIR "/autoload");
#endif
+ init_ssld();
+
initialize_server_capabs(); /* Set up default_server_capabs */
initialize_global_set_options();
}
strlcpy(me.info, ServerInfo.description, sizeof(me.info));
+ if(ServerInfo.ssl_cert != NULL && ServerInfo.ssl_private_key != NULL)\r
+ {\r
+ /* just do the rb_setup_ssl_server to validate the config */\r
+ if(!rb_setup_ssl_server(ServerInfo.ssl_cert, ServerInfo.ssl_private_key, ServerInfo.ssl_dh_params))\r
+ {\r
+ ilog(L_MAIN, "WARNING: Unable to setup SSL.");\r
+ ssl_ok = 0;\r
+ }\r
+ else\r
+ ssl_ok = 1;\r
+ }
+
if (testing_conf)
{
fprintf(stderr, "\nConfig testing complete.\n");
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);
if(splitmode)
check_splitmode_ev = rb_event_add("check_splitmode", check_splitmode, NULL, 2);
- ServerRunning = 1;
-
print_startup(getpid());
- rb_lib_loop(250);
+ rb_lib_loop(0);
return 0;
}