int iauth_loc_init(void) { loc_log = log_register_type("iauth_loc", "file:iauth_loc.log"); conf_register_reload(iauth_loc_conf_read); reg_xquery_func(iauth_loc_xquery); return 1; }
int qserver_init(void) { qserver_log = log_register_type("QServer", "file:qserver.log"); conf_register_reload(qserver_conf_read); qserver_dict = dict_new(); reg_exit_func(qserver_cleanup, NULL); return 1; }
int snoop_init(void) { reg_exit_func(snoop_cleanup, NULL); conf_register_reload(snoop_conf_read); reg_nick_change_func(snoop_nick_change, NULL); reg_join_func(snoop_join, NULL); reg_part_func(snoop_part, NULL); reg_kick_func(snoop_kick, NULL); reg_new_user_func(snoop_new_user, NULL); reg_del_user_func(snoop_del_user, NULL); reg_auth_func(snoop_auth, NULL); reg_channel_mode_func(snoop_channel_mode, NULL); reg_user_mode_func(snoop_user_mode, NULL); reg_oper_func(snoop_oper, NULL); return 1; }
int track_init(void) { track_db = dict_new(); dict_set_free_keys(track_db, free); reg_exit_func(track_cleanup, NULL); conf_register_reload(track_conf_read); reg_nick_change_func(track_nick_change, NULL); reg_join_func(track_join, NULL); reg_part_func(track_part, NULL); reg_kick_func(track_kick, NULL); reg_new_user_func(track_new_user, NULL); reg_del_user_func(track_del_user, NULL); reg_auth_func(track_auth, NULL); reg_channel_mode_func(track_channel_mode, NULL); reg_user_mode_func(track_user_mode, NULL); reg_oper_func(track_oper, NULL); opserv_define_func("TRACK", cmd_track, 800, 0, 0); opserv_define_func("DELTRACK", cmd_deltrack, 800, 0, 0); opserv_define_func("ADDTRACK", cmd_addtrack, 800, 0, 0); opserv_define_func("LISTTRACK", cmd_listtrack, 800, 0, 0); return 1; }
void init_global(const char *nick) { struct chanNode *chan; unsigned int i; G_LOG = log_register_type("Global", "file:global.log"); reg_new_user_func(global_process_user, NULL); reg_auth_func(global_process_auth, NULL); reg_oper_func(global_process_oper, NULL); conf_register_reload(global_conf_read); global_module = module_register("Global", G_LOG, "global.help", NULL); modcmd_register(global_module, "LIST", cmd_list, 1, 0, "flags", "+oper", NULL); modcmd_register(global_module, "MESSAGE", cmd_message, 3, MODCMD_REQUIRE_AUTHED, "flags", "+oper", NULL); modcmd_register(global_module, "MESSAGES", cmd_messages, 1, 0, NULL); modcmd_register(global_module, "NOTICE", cmd_notice, 3, MODCMD_REQUIRE_AUTHED, "flags", "+oper", NULL); modcmd_register(global_module, "REMOVE", cmd_remove, 2, MODCMD_REQUIRE_AUTHED, "flags", "+oper", NULL); if(nick) { const char *modes = conf_get_data("services/global/modes", RECDB_QSTRING); global = AddLocalUser(nick, nick, NULL, "Global Services", modes); global_service = service_register(global); } if(autojoin_channels && global) { for (i = 0; i < autojoin_channels->used; i++) { chan = AddChannel(autojoin_channels->list[i], now, "+nt", NULL, NULL); AddChannelUser(global, chan)->modes |= MODE_CHANOP; } } saxdb_register("Global", global_saxdb_read, global_saxdb_write); reg_exit_func(global_db_cleanup, NULL); message_register_table(msgtab); }
int main(int argc, char *argv[]) { int run_as_daemon; int debug; pid_t pid = 0; FILE *file_out; struct sigaction sv; #if WITH_MALLOC_BOEHM_GC GC_find_leak = 1; GC_set_warn_proc(gc_warn_proc); GC_enable_incremental(); #endif run_as_daemon = 1; debug = 0; tools_init(); /* set up some signal handlers */ memset(&sv, 0, sizeof(sv)); sigemptyset(&sv.sa_mask); sv.sa_handler = SIG_IGN; sigaction(SIGPIPE, &sv, NULL); sv.sa_handler = sigaction_rehash; sigaction(SIGHUP, &sv, NULL); sv.sa_handler = sigaction_writedb; sigaction(SIGINT, &sv, NULL); sv.sa_handler = sigaction_exit; sigaction(SIGQUIT, &sv, NULL); sv.sa_handler = sigaction_wait; sigaction(SIGCHLD, &sv, NULL); if (argc > 1) { /* parse command line, if any */ int c; struct option options[] = { {"config", 1, 0, 'c'}, {"debug", 0, 0, 'd'}, {"foreground", 0, 0, 'f'}, {"help", 0, 0, 'h'}, {"check", 0, 0, 'k'}, {"replay", 1, 0, 'r'}, {"version", 0, 0, 'v'}, {0, 0, 0, 0} }; while ((c = getopt_long(argc, argv, "c:dfhkr:v", options, NULL)) != -1) { switch (c) { case 'c': services_config = optarg; break; case 'k': if (conf_read(services_config)) { printf("%s appears to be a valid configuration file.\n", services_config); } else { printf("%s is an invalid configuration file.\n", services_config); } exit(0); case 'r': replay_file = fopen(optarg, "r"); if (!replay_file) { fprintf(stderr, "Could not open %s for reading: %s (%d)\n", optarg, strerror(errno), errno); exit(0); } break; case 'd': debug = 1; break; case 'f': run_as_daemon = 0; break; case 'v': version(); license(); exit(0); case 'h': default: usage(argv[0]); exit(0); } } } version(); if (replay_file) { /* We read a line here to "prime" the replay file parser, but * mostly to get the right value of "now" for when we do the * irc_introduce. */ replay_read_line(); } else { now = time(NULL); } boot_time = now; fprintf(stdout, "Initializing daemon...\n"); if (!conf_read(services_config)) { fprintf(stderr, "Unable to read %s.\n", services_config); exit(1); } conf_register_reload(uplink_compile); if (run_as_daemon) { /* Attempt to fork into the background if daemon mode is on. */ pid = fork(); if (pid < 0) { fprintf(stderr, "Unable to fork: %s\n", strerror(errno)); } else if (pid > 0) { fprintf(stdout, "Forking into the background (pid: %d)...\n", pid); exit(0); } setsid(); } file_out = fopen(PID_FILE, "w"); if (file_out == NULL) { /* Create the main process' pid file */ fprintf(stderr, "Unable to create PID file: %s", strerror(errno)); } else { fprintf(file_out, "%i\n", (int)getpid()); fclose(file_out); } if (run_as_daemon) { /* Close these since we should not use them from now on. */ fclose(stdin); fclose(stdout); fclose(stderr); } services_argc = argc; services_argv = argv; atexit(call_exit_funcs); reg_exit_func(main_shutdown, NULL); log_init(); MAIN_LOG = log_register_type("x3", "file:main.log"); if (debug) log_debug(); ioset_init(); init_structs(); init_parse(); modcmd_init(); saxdb_init(); sar_init(); gline_init(); shun_init(); mail_init(); helpfile_init(); conf_globals(); /* initializes the core services */ conf_rlimits(); modules_init(); message_register_table(msgtab); modcmd_finalize(); saxdb_finalize(); helpfile_finalize(); modules_finalize(); /* The first exit func to be called *should* be saxdb_write_all(). */ reg_exit_func(saxdb_write_all, NULL); if (replay_file) { char *msg; log_module(MAIN_LOG, LOG_INFO, "Beginning replay..."); srand(now); replay_event_loop(); if ((msg = dict_sanity_check(clients))) { log_module(MAIN_LOG, LOG_ERROR, "Clients insanity: %s", msg); free(msg); } if ((msg = dict_sanity_check(channels))) { log_module(MAIN_LOG, LOG_ERROR, "Channels insanity: %s", msg); free(msg); } if ((msg = dict_sanity_check(servers))) { log_module(MAIN_LOG, LOG_ERROR, "Servers insanity: %s", msg); free(msg); } } else { now = time(NULL); srand(now); ioset_run(); } return 0; }