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 + -
显示快捷键?