X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udevd.c;h=ff61c656c872c3d834efef79f6be1604136f9953;hp=e1afb7622b115fe1519a9f5ae42481fde525532c;hb=632b682b2a1b4b71500a633369668b0cc7379bcd;hpb=fc55cf68ca0c0db5172a9de7e827c6c3f7c2a308 diff --git a/udevd.c b/udevd.c index e1afb7622..ff61c656c 100644 --- a/udevd.c +++ b/udevd.c @@ -176,6 +176,7 @@ static void export_event_state(struct uevent_msg *msg, enum event_state state) switch (state) { case EVENT_QUEUED: unlink(filename_failed); + delete_path(filename_failed); strlcpy(target, sysfs_path, sizeof(target)); strlcat(target, msg->devpath, sizeof(target)); @@ -183,16 +184,26 @@ static void export_event_state(struct uevent_msg *msg, enum event_state state) symlink(target, filename); return; case EVENT_FINISHED: + case EVENT_FAILED: unlink(filename_failed); + delete_path(filename_failed); - /* don't remove if events for the same path are still pending */ + /* don't remove, if events for the same path are still pending */ list_for_each_entry(loop_msg, &running_list, node) if (loop_msg->devpath && strcmp(loop_msg->devpath, msg->devpath) == 0) return; - unlink(filename); - case EVENT_FAILED: - create_path(filename_failed); - rename(filename, filename_failed); + + /* move failed events to the failed directory */ + if (state == EVENT_FAILED) { + create_path(filename_failed); + rename(filename, filename_failed); + } else { + unlink(filename); + } + + /* clean up the queue directory */ + delete_path(filename); + return; } } @@ -540,7 +551,7 @@ static struct uevent_msg *get_udevd_msg(void) size = recvmsg(udevd_sock, &smsg, 0); if (size < 0) { if (errno != EINTR) - err("unable to receive udevd message: %s", strerror(errno)); + err("unable to receive user udevd message: %s", strerror(errno)); return NULL; } cmsg = CMSG_FIRSTHDR(&smsg); @@ -615,7 +626,7 @@ static struct uevent_msg *get_netlink_msg(void) size = recv(uevent_netlink_sock, &buffer, sizeof(buffer), 0); if (size < 0) { if (errno != EINTR) - err("unable to receive udevd message: %s", strerror(errno)); + err("unable to receive kernel netlink message: %s", strerror(errno)); return NULL; } @@ -705,6 +716,8 @@ static void reap_sigchilds(void) break; if (WIFEXITED(status)) status = WEXITSTATUS(status); + else if (WIFSIGNALED(status)) + status = WTERMSIG(status) + 128; else status = 0; udev_done(pid, status); @@ -966,13 +979,8 @@ int main(int argc, char *argv[], char *envp[]) /* get user socket message */ if (FD_ISSET(udevd_sock, &readfds)) { msg = get_udevd_msg(); - if (msg) { - if (msg->type == UDEVD_UEVENT_UDEVSEND && msg->seqnum != 0) { - info("skip non-kernel message with SEQNUM"); - free(msg); - } else - msg_queue_insert(msg); - } + if (msg) + msg_queue_insert(msg); } /* get kernel netlink message */