chiark / gitweb /
udevd: remove left-over SIGALRM
[elogind.git] / udev / udevd.c
index b8513e11fe658c7d2cafe2a43e5088a2c8e8e58c..e7384e19a2431b1007680bc10e4290647dfcc9a1 100644 (file)
@@ -365,9 +365,6 @@ static void worker_new(struct event *event)
                                                switch (fdsi.ssi_signo) {
                                                case SIGTERM:
                                                        goto out;
-                                               case SIGALRM:
-                                                       rc = EXIT_FAILURE;
-                                                       goto out;
                                                }
                                        }
                                }
@@ -809,15 +806,29 @@ static void handle_signal(struct udev *udev, int signo)
 
                                if (worker->pid != pid)
                                        continue;
-
                                info(udev, "worker [%u] exit\n", pid);
+
+                               if (WIFEXITED(status)) {
+                                       if (WEXITSTATUS(status) != 0)
+                                               err(udev, "worker [%u] exit with return code %i\n", pid, WEXITSTATUS(status));
+                               } else if (WIFSIGNALED(status)) {
+                                       err(udev, "worker [%u] terminated by signal %i (%s)\n",
+                                           pid, WTERMSIG(status), strsignal(WTERMSIG(status)));
+                               } else if (WIFSTOPPED(status)) {
+                                       err(udev, "worker [%u] stopped\n", pid);
+                               } else if (WIFCONTINUED(status)) {
+                                       err(udev, "worker [%u] continued\n", pid);
+                               } else {
+                                       err(udev, "worker [%u] exit with status 0x%04x\n", pid, status);
+                               }
+
                                if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
-                                       err(udev, "worker [%u] unexpectedly returned with status 0x%04x\n", pid, status);
                                        if (worker->event != NULL) {
-                                               err(udev, "worker [%u] failed while handling '%s'\n", pid, worker->event->devpath);
+                                               err(udev, "worker [%u] failed while handling '%s'\n",
+                                                   pid, worker->event->devpath);
                                                worker->event->exitcode = -32;
                                                event_queue_delete(worker->event, true);
-                                               /* drop reference from running event */
+                                               /* drop reference taken for state 'running' */
                                                worker_unref(worker);
                                        }
                                }
@@ -1394,6 +1405,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;
@@ -1407,8 +1425,8 @@ int main(int argc, char *argv[])
                        rc = 4;
                        goto exit;
                default:
-                       rc = 0;
-                       goto exit;
+                       rc = EXIT_SUCCESS;
+                       goto exit_keep_queue;
                }
 
                setsid();
@@ -1507,12 +1525,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;
@@ -1694,9 +1706,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);