#include <fcntl.h>
#include <time.h>
#include <getopt.h>
+#include <dirent.h>
#include <sys/select.h>
#include <sys/wait.h>
#include <sys/stat.h>
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));
}
}
}
+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];
goto exit;
}
udev_list_init(&event_list);
+ cleanup_queue_dir(udev);
export_initial_seqnum(udev);
if (daemonize) {
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));
}
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");
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();