main.c

来自「这是一个完全开放的」· C语言 代码 · 共 641 行 · 第 1/2 页

C
641
字号
            }            jid.node[256] = '\0';            shahash_r(jid.node, jid.node);            jid_prep(&jid);            strcpy((char *) res, jid_full(&jid));            return 0;        default:            break;    }    return 0;}static void _c2s_time_checks(c2s_t c2s) {    sess_t sess;    time_t now;    now = time(NULL);    if(xhash_iter_first(c2s->sessions))        do {            xhash_iter_get(c2s->sessions, NULL, (void **) &sess);            if(c2s->io_check_idle > 0 && now > sess->last_activity + c2s->io_check_idle) {                log_write(c2s->log, LOG_NOTICE, "[%d] [%s, port=%d] timed out", sess->fd, sess->ip, sess->port);                sx_error(sess->s, stream_err_HOST_GONE, "connection timed out");                sx_close(sess->s);                continue;            }            if(c2s->io_check_keepalive > 0 && now > sess->last_activity + c2s->io_check_keepalive && sess->s->state >= state_STREAM) {                log_debug(ZONE, "sending keepalive for %d", sess->fd);                sx_raw_write(sess->s, " ", 1);                                mio_write(c2s->mio, sess->fd);            }        } while(xhash_iter_next(c2s->sessions));}int main(int argc, char **argv){    c2s_t c2s;    char *config_file, *realm;    int i, sd_flags, optchar;    config_elem_t elem;    sess_t sess;#ifdef POOL_DEBUG    time_t pool_time = 0;#endif    #ifdef HAVE_UMASK    umask((mode_t) 0027);#endif    srand(time(NULL));#ifdef HAVE_WINSOCK2_H/* get winsock running */	{		WORD wVersionRequested;		WSADATA wsaData;		int err;				wVersionRequested = MAKEWORD( 2, 2 );				err = WSAStartup( wVersionRequested, &wsaData );		if ( err != 0 ) {            /* !!! tell user that we couldn't find a usable winsock dll */			return 0;		}	}#endif    jabber_signal(SIGINT, _c2s_signal);    jabber_signal(SIGTERM, _c2s_signal);#ifdef SIGHUP    jabber_signal(SIGHUP, _c2s_signal_hup);#endif#ifdef SIGPIPE    jabber_signal(SIGPIPE, SIG_IGN);#endif    c2s = (c2s_t) malloc(sizeof(struct c2s_st));    memset(c2s, 0, sizeof(struct c2s_st));    /* load our config */    c2s->config = config_new();    config_file = CONFIG_DIR "/c2s.xml";    /* cmdline parsing */    while((optchar = getopt(argc, argv, "Dc:h?")) >= 0)    {        switch(optchar)        {            case 'c':                config_file = optarg;                break;            case 'D':#ifdef DEBUG                set_debug_flag(1);#else                printf("WARN: Debugging not enabled.  Ignoring -D.\n");#endif                break;            case 'h': case '?': default:                fputs(                    "c2s - jabberd client-to-server connector (" VERSION ")\n"                    "Usage: c2s <options>\n"                    "Options are:\n"                    "   -c <config>     config file to use [default: " CONFIG_DIR "/c2s.xml]\n"#ifdef DEBUG                    "   -D              Show debug output\n"#endif                    ,                    stdout);                config_free(c2s->config);                free(c2s);                return 1;        }    }    if(config_load(c2s->config, config_file) != 0)    {        fputs("c2s: couldn't load config, aborting\n", stderr);        config_free(c2s->config);        free(c2s);        return 2;    }    _c2s_config_expand(c2s);    c2s->log = log_new(c2s->log_type, c2s->log_ident, c2s->log_facility);    log_write(c2s->log, LOG_NOTICE, "starting up");    _c2s_pidfile(c2s);    if(c2s->ar_module_name == NULL)    {        log_write(c2s->log, LOG_ERR, "no authreg module specified in config file");        exit(1);    }    if((c2s->ar = authreg_init(c2s, c2s->ar_module_name)) == NULL)        exit(1);    c2s->pc = prep_cache_new();    c2s->sessions = xhash_new(1023);    c2s->conn_rates = xhash_new(101);    c2s->dead = jqueue_new();    c2s->sx_env = sx_env_new();#ifdef HAVE_SSL    /* get the ssl context up and running */    if(c2s->local_pemfile != NULL) {        c2s->sx_ssl = sx_env_plugin(c2s->sx_env, sx_ssl_init, c2s->local_pemfile, c2s->local_cachain);        if(c2s->sx_ssl == NULL) {            log_write(c2s->log, LOG_ERR, "failed to load local SSL pemfile, SSL will not be available to clients");            c2s->local_pemfile = NULL;        }    }    /* try and get something online, so at least we can encrypt to the router */    if(c2s->sx_ssl == NULL && c2s->router_pemfile != NULL) {        c2s->sx_ssl = sx_env_plugin(c2s->sx_env, sx_ssl_init, c2s->router_pemfile, NULL);        if(c2s->sx_ssl == NULL) {            log_write(c2s->log, LOG_ERR, "failed to load router SSL pemfile, channel to router will not be SSL encrypted");            c2s->router_pemfile = NULL;        }    }#endif                /* get sasl online */    sd_flags = 0;    if(c2s->ar->get_password != NULL)        sd_flags = sd_flag_GET_PASS | sd_flag_CHECK_PASS;    else if(c2s->ar->check_password != NULL)        sd_flags = sd_flag_CHECK_PASS;    c2s->sx_sasl = sx_env_plugin(c2s->sx_env, sx_sasl_init, _c2s_sx_sasl_callback, (void *) c2s, sd_flags);    if(c2s->sx_sasl == NULL) {        log_write(c2s->log, LOG_ERR, "failed to initialise SASL context, aborting");        exit(1);    }    sx_env_plugin(c2s->sx_env, bind_init);    c2s->mio = mio_new(c2s->io_max_fds);    /* realm mapping */    c2s->realms = xhash_new(51);    elem = config_get(c2s->config, "local.id");    for(i = 0; i < elem->nvalues; i++) {        realm = j_attr((const char **) elem->attrs[i], "realm");        xhash_put(c2s->realms, elem->values[i], (realm != NULL) ? realm : elem->values[i]);        log_write(c2s->log, LOG_NOTICE, "[%s] configured; realm=%s", elem->values[i], realm);    }    c2s->sm_avail = xhash_new(51);    c2s->retry_left = c2s->retry_init;    _c2s_router_connect(c2s);    while(!c2s_shutdown) {        mio_run(c2s->mio, 5);        if(c2s_logrotate) {            log_write(c2s->log, LOG_NOTICE, "reopening log ...");            log_free(c2s->log);            c2s->log = log_new(c2s->log_type, c2s->log_ident, c2s->log_facility);            log_write(c2s->log, LOG_NOTICE, "log started");            c2s_logrotate = 0;        }        if(c2s_lost_router) {            if(c2s->retry_left < 0) {                log_write(c2s->log, LOG_NOTICE, "attempting reconnect");                sleep(c2s->retry_sleep);                c2s_lost_router = 0;                _c2s_router_connect(c2s);            }            else if(c2s->retry_left == 0) {                c2s_shutdown = 1;            }            else {                log_write(c2s->log, LOG_NOTICE, "attempting reconnect (%d left)", c2s->retry_left);                c2s->retry_left--;                sleep(c2s->retry_sleep);                c2s_lost_router = 0;                _c2s_router_connect(c2s);            }        }                    /* cleanup dead sx_ts */        while(jqueue_size(c2s->dead) > 0)            sx_free((sx_t) jqueue_pull(c2s->dead));        /* time checks */        if(c2s->io_check_interval > 0 && time(NULL) >= c2s->next_check) {            log_debug(ZONE, "running time checks");            _c2s_time_checks(c2s);            c2s->next_check = time(NULL) + c2s->io_check_interval;            log_debug(ZONE, "next time check at %d", c2s->next_check);        }#ifdef POOL_DEBUG        if(time(NULL) > pool_time + 60) {            pool_stat(1);            pool_time = time(NULL);        }#endif    }    log_write(c2s->log, LOG_NOTICE, "shutting down");        if(xhash_iter_first(c2s->sessions))        do {            xhash_iter_get(c2s->sessions, NULL, (void **) &sess);            if(sess->active)                sx_close(sess->s);        } while(xhash_iter_next(c2s->sessions));    while(jqueue_size(c2s->dead) > 0)        sx_free((sx_t) jqueue_pull(c2s->dead));    sx_free(c2s->router);    sx_env_free(c2s->sx_env);    mio_free(c2s->mio);    xhash_free(c2s->sessions);    prep_cache_free(c2s->pc);    authreg_free(c2s->ar);    xhash_free(c2s->conn_rates);    access_free(c2s->access);    log_free(c2s->log);    config_free(c2s->config);    free(c2s);#ifdef POOL_DEBUG    pool_stat(1);#endif#ifdef HAVE_WINSOCK2_H    WSACleanup();#endif    return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?