chiark / gitweb /
apply format char to variables exported by ENV
[elogind.git] / udevd.c
diff --git a/udevd.c b/udevd.c
index 9340be14cfd219d3b05c52a848f97e64edd05c43..b0c38eb41347ada9e082e51b8c25f2f7a801c2ef 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -130,7 +130,7 @@ static int udev_event_process(struct uevent_msg *msg)
                dbg("executing run list");
                list_for_each_entry(name_loop, &udev->run_list, node) {
                        if (strncmp(name_loop->name, "socket:", strlen("socket:")) == 0)
-                               pass_env_to_socket(&name_loop->name[strlen("socket:")], msg->devpath, msg->action);
+                               pass_env_to_socket(&name_loop->name[strlen("socket:")], udev->dev->devpath, udev->action);
                        else {
                                char program[PATH_SIZE];
 
@@ -279,8 +279,23 @@ static void udev_event_run(struct uevent_msg *msg)
 
 static void msg_queue_insert(struct uevent_msg *msg)
 {
+       char filename[PATH_SIZE];
+       int fd;
+
        msg->queue_time = time(NULL);
 
+       strlcpy(filename, udev_root, sizeof(filename));
+       strlcat(filename, "/" EVENT_SEQNUM, sizeof(filename));
+       fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0644);
+       if (fd > 0) {
+               char str[32];
+               int len;
+
+               len = sprintf(str, "%llu\n", msg->seqnum);
+               write(fd, str, len);
+               close(fd);
+       }
+
        export_event_state(msg, EVENT_QUEUED);
 
        /* run all events with a timeout set immediately */
@@ -921,12 +936,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[WRITE_END], F_SETFL, O_NONBLOCK);
+       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_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;
@@ -944,8 +971,12 @@ int main(int argc, char *argv[], char *envp[])
 
        /* watch rules directory */
        inotify_fd = inotify_init();
-       if (inotify_fd > 0)
+       if (inotify_fd >= 0)
                inotify_add_watch(inotify_fd, udev_rules_filename, IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
+       else if (errno == ENOSYS)
+               err("the kernel does not support inotify, udevd can't monitor configuration file changes");
+       else
+               err("inotify_init failed: %s", strerror(errno));
 
        /* maximum limit of forked childs */
        value = getenv("UDEVD_MAX_CHILDS");