From: Kay Sievers Date: Wed, 24 Aug 2005 22:38:25 +0000 (+0200) Subject: udevmonitor: cleanup on exit X-Git-Tag: 174~2605 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=9ae611be33c29d5d9b51bca281408d407dcf007f;hp=8d77c6a383ed1b308ce73e97b9f02f767b012921 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 --- 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;