int main(int argc, char *argv[]) { //Read the configuration file, which means the number of listeners should be dynamic int n_listeners; std::vector<int> port_list; std::vector<std::string> cmd_list; read_config(std::cin,n_listeners,port_list,cmd_list); int* listen_sockfds = new int[n_listeners]; pollfd* pollfds = new pollfd[n_listeners]; /* Set up SIGCHLD handler with SA_NOCLDWAIT (option 3) */ setup_sa_nocldwait( ); /* Set up our listening sockets. */ setup_listeners(listen_sockfds, n_listeners, port_list); /* Set up our pollfds. */ memset(pollfds, 0, n_listeners*sizeof(struct pollfd)); for (int i = 0; i < n_listeners; i++) { pollfds[i].fd = listen_sockfds[i]; pollfds[i].events = POLLIN; } /* Loop infinitely, accepting any connections we get. */ for (;;) { /* Call select() and handle errors. */ if (poll(pollfds, n_listeners, -1) == -1) { if (errno == EINTR) { continue; } else { perror("poll"); return 1; } } /* Iterate through fds, finding any that are ready. */ for (int i = 0; i < n_listeners; i++) { if (pollfds[i].revents & POLLIN) { /* accept and fork the child process */ do_accept(listen_sockfds[i],cmd_list[i]); } } } delete[] listen_sockfds; delete[] pollfds; }
int main(int argc, char **argv) { krb5_error_code ret; setprogname(argv[0]); ret = krb5_init_context(&context); if (ret == KRB5_CONFIG_BADFORMAT) errx (1, "krb5_init_context failed to parse configuration file"); else if (ret) errx (1, "krb5_init_context failed: %d", ret); ret = krb5_kt_register(context, &hdb_kt_ops); if (ret) errx (1, "krb5_kt_register(HDB) failed: %d", ret); config = configure(context, argc, argv); #ifdef SIGPIPE #ifdef HAVE_SIGACTION { struct sigaction sa; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = SIG_IGN; sigaction(SIGPIPE, &sa, NULL); } #else signal(SIGPIPE, SIG_IGN); #endif #endif /* SIGPIPE */ #ifdef SUPPORT_DETACH if (detach_from_console) daemon(0, 0); #endif #ifdef __APPLE__ if (sandbox_flag) { char *errorstring; ret = sandbox_init("kdc", SANDBOX_NAMED, &errorstring); if (ret) errx(1, "sandbox_init failed: %d: %s", ret, errorstring); } bonjour_announce(get_realms); #endif /* __APPLE__ */ pidfile(NULL); switch_environment(); setup_listeners(context, config, listen_on_ipc, listen_on_network); heim_sipc_signal_handler(SIGINT, terminated, "SIGINT"); heim_sipc_signal_handler(SIGTERM, terminated, "SIGTERM"); #ifdef SIGXCPU heim_sipc_signal_handler(SIGXCPU, terminated, "CPU time limit exceeded"); #endif heim_ipc_main(); krb5_free_context(context); return 0; }
static int netware_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) { apr_status_t status=0; pconf = _pconf; ap_server_conf = s; if (setup_listeners(s)) { ap_log_error(APLOG_MARK, APLOG_ALERT, status, s, APLOGNO(00223) "no listening sockets available, shutting down"); return !OK; } restart_pending = shutdown_pending = 0; worker_thread_count = 0; if (!is_graceful) { if (ap_run_pre_mpm(s->process->pool, SB_NOT_SHARED) != OK) { return !OK; } } /* Only set slot 0 since that is all NetWare will ever have. */ ap_scoreboard_image->parent[0].pid = getpid(); ap_run_child_status(ap_server_conf, ap_scoreboard_image->parent[0].pid, ap_my_generation, 0, MPM_CHILD_STARTED); set_signals(); apr_pool_create(&pmain, pconf); ap_run_child_init(pmain, ap_server_conf); if (ap_threads_max_free < ap_threads_min_free + 1) /* Don't thrash... */ ap_threads_max_free = ap_threads_min_free + 1; request_count = 0; startup_workers(ap_threads_to_start); /* Allow the Apache screen to be closed normally on exit() only if it has not been explicitly forced to close on exit(). (ie. the -E flag was specified at startup) */ if (hold_screen_on_exit > 0) { hold_screen_on_exit = 0; } ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, APLOGNO(00224) "%s configured -- resuming normal operations", ap_get_server_description()); ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, APLOGNO(00225) "Server built: %s", ap_get_server_built()); ap_log_command_line(plog, s); ap_log_common(s); show_server_data(); mpm_state = AP_MPMQ_RUNNING; while (!restart_pending && !shutdown_pending) { perform_idle_server_maintenance(pconf); if (show_settings) display_settings(); apr_thread_yield(); apr_sleep(SCOREBOARD_MAINTENANCE_INTERVAL); } mpm_state = AP_MPMQ_STOPPING; ap_run_child_status(ap_server_conf, ap_scoreboard_image->parent[0].pid, ap_my_generation, 0, MPM_CHILD_EXITED); /* Shutdown the listen sockets so that we don't get stuck in a blocking call. shutdown_listeners();*/ if (shutdown_pending) { /* Got an unload from the console */ ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, APLOGNO(00226) "caught SIGTERM, shutting down"); while (worker_thread_count > 0) { printf ("\rShutdown pending. Waiting for %lu thread(s) to terminate...", worker_thread_count); apr_thread_yield(); } mpm_main_cleanup(); return DONE; } else { /* the only other way out is a restart */ /* advance to the next generation */ /* XXX: we really need to make sure this new generation number isn't in * use by any of the children. */ ++ap_my_generation; ap_scoreboard_image->global->running_generation = ap_my_generation; ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, APLOGNO(00227) "Graceful restart requested, doing restart"); /* Wait for all of the threads to terminate before initiating the restart */ while (worker_thread_count > 0) { printf ("\rRestart pending. Waiting for %lu thread(s) to terminate...", worker_thread_count); apr_thread_yield(); } printf ("\nRestarting...\n"); } mpm_main_cleanup(); return OK; }
node_engine(std::istream &xml_stream) throw(std::string) : expat_engine(xml_stream) { setup_listeners(); }
node_engine(std::string filename) throw(std::string) : expat_engine(filename) { setup_listeners(); }