X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udevd.c;h=b0c38eb41347ada9e082e51b8c25f2f7a801c2ef;hb=c6d4aeb930ae2da6114e551dadbed3e430b9cdf4;hp=9340be14cfd219d3b05c52a848f97e64edd05c43;hpb=3e5e833253a0683935808c90498b6c639be955fe;p=elogind.git diff --git a/udevd.c b/udevd.c index 9340be14c..b0c38eb41 100644 --- 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");