From 9ae611be33c29d5d9b51bca281408d407dcf007f Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Thu, 25 Aug 2005 00:38:25 +0200 Subject: [PATCH] udevmonitor: cleanup on exit We want to write the output buffer before we exit, otherwise redirection to a file does not work correctly. Signed-off-by: Kay Sievers --- udevmonitor.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/udevmonitor.c b/udevmonitor.c index 9fe6da906..33dff2a13 100644 --- a/udevmonitor.c +++ b/udevmonitor.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -38,6 +39,7 @@ static int uevent_netlink_sock; static int udev_monitor_sock; +static volatile int udev_exit; static int init_udev_monitor_socket(void) { @@ -101,8 +103,15 @@ static int init_uevent_netlink_sock(void) return 0; } +static void asmlinkage sig_handler(int signum) +{ + if (signum == SIGINT || signum == SIGTERM) + udev_exit = 1; +} + int main(int argc, char *argv[]) { + struct sigaction act; int env = 0; fd_set readfds; int i; @@ -129,6 +138,14 @@ int main(int argc, char *argv[]) exit(2); } + /* set signal handlers */ + memset(&act, 0x00, sizeof(struct sigaction)); + act.sa_handler = (void (*)(int)) sig_handler; + sigemptyset(&act.sa_mask); + act.sa_flags = SA_RESTART; + sigaction(SIGINT, &act, NULL); + sigaction(SIGTERM, &act, NULL); + retval = init_udev_monitor_socket(); if (retval) goto out; @@ -139,7 +156,7 @@ int main(int argc, char *argv[]) printf("udevmonitor prints the received event from the kernel [UEVENT]\n" "and the event which udev sends out after rule processing [UDEV]\n\n"); - while (1) { + while (!udev_exit) { static char buf[UEVENT_BUFFER_SIZE*2]; ssize_t buflen; int fdcount; -- 2.30.2