summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2009-05-19 16:44:39 +0200
committerGravatar Nikias Bassen2009-05-19 16:44:39 +0200
commit0c55afdb315f12b0f2a37f37a3ec711c75507c0d (patch)
tree35ed260cae35d9a4744491452becbc0b3531e576 /src
parent5d34c2e7c70de039c75c7a39933b98d14a659176 (diff)
downloadusbmuxd-0c55afdb315f12b0f2a37f37a3ec711c75507c0d.tar.gz
usbmuxd-0c55afdb315f12b0f2a37f37a3ec711c75507c0d.tar.bz2
Let the daemon terminate only when no more device is attached
Diffstat (limited to 'src')
-rw-r--r--src/main.c45
1 files changed, 30 insertions, 15 deletions
diff --git a/src/main.c b/src/main.c
index b4b5283..3617e14 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1006,18 +1006,6 @@ static int daemonize()
return 0;
}
-/**
- * signal handler function for cleaning up properly
- */
-static void clean_exit(int sig)
-{
- if (sig == SIGINT) {
- if (verbose >= 1)
- fprintf(stderr, "CTRL+C pressed\n");
- }
- quit_flag = 1;
-}
-
static void usage()
{
printf("usage: usbmuxd [options]\n");
@@ -1093,6 +1081,33 @@ static int devices_attached()
}
/**
+ * signal handler function for cleaning up properly
+ */
+static void handle_signal(int sig)
+{
+ if (sig == SIGTERM) {
+ quit_flag = 1;
+ } else {
+ if (sig == SIGINT) {
+ if (verbose >= 1)
+ fprintf(stderr, "CTRL+C pressed\n");
+ }
+
+ if (verbose >= 1)
+ fprintf(stderr, "Checking if we can terminate (no more devices attached)...\n");
+
+ if (devices_attached() > 0) {
+ // we can't quit, there are still devices attached.
+ if (verbose >= 1)
+ fprintf(stderr, "Refusing to terminate, there are still devices attached. Kill me with signal 15 (TERM) to force quit.\n");
+ } else {
+ // it's safe to quit
+ quit_flag = 1;
+ }
+ }
+}
+
+/**
* main function. Initializes all stuff and then loops waiting in accept.
*/
int main(int argc, char **argv)
@@ -1121,9 +1136,9 @@ int main(int argc, char **argv)
logmsg(LOG_NOTICE, "starting");
// signal(SIGHUP, reload_conf); // none yet
- signal(SIGINT, clean_exit);
- signal(SIGQUIT, clean_exit);
- signal(SIGTERM, clean_exit);
+ signal(SIGINT, handle_signal);
+ signal(SIGQUIT, handle_signal);
+ signal(SIGTERM, handle_signal);
signal(SIGPIPE, SIG_IGN);
// check for other running instance