예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
파일: mod-snoop.c 프로젝트: Cloudxtreme/x3
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;
}
예제 #4
0
파일: mod-track.c 프로젝트: Cloudxtreme/x3
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;
}
예제 #5
0
파일: global.c 프로젝트: Cloudxtreme/x3
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);
}
예제 #6
0
파일: main.c 프로젝트: NX-Andro/x3
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;
}