summaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c100
1 files changed, 90 insertions, 10 deletions
diff --git a/src/main.c b/src/main.c
index 4f5a273..204fc69 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,17 +1,23 @@
#include <signal.h>
#include <assert.h>
+#include <string.h>
+#include <errno.h>
+
#include <libdaemon/dlog.h>
+#include <libdaemon/dfork.h>
+#include <libdaemon/dpid.h>
#include "main.h"
#include "exec.h"
#include "modemman.h"
#include "msntab.h"
-
-#define CHANNELS 1
+#include "cmdline.h"
oop_source* event_source = NULL;
+struct gengetopt_args_info args;
+const char *appname = NULL, *username = NULL;
-#define MSNTABLE "../conf/msntab"
+#define DEFAULT_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"));
@@ -22,7 +28,7 @@ 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) {
+ if (msntab_load(args.msntab_arg ? args.msntab_arg : DEFAULT_MSNTABLE) < 0) {
daemon_log(LOG_ERR, "Ignoring all calls.");
msntab_flush();
}
@@ -37,7 +43,7 @@ static void *oop_dump_cb(oop_source *source, int sig, void *user) {
int main_loop(void) {
- int r = -1;
+ int r = -1, retval_sent = 0;
oop_source_sys *sys = NULL;
daemon_log(LOG_INFO, "Starting up.");
@@ -53,10 +59,10 @@ int main_loop(void) {
if (child_process_init() < 0)
goto finish;
- if (msntab_load(MSNTABLE) < 0)
+ if (msntab_load(args.msntab_arg ? args.msntab_arg : DEFAULT_MSNTABLE) < 0)
goto finish;
- if (modem_manager_init(CHANNELS) < 0)
+ if (modem_manager_init(args.channels_arg) < 0)
goto finish;
event_source->on_signal(event_source, SIGINT, oop_exit_cb, NULL);
@@ -65,6 +71,11 @@ int main_loop(void) {
event_source->on_signal(event_source, SIGUSR1, oop_dump_cb, NULL);
signal(SIGPIPE, SIG_IGN);
+ if (!args.no_daemon_flag) {
+ daemon_retval_send(0);
+ retval_sent = 1;
+ }
+
daemon_log(LOG_INFO, "Start up complete.");
if (oop_sys_run(sys) == OOP_ERROR) {
@@ -73,11 +84,14 @@ int main_loop(void) {
}
r = 0;
-
+
finish:
-
+
daemon_log(LOG_INFO, "Shutting down.");
+ if (!retval_sent && !args.no_daemon_flag)
+ daemon_retval_send(1);
+
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);
@@ -99,5 +113,71 @@ finish:
}
int main(int argc, char*argv[]) {
- return main_loop() < 0 ? 1 : 0;
+ pid_t pid;
+ int ret;
+
+ appname = daemon_pid_file_ident = daemon_log_ident = daemon_ident_from_argv0(argv[0]);
+
+ cmdline_parser(argc, argv, &args);
+
+ if (args.no_syslog_flag)
+ daemon_log_use = DAEMON_LOG_STDERR;
+
+ if (args.kill_flag) {
+ int ret;
+
+ if ((ret = daemon_pid_file_kill_wait(SIGINT, 5)) < 0)
+ daemon_log(LOG_WARNING, "Failed to kill daemon.");
+
+ return ret < 0 ? 1 : 0;
+ }
+
+ if (args.check_flag) {
+ if ((pid = daemon_pid_file_is_running()) >= 0)
+ daemon_log(LOG_INFO, "Daemon running on PID %u.", pid);
+ else
+ daemon_log(LOG_INFO, "Daemon not running.");
+
+ return 1;
+ }
+
+ if ((pid = daemon_pid_file_is_running()) >= 0) {
+ daemon_log(LOG_ERR, "Daemon already running on PID %u.", pid);
+ return 1;
+ }
+
+ if (!args.no_daemon_flag) {
+ daemon_retval_init();
+
+ if ((pid = daemon_fork()) < 0) {
+ daemon_retval_done();
+ return 1;
+ } else if (pid) {
+ int ret;
+
+ if ((ret = daemon_retval_wait(20)) < 0) {
+ daemon_log(LOG_ERR, "Failed to recieve return value from daemon process.");
+ return 255;
+ }
+
+ if (ret)
+ daemon_log(LOG_ERR, "Daemon returned %i as return value.", ret);
+ return ret;
+ }
+ }
+
+ if (daemon_pid_file_create() < 0) {
+ daemon_log(LOG_ERR, "Could not create PID file (%s).", strerror(errno));
+
+ if (!args.no_daemon_flag)
+ daemon_retval_send(1);
+
+ return 1;
+ }
+
+ ret = main_loop() < 0 ? 1 : 0;
+
+ daemon_pid_file_remove();
+ return ret;
}
+