X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Fudevd.c;h=15a197e561e1674d91b478b072763f2baff9f374;hb=0bf41e6c24ac3d8cea08dd965e29b0d66ef51f1a;hp=9096f9505be922df85cd26ea2e2b518d8a95b46c;hpb=27691aa3ae65b2162e12b5f1d657363908263e12;p=elogind.git diff --git a/udev/udevd.c b/udev/udevd.c index 9096f9505..15a197e56 100644 --- a/udev/udevd.c +++ b/udev/udevd.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -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)); } @@ -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) { @@ -955,7 +988,7 @@ exit: if (inotify_fd >= 0) close(inotify_fd); udev_monitor_unref(kernel_monitor); - + cleanup_queue_dir(udev); udev_selinux_exit(udev); udev_unref(udev); logging_close();