chiark / gitweb /
udevd: create queue file before daemonizing to reliably block 'settle'
authorKay Sievers <kay.sievers@vrfy.org>
Mon, 16 May 2011 11:17:48 +0000 (13:17 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Mon, 16 May 2011 11:17:48 +0000 (13:17 +0200)
udev/udevd.c

index be4b071..258d787 100644 (file)
@@ -1408,6 +1408,13 @@ int main(int argc, char *argv[])
 
        udev_monitor_set_receive_buffer_size(monitor, 128*1024*1024);
 
+       /* create queue file before signalling 'ready', to make sure we block 'settle' */
+       udev_queue_export = udev_queue_export_new(udev);
+       if (udev_queue_export == NULL) {
+               err(udev, "error creating queue file\n");
+               goto exit;
+       }
+
        if (daemonize) {
                pid_t pid;
                int fd;
@@ -1421,8 +1428,8 @@ int main(int argc, char *argv[])
                        rc = 4;
                        goto exit;
                default:
-                       rc = 0;
-                       goto exit;
+                       rc = EXIT_SUCCESS;
+                       goto exit_keep_queue;
                }
 
                setsid();
@@ -1521,12 +1528,6 @@ int main(int argc, char *argv[])
                goto exit;
        }
 
-       udev_queue_export = udev_queue_export_new(udev);
-       if (udev_queue_export == NULL) {
-               err(udev, "error creating queue file\n");
-               goto exit;
-       }
-
        memset(&ep_ctrl, 0, sizeof(struct epoll_event));
        ep_ctrl.events = EPOLLIN;
        ep_ctrl.data.fd = fd_ctrl;
@@ -1708,9 +1709,10 @@ int main(int argc, char *argv[])
                }
        }
 
-       udev_queue_export_cleanup(udev_queue_export);
-       rc = 0;
+       rc = EXIT_SUCCESS;
 exit:
+       udev_queue_export_cleanup(udev_queue_export);
+exit_keep_queue:
        if (fd_ep >= 0)
                close(fd_ep);
        worker_list_cleanup(udev);