void taskmain(int argc, char **argv) { L = luaL_newstate(); dbg_set_log(stderr); int rc = 0; check(argc == 3, "usage: mongrel2 config.lua server_name"); //if(argc == 4) { // log_info("Using configuration module %s to load configs.", argv[3]); // rc = Config_module_load(argv[3]); // check(rc != -1, "Failed to load the config module: %s", argv[3]); //} Server_queue_init(); Server *srv = load_server(L, argv[1], argv[2], NULL); check(srv != NULL, "Aborting since can't load server."); Server_queue_push(srv); SuperPoll_get_max_fd(); // rc = clear_pid_file(srv); // check(rc == 0, "PID file failure, aborting rather than trying to start."); // rc = attempt_chroot_drop(srv); // check(rc == 0, "Major failure in chroot/droppriv, aborting."); final_setup(); taskcreate(tickertask, NULL, TICKER_TASK_STACK); struct ServerTask *srv_data = calloc(1, sizeof(struct ServerTask)); srv_data->db_file = bfromcstr(argv[1]); srv_data->server_id = bfromcstr(argv[2]); // taskcreate(reload_task, srv_data, RELOAD_TASK_STACK); rc = Server_run(); check(rc != -1, "Server had a failure and exited early."); log_info("Server run exited, goodbye."); srv = Server_queue_latest(); complete_shutdown(srv); return; error: log_err("Exiting due to error."); taskexitall(1); }
int main(int argc, char **argv) { bool_t nodaemon = false; #ifdef POSIX_PRIORITY_SCHEDULING bool_t realtime = false; #endif bool_t testconfig = false; char *conffile = NULL, *pidfile = NULL; int c; struct utsname utsbuf; /* Arguments */ #ifdef POSIX_PRIORITY_SCHEDULING while ((c = getopt(argc, argv, "drp:c:a:A:b:B:ht")) != EOF) { #else while ((c = getopt(argc, argv, "dp:c:a:A:b:B:ht")) != EOF) { #endif switch(c) { case 'c': conffile = optarg; break; case 'p': pidfile = optarg; break; case 'a': bindaddr = optarg; break; case 'A': bindaddr6 = optarg; break; case 'b': bindport = atoi(optarg); break; case 'B': bindport6 = atoi(optarg); break; case 'd': nodaemon = true; break; case 'h': printhelp(); break; case 't': testconfig = true; break; #ifdef POSIX_PRIORITY_SCHEDULING case 'r': realtime = true; break; #endif default: fprintf(stderr, "Unrecognized option\n"); printhelp(); break; } } if (testconfig) { if (!Conf_ok(conffile)) exit(1); else exit(0); } /* Initialize the config subsystem early; * switch_user() will need to read some config variables as well as logging. */ Conf_init(conffile); /* Logging to terminal if not daemonizing, otherwise to syslog or log file. */ if (!nodaemon) { daemonize(); Log_init(false); if (pidfile != NULL) lockfile(pidfile); switch_user(); /* Reopen log file. If user switch results in access denied, we catch * it early. */ Log_reset(); } else Log_init(true); signal(SIGCHLD, SIG_IGN); /* ignore child */ signal(SIGTSTP, SIG_IGN); /* ignore tty signals */ signal(SIGTTOU, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGPIPE, SIG_IGN); signal(SIGHUP, signal_handler); /* catch hangup signal */ signal(SIGTERM, signal_handler); /* catch kill signal */ /* Build system string */ if (uname(&utsbuf) == 0) { snprintf(system_string, 64, "%s %s", utsbuf.sysname, utsbuf.machine); snprintf(version_string, 64, "%s", utsbuf.release); } else { snprintf(system_string, 64, "unknown unknown"); snprintf(version_string, 64, "unknown"); } /* Initializing */ SSLi_init(); Chan_init(); Client_init(); Ban_init(); #ifdef USE_SHAREDMEMORY_API Sharedmemory_init( bindport, bindport6 ); #endif #ifdef POSIX_PRIORITY_SCHEDULING if (realtime) setscheduler(); #endif Server_run(); #ifdef USE_SHAREDMEMORY_API Sharedmemory_deinit(); #endif Ban_deinit(); SSLi_deinit(); Chan_free(); Log_free(); Conf_deinit(); if (pidfile != NULL) unlink(pidfile); return 0; }