chiark / gitweb /
correct use of fcntl()
[elogind.git] / udevd.c
diff --git a/udevd.c b/udevd.c
index 3f4605ed1196af539a1757504ae39c763b400faf..701165b9ad0df601ecb53dcf53480843634ae0f9 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -100,6 +100,13 @@ static int udev_event_process(struct uevent_msg *msg)
        act.sa_flags = 0;
        sigaction(SIGALRM, &act, NULL);
 
+       /* reset to default */
+       act.sa_handler = SIG_DFL;
+       sigaction(SIGINT, &act, NULL);
+       sigaction(SIGTERM, &act, NULL);
+       sigaction(SIGCHLD, &act, NULL);
+       sigaction(SIGHUP, &act, NULL);
+
        /* trigger timeout to prevent hanging processes */
        alarm(UDEV_ALARM_TIMEOUT);
 
@@ -200,6 +207,10 @@ static void export_event_state(struct uevent_msg *msg, enum event_state state)
                        if (loop_msg->devpath && strcmp(loop_msg->devpath, msg->devpath) == 0)
                                return;
 
+               list_for_each_entry(loop_msg, &exec_list, node)
+                       if (loop_msg->devpath && strcmp(loop_msg->devpath, msg->devpath) == 0)
+                               return;
+
                /* move failed events to the failed directory */
                if (state == EVENT_FAILED) {
                        create_path(filename_failed);
@@ -910,12 +921,24 @@ int main(int argc, char *argv[], char *envp[])
                err("error getting pipes: %s", strerror(errno));
                goto exit;
        }
-       retval = fcntl(signal_pipe[READ_END], F_SETFL, O_NONBLOCK);
+
+       retval = fcntl(signal_pipe[READ_END], F_GETFL, 0);
+       if (retval < 0) {
+               err("error fcntl on read pipe: %s", strerror(errno));
+               goto exit;
+       }
+       retval = fcntl(signal_pipe[READ_END], F_SETFL, retval | O_NONBLOCK);
        if (retval < 0) {
                err("error fcntl on read pipe: %s", strerror(errno));
                goto exit;
        }
-       retval = fcntl(signal_pipe[WRITE_END], F_SETFL, O_NONBLOCK);
+
+       retval = fcntl(signal_pipe[WRITE_END], F_GETFL, 0);
+       if (retval < 0) {
+               err("error fcntl on write pipe: %s", strerror(errno));
+               goto exit;
+       }
+       retval = fcntl(signal_pipe[WRITE_END], F_SETFL, retval | O_NONBLOCK);
        if (retval < 0) {
                err("error fcntl on write pipe: %s", strerror(errno));
                goto exit;