summaryrefslogtreecommitdiffstats
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
parent5d34c2e7c70de039c75c7a39933b98d14a659176 (diff)
downloadusbmuxd-0c55afdb315f12b0f2a37f37a3ec711c75507c0d.tar.gz
usbmuxd-0c55afdb315f12b0f2a37f37a3ec711c75507c0d.tar.bz2
Let the daemon terminate only when no more device is attached
-rw-r--r--src/main.c45
-rw-r--r--udev/85-usbmuxd.rules.in2
2 files changed, 31 insertions, 16 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
diff --git a/udev/85-usbmuxd.rules.in b/udev/85-usbmuxd.rules.in
index e661ccd..7820a36 100644
--- a/udev/85-usbmuxd.rules.in
+++ b/udev/85-usbmuxd.rules.in
@@ -31,7 +31,7 @@ ACTION=="add", SUBSYSTEM=="usb_endpoint", KERNEL=="usbdev*_ep85", SYMLINK+="usbm
# Start and stop 'usbmuxd' as required.
ACTION=="add", SUBSYSTEM=="usb_endpoint", KERNEL=="usbdev*_ep85", RUN+="/sbin/start-stop-daemon --start --oknodo --exec @prefix@/sbin/usbmuxd"
-ACTION=="remove", SUBSYSTEM=="usb_endpoint", KERNEL=="usbdev*_ep85", RUN+="/sbin/start-stop-daemon --stop --signal 2 --exec @prefix@/sbin/usbmuxd"
+ACTION=="remove", SUBSYSTEM=="usb_endpoint", KERNEL=="usbdev*_ep85", RUN+="/sbin/start-stop-daemon --stop --signal 3 --exec @prefix@/sbin/usbmuxd"
# skip
LABEL="usbmuxd_rules_end"