static ape_global *ape_init() { ape_global *ape; struct _fdevent *fdev; if ((ape = malloc(sizeof(*ape))) == NULL) return NULL; inc_rlimit(64000); signal(SIGPIPE, SIG_IGN); signal(SIGINT, &signal_handler); signal(SIGTERM, &signal_handler); fdev = &ape->events; fdev->handler = EVENT_UNKNOWN; #ifdef USE_EPOLL_HANDLER fdev->handler = EVENT_EPOLL; #endif #ifdef USE_KQUEUE_HANDLER fdev->handler = EVENT_KQUEUE; #endif ape->basemem = APE_BASEMEM; ape->is_running = 1; ape->timers.ntimers = 0; ape->timers.timers = NULL; ape_ssl_init(); if (ape_dns_init(ape) != 0) { goto error; } events_init(ape); ape->seed = _ape_seed = time(NULL) ^ (getpid() << 16); ape->hashs.servers = hashtbl_init(APE_HASH_STR); ape->hashs.cmds = hashtbl_init(APE_HASH_STR); ape->hashs.pipes.pub = hashtbl_init(APE_HASH_INT); ape->hashs.pipes.priv = hashtbl_init(APE_HASH_INT); if ((ape->conf = ape_read_config("../../etc/ape.conf", ape)) == NULL) { goto error; } ape_cmd_init_core(ape); ape->extend = ape_array_new(8); return ape; error: free(ape); return NULL; }
static ape_global *ape_init() { ape_global *ape; struct _fdevent *fdev; if ((ape = malloc(sizeof(*ape))) == NULL) return NULL; signal(SIGPIPE, SIG_IGN); fdev = &ape->events; fdev->handler = EVENT_UNKNOWN; #ifdef USE_EPOLL_HANDLER fdev->handler = EVENT_EPOLL; #endif #ifdef USE_KQUEUE_HANDLER fdev->handler = EVENT_ KQUEUE; #endif ape->basemem = APE_BASEMEM; ape->is_running = 1; if (ape_dns_init(ape) != 0) { goto error; } events_init(ape); ape->seed = _ape_seed = time(NULL) ^ (getpid() << 16); ape->hashs.servers = hashtbl_init(); if ((ape->conf = ape_read_config("../../etc/ape.conf", ape)) == NULL) { goto error; } return ape; error: free(ape); return NULL; }
int main(int argc, char **argv) { apeconfig *srv; int random, im_r00t = 0, pidfd = 0, serverfd; unsigned int getrandom = 0, ct_id; const char *pidfile = NULL; char *confs_path = NULL; struct _fdevent fdev; char cfgfile[513] = APE_CONFIG_FILE; acetables *g_ape; if (argc > 1 && strcmp(argv[1], "--version") == 0) { printf("\n AJAX Push Engine Server %s - (C) Anthony Catel <*****@*****.**>\n http://www.ape-project.org/\n\n", _VERSION); return 0; } if (argc > 1 && strcmp(argv[1], "--help") == 0) { printf("\n AJAX Push Engine Server %s - (C) Anthony Catel <*****@*****.**>\n http://www.ape-project.org/\n", _VERSION); printf("\n usage: aped [options]\n\n"); printf(" Options:\n --help : Display this help\n --version : Show version number\n --cfg <config path>: Load a specific config file (default is %s)\n\n", cfgfile); return 0; } else if (argc > 2 && strcmp(argv[1], "--cfg") == 0) { memset(cfgfile, 0, 513); strncpy(cfgfile, argv[2], 512); confs_path = get_path(cfgfile); } else if (argc > 1) { printf("\n AJAX Push Engine Server %s - (C) Anthony Catel <*****@*****.**>\n http://www.ape-project.org/\n\n", _VERSION); printf(" Unknown parameters - check \"aped --help\"\n\n"); return 0; } if (NULL == (srv = ape_config_load(cfgfile))) { printf("\nExited...\n\n"); exit(1); } if (getuid() == 0) { im_r00t = 1; } signal(SIGINT, &signal_handler); signal(SIGTERM, &signal_handler); if (VTICKS_RATE < 1) { printf("[ERR] TICKS_RATE cant be less than 1\n"); return 0; } random = open("/dev/urandom", O_RDONLY); if (!random) { printf("Cannot open /dev/urandom... exiting\n"); return 0; } read(random, &getrandom, 3); srand(getrandom); close(random); g_ape = xmalloc(sizeof(*g_ape)); g_ape->basemem = 1; // set 1 for testing if growup works g_ape->srv = srv; g_ape->confs_path = confs_path; g_ape->is_daemon = 0; ape_log_init(g_ape); fdev.handler = EVENT_UNKNOWN; #ifdef USE_EPOLL_HANDLER fdev.handler = EVENT_EPOLL; #endif #ifdef USE_KQUEUE_HANDLER fdev.handler = EVENT_KQUEUE; #endif g_ape->co = xmalloc(sizeof(*g_ape->co) * g_ape->basemem); memset(g_ape->co, 0, sizeof(*g_ape->co) * g_ape->basemem); g_ape->bad_cmd_callbacks = NULL; g_ape->bufout = xmalloc(sizeof(struct _socks_bufout) * g_ape->basemem); g_ape->timers.timers = NULL; g_ape->timers.ntimers = 0; g_ape->events = &fdev; if (events_init(g_ape, &g_ape->basemem) == -1) { printf("Fatal error: APE compiled without an event handler... exiting\n"); return 0; }; serverfd = servers_init(g_ape); ape_log(APE_INFO, __FILE__, __LINE__, g_ape, "APE starting up - pid : %i", getpid()); if (strcmp(CONFIG_VAL(Server, daemon, srv), "yes") == 0 && (pidfile = CONFIG_VAL(Server, pid_file, srv)) != NULL) { if ((pidfd = open(pidfile, O_TRUNC | O_WRONLY | O_CREAT, 0655)) == -1) { ape_log(APE_WARN, __FILE__, __LINE__, g_ape, "Cant open pid file : %s", CONFIG_VAL(Server, pid_file, srv)); } } if (im_r00t) { struct group *grp = NULL; struct passwd *pwd = NULL; if (inc_rlimit(atoi(CONFIG_VAL(Server, rlimit_nofile, srv))) == -1) { ape_log(APE_WARN, __FILE__, __LINE__, g_ape, "Cannot set the max filedescriptos limit (setrlimit) %s", strerror(errno)); } /* Set uid when uid section exists */ if (ape_config_get_section(srv, "uid")) { /* Get the user information (uid section) */ if ((pwd = getpwnam(CONFIG_VAL(uid, user, srv))) == NULL) { ape_log(APE_ERR, __FILE__, __LINE__, g_ape, "Can\'t find username %s", CONFIG_VAL(uid, user, srv)); return -1; } if (pwd->pw_uid == 0) { ape_log(APE_ERR, __FILE__, __LINE__, g_ape, "%s uid can\'t be 0", CONFIG_VAL(uid, user, srv)); return -1; } /* Get the group information (uid section) */ if ((grp = getgrnam(CONFIG_VAL(uid, group, srv))) == NULL) { printf("[ERR] Can\'t find group %s\n", CONFIG_VAL(uid, group, srv)); ape_log(APE_ERR, __FILE__, __LINE__, g_ape, "Can\'t find group %s", CONFIG_VAL(uid, group, srv)); return -1; } if (grp->gr_gid == 0) { ape_log(APE_ERR, __FILE__, __LINE__, g_ape, "%s gid can\'t be 0", CONFIG_VAL(uid, group, srv)); return -1; } setgid(grp->gr_gid); setgroups(0, NULL); initgroups(CONFIG_VAL(uid, user, srv), grp->gr_gid); setuid(pwd->pw_uid); } } else { printf("[WARN] You have to run \'aped\' as root to increase r_limit\n"); ape_log(APE_WARN, __FILE__, __LINE__, g_ape, "You have to run \'aped\' as root to increase r_limit"); } if (strcmp(CONFIG_VAL(Server, daemon, srv), "yes") == 0) { ape_log(APE_INFO, __FILE__, __LINE__, g_ape, "Starting daemon"); ape_daemon(pidfd, g_ape); events_reload(g_ape->events); events_add(g_ape->events, serverfd, EVENT_READ); } if (!g_ape->is_daemon) { printf(" _ ___ ___ \n"); printf(" /_\\ | _ \\ __|\n"); printf(" / _ \\| _/ _| \n"); printf("/_/ \\_\\_| |___|\nAJAX Push Engine\n\n"); printf("Bind on port %i\n\n", atoi(CONFIG_VAL(Server, port, srv))); printf("Version : %s\n", _VERSION); printf("Build : %s %s\n", __DATE__, __TIME__); printf("Author : Weelya ([email protected])\n\n"); } signal(SIGPIPE, SIG_IGN); ape_dns_init(g_ape); g_ape->cmd_hook.head = NULL; g_ape->cmd_hook.foot = NULL; g_ape->hSessid = hashtbl_init(); g_ape->hChannel = hashtbl_init(); g_ape->hPubid = hashtbl_init(); g_ape->proxy.list = NULL; g_ape->proxy.hosts = NULL; g_ape->hCallback = hashtbl_init(); g_ape->uHead = NULL; g_ape->cHead = NULL; g_ape->nConnected = 0; g_ape->plugins = NULL; g_ape->properties = NULL; ct_id = add_ticked(check_timeout, g_ape)->identifier; do_register(g_ape); transport_start(g_ape); findandloadplugin(g_ape); server_is_running = 1; server_is_shutdowning = 0; /* Starting Up */ sockroutine(g_ape); /* loop */ /* Shutdown */ if (pidfile != NULL) { unlink(pidfile); } free(confs_path); ape_dns_free(g_ape); del_timer_identifier(ct_id, g_ape); events_free(g_ape); transport_free(g_ape); hashtbl_free(g_ape->hSessid, 0); hashtbl_free(g_ape->hChannel, 0); hashtbl_free(g_ape->hPubid, 0); do_unregister(g_ape); hashtbl_free(g_ape->hCallback, 1); ape_config_free(srv); int i; for (i = 0; i < g_ape->basemem; i++) { if (g_ape->co[i] != NULL) { close_socket(i, g_ape); free(g_ape->co[i]); } } free(g_ape->co); free(g_ape->bufout); free_all_hook_cmd(g_ape); free_all_plugins(g_ape); free(g_ape); return 0; }
ape_global *APE_init() { ape_global *ape; struct _fdevent *fdev; #ifndef __WIN32 signal(SIGPIPE, SIG_IGN); #else WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { printf("[Error] WSA failed\n"); return NULL; } #endif if ((ape = malloc(sizeof(*ape))) == NULL) return NULL; fdev = &ape->events; fdev->handler = EVENT_UNKNOWN; #ifdef USE_EPOLL_HANDLER fdev->handler = EVENT_EPOLL; #endif #ifdef USE_KQUEUE_HANDLER fdev->handler = EVENT_KQUEUE; #endif #ifdef USE_SELECT_HANDLER fdev->handler = EVENT_SELECT; #endif ape->is_running = 1; ape->timersng.run_in_low_resolution = 0; ape->timersng.head = NULL; ape->timersng.head_async = NULL; ape->timersng.last_identifier = 0; ape->ctx = NULL; ape->kill_handler = NULL; ape_dns_init(ape); ape_ssl_library_init(); if ((ape->ssl_global_ctx = ape_ssl_init_global_client_ctx()) == NULL) { printf("[Error] SSL: failed to init global CTX\n"); } events_init(ape); ape->failed_write_count = 0; ape->total_memory_buffered = 0; ape->urandom_fd = open("/dev/urandom", O_RDONLY); if (!ape->urandom_fd) { printf("Can not open /dev/urandom\n"); return NULL; } memset(&ape->logger, 0, sizeof(ape->logger)); /* Store ape in a Thread local storage */ pthread_once(&g_InitOnce, ape_inittls); if (pthread_getspecific(g_APEThreadContextKey) != NULL) { printf("[Error] An instance of APE already exists in the current thread\n"); return NULL; } pthread_setspecific(g_APEThreadContextKey, ape); return ape; }