#include #include #include #include "main.h" #include "exec.h" #include "modemman.h" #include "msntab.h" #define CHANNELS 1 oop_source* event_source = NULL; #define MSNTABLE "../conf/msntab" static void *oop_exit_cb(oop_source *source, int sig, void *user) { daemon_log(LOG_ERR, "Recieved signal %s", sig == SIGINT ? "SIGINT" : (sig == SIGTERM ? "SIGTERM" : "UNKNWON")); return OOP_HALT; } static void *oop_reload_cb(oop_source *source, int sig, void *user) { daemon_log(LOG_ERR, "Reloading MSN table."); msntab_flush(); if (msntab_load(MSNTABLE) < 0) { daemon_log(LOG_ERR, "Ignoring all calls."); msntab_flush(); } return OOP_CONTINUE; } static void *oop_dump_cb(oop_source *source, int sig, void *user) { msntab_dump(); return OOP_CONTINUE; } int main_loop(void) { int r = -1; oop_source_sys *sys = NULL; daemon_log(LOG_INFO, "Starting up."); if (!(sys = oop_sys_new())) { daemon_log(LOG_ERR, "Failed to create system source."); goto finish; } event_source = oop_sys_source(sys); assert(event_source); if (child_process_init() < 0) goto finish; if (msntab_load(MSNTABLE) < 0) goto finish; if (modem_manager_init(CHANNELS) < 0) goto finish; event_source->on_signal(event_source, SIGINT, oop_exit_cb, NULL); event_source->on_signal(event_source, SIGTERM, oop_exit_cb, NULL); event_source->on_signal(event_source, SIGHUP, oop_reload_cb, NULL); event_source->on_signal(event_source, SIGUSR1, oop_dump_cb, NULL); signal(SIGPIPE, SIG_IGN); daemon_log(LOG_INFO, "Start up complete."); if (oop_sys_run(sys) == OOP_ERROR) { daemon_log(LOG_ERR, "oop_sys_new() returned OOP_ERROR"); goto finish; } r = 0; finish: daemon_log(LOG_INFO, "Shutting down."); event_source->cancel_signal(event_source, SIGTERM, oop_exit_cb, NULL); event_source->cancel_signal(event_source, SIGINT, oop_exit_cb, NULL); event_source->cancel_signal(event_source, SIGHUP, oop_reload_cb, NULL); event_source->cancel_signal(event_source, SIGUSR1, oop_dump_cb, NULL); msntab_flush(); modem_manager_done(); child_process_done(); if (sys) { event_source = NULL; oop_sys_delete(sys); } daemon_log(LOG_INFO, "Shut down complete."); return r; } int main(int argc, char*argv[]) { return main_loop() < 0 ? 1 : 0; }