hotplug: terminate uloop after fork(), redirect stdin, out and err to /dev/null
authorJo-Philipp Wich <jow@openwrt.org>
Wed, 14 Aug 2013 19:04:31 +0000 (21:04 +0200)
committerJo-Philipp Wich <jow@openwrt.org>
Thu, 15 Aug 2013 10:30:51 +0000 (12:30 +0200)
hotplug.c

index 21efcf573cc3de3cb050553a733f54087bea102a..422e84987241b281cef7ebac9255cd31a25a9607 100644 (file)
--- a/hotplug.c
+++ b/hotplug.c
@@ -124,7 +124,7 @@ static void handle_exec(struct blob_attr *msg, struct blob_attr *data)
 {
        char *argv[8];
        struct blob_attr *cur;
-       int rem;
+       int rem, fd;
        int i = 0;
 
        blobmsg_for_each_attr(cur, msg, rem)
@@ -138,9 +138,14 @@ static void handle_exec(struct blob_attr *msg, struct blob_attr *data)
        }
 
        if (debug < 2) {
-               close(STDIN_FILENO);
-               close(STDOUT_FILENO);
-               close(STDERR_FILENO);
+               fd = open("/dev/null", O_RDWR);
+               if (fd > -1) {
+                       dup2(fd, STDIN_FILENO);
+                       dup2(fd, STDOUT_FILENO);
+                       dup2(fd, STDERR_FILENO);
+                       if (fd > STDERR_FILENO)
+                               close(fd);
+               }
        }
 
        if (i > 0) {
@@ -263,6 +268,7 @@ static void queue_next(void)
 
        queue_proc.pid = fork();
        if (!queue_proc.pid) {
+               uloop_done();
                c->handler(c->msg, c->data);
                exit(0);
        }