summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--udev.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/udev.c b/udev.c
index 71c5f1fba5..1d66410b6c 100644
--- a/udev.c
+++ b/udev.c
@@ -28,6 +28,7 @@
#include <unistd.h>
#include <errno.h>
#include <ctype.h>
+#include <signal.h>
#include "udev.h"
#include "udev_version.h"
@@ -40,6 +41,22 @@
char **main_argv;
char **main_envp;
+static void sig_handler(int signum)
+{
+ dbg("caught signal %d", signum);
+ switch (signum) {
+ case SIGINT:
+ case SIGTERM:
+ case SIGKILL:
+ sysbus_disconnect();
+ udevdb_exit();
+ exit(20 + signum);
+ break;
+ default:
+ dbg("unhandled signal");
+ }
+}
+
static inline char *get_action(void)
{
char *action;
@@ -70,7 +87,11 @@ int main(int argc, char **argv, char **envp)
char *devpath;
char *subsystem;
int retval = -EINVAL;
-
+
+ signal(SIGINT, sig_handler);
+ signal(SIGTERM, sig_handler);
+ signal(SIGKILL, sig_handler);
+
main_argv = argv;
main_envp = envp;