X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Fudevd.c;h=993964d23d39f2fb1485dc8c8725af7e4202df86;hb=64be143742a487e826068e906d1bfb180acdb0ae;hp=6f2e188ceaaa07a198f3a337a7a7cca126dfad72;hpb=0bc74ea79f68a89c5ec4bf5676dede97626ceade;p=elogind.git diff --git a/udev/udevd.c b/udev/udevd.c index 6f2e188ce..993964d23 100644 --- a/udev/udevd.c +++ b/udev/udevd.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -180,7 +181,7 @@ static void event_fork(struct udev_event *event) if (debug_trace) { event->trace = 1; - printf("fork %s (%llu)\n", + fprintf(stderr, "fork %s (%llu)\n", udev_device_get_syspath(event->dev), udev_device_get_seqnum(event->dev)); } @@ -430,7 +431,6 @@ static void event_queue_manager(struct udev *udev) continue; } - /* do dendencies, start event */ event_fork(loop_event); dbg(udev, "moved seq %llu to running list\n", udev_device_get_seqnum(loop_event->dev)); } @@ -538,7 +538,7 @@ static void udev_done(int pid, int exitstatus) exitstatus, time(NULL) - loop_event->queue_time); loop_event->exitstatus = exitstatus; if (debug_trace) - printf("exit %s (%llu)\n", + fprintf(stderr, "exit %s (%llu)\n", udev_device_get_syspath(loop_event->dev), udev_device_get_seqnum(loop_event->dev)); event_queue_delete(loop_event); @@ -570,6 +570,38 @@ static void reap_sigchilds(void) } } +static void cleanup_queue_dir(struct udev *udev) +{ + char dirname[UTIL_PATH_SIZE]; + char filename[UTIL_PATH_SIZE]; + DIR *dir; + + util_strlcpy(filename, udev_get_dev_path(udev), sizeof(filename)); + util_strlcat(filename, "/.udev/uevent_seqnum", sizeof(filename)); + unlink(filename); + + util_strlcpy(dirname, udev_get_dev_path(udev), sizeof(dirname)); + util_strlcat(dirname, "/.udev/queue", sizeof(dirname)); + dir = opendir(dirname); + if (dir != NULL) { + while (1) { + struct dirent *dent; + + dent = readdir(dir); + if (dent == NULL || dent->d_name[0] == '\0') + break; + if (dent->d_name[0] == '.') + continue; + util_strlcpy(filename, dirname, sizeof(filename)); + util_strlcat(filename, "/", sizeof(filename)); + util_strlcat(filename, dent->d_name, sizeof(filename)); + unlink(filename); + } + closedir(dir); + rmdir(dirname); + } +} + static void export_initial_seqnum(struct udev *udev) { char filename[UTIL_PATH_SIZE]; @@ -733,6 +765,7 @@ int main(int argc, char *argv[]) goto exit; } udev_list_init(&event_list); + cleanup_queue_dir(udev); export_initial_seqnum(udev); if (daemonize) { @@ -790,9 +823,10 @@ int main(int argc, char *argv[]) util_strlcat(path, "/class/mem/null", sizeof(path)); if (lstat(path, &statbuf) == 0) { if (S_ISDIR(statbuf.st_mode)) { - const char *depr_str = "<6>udev: deprecated sysfs layout (kernel too old, " - "or CONFIG_SYSFS_DEPRECATED) is unsupported, some " - "udev features may fail\n"; + const char *depr_str = + "<6>udev: deprecated sysfs layout; update the kernel or " + "disable CONFIG_SYSFS_DEPRECATED; some udev features will " + "not work correctly\n"; write(fd, depr_str, strlen(depr_str)); } @@ -831,7 +865,7 @@ int main(int argc, char *argv[]) IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE); } } else if (errno == ENOSYS) - err(udev, "the kernel does not support inotify, udevd can't monitor rules file changes\n"); + info(udev, "unable to use inotify, udevd will not monitor rule files changes\n"); else err(udev, "inotify_init failed: %m\n"); @@ -941,21 +975,18 @@ int main(int argc, char *argv[]) event_queue_manager(udev); } } + cleanup_queue_dir(udev); rc = 0; - exit: udev_rules_unref(rules); - if (signal_pipe[READ_END] >= 0) close(signal_pipe[READ_END]); if (signal_pipe[WRITE_END] >= 0) close(signal_pipe[WRITE_END]); - udev_ctrl_unref(udev_ctrl); if (inotify_fd >= 0) close(inotify_fd); udev_monitor_unref(kernel_monitor); - udev_selinux_exit(udev); udev_unref(udev); logging_close();