static struct udev_queue_export *udev_queue_export;
static struct udev_ctrl *udev_ctrl;
static struct udev_monitor *monitor;
-static int worker_watch[2];
+static int worker_watch[2] = { -1, -1 };
static pid_t settle_pid;
static bool stop_exec_queue;
static bool reload_config;
};
static struct pollfd pfd[] = {
- [FD_NETLINK] = { .events = POLLIN },
- [FD_WORKER] = { .events = POLLIN },
- [FD_SIGNAL] = { .events = POLLIN },
- [FD_INOTIFY] = { .events = POLLIN },
- [FD_CONTROL] = { .events = POLLIN },
+ [FD_NETLINK] = { .events = POLLIN, .fd = -1 },
+ [FD_WORKER] = { .events = POLLIN, .fd = -1 },
+ [FD_SIGNAL] = { .events = POLLIN, .fd = -1 },
+ [FD_INOTIFY] = { .events = POLLIN, .fd = -1 },
+ [FD_CONTROL] = { .events = POLLIN, .fd = -1 },
};
enum event_state {
struct udev_list_entry *list_entry;
/* current database */
- util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.run/udev/db3", NULL);
+ util_strscpyl(filename, sizeof(filename), udev_get_run_path(udev), "/data", NULL);
if (access(filename, F_OK) >= 0)
return 0;
/* make sure we do not get here again */
- util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.run/udev/db3/", NULL);
util_create_path(udev, filename);
+ udev_selinux_setfscreatecon(udev, udev_get_run_path(udev), S_IFDIR|0755);
+ mkdir(filename, 0755);
+ udev_selinux_resetfscreatecon(udev);
/* old database */
util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.udev/db", NULL);
/* find old database with the encoded devpath name */
util_path_encode(udev_device_get_devpath(device), devpath, sizeof(devpath));
- util_strscpyl(from, sizeof(from), udev_get_dev_path(udev),
- "/.udev/db/", devpath, NULL);
+ util_strscpyl(from, sizeof(from), udev_get_dev_path(udev), "/.udev/db/", devpath, NULL);
if (lstat(from, &stats) == 0) {
if (!have_db) {
udev_device_read_db(device, from);
info(udev, "version %s\n", VERSION);
udev_selinux_init(udev);
+ /* make sure, that our runtime dir exists and is writable */
+ if (utimensat(AT_FDCWD, udev_get_run_config_path(udev), NULL, 0) < 0) {
+ /* try to create our own subdirectory, do not create parent directories */
+ udev_selinux_setfscreatecon(udev, udev_get_run_config_path(udev), S_IFDIR|0755);
+ mkdir(udev_get_run_config_path(udev), 0755);
+ udev_selinux_resetfscreatecon(udev);
+
+ if (utimensat(AT_FDCWD, udev_get_run_config_path(udev), NULL, 0) >= 0) {
+ /* directory seems writable now */
+ udev_set_run_path(udev, udev_get_run_config_path(udev));
+ } else {
+ /* fall back to /dev/.udev */
+ char filename[UTIL_PATH_SIZE];
+
+ util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.udev", NULL);
+ if (udev_set_run_path(udev, filename) == NULL)
+ goto exit;
+ }
+ }
+ info(udev, "runtime dir '%s'\n", udev_get_run_path(udev));
+
for (;;) {
int option;
if (write(STDERR_FILENO, 0, 0) < 0)
dup2(fd, STDERR_FILENO);
- udev_ctrl = udev_ctrl_new_from_socket(udev, UDEV_CTRL_SOCK_PATH);
+ /* udevadm control socket */
+ if (sd_listen_fds(true) == 1 && sd_is_socket(SD_LISTEN_FDS_START, AF_LOCAL, SOCK_DGRAM, -1))
+ udev_ctrl = udev_ctrl_new_from_fd(udev, SD_LISTEN_FDS_START);
+ else
+ udev_ctrl = udev_ctrl_new_from_socket(udev, UDEV_CTRL_SOCK_PATH);
if (udev_ctrl == NULL) {
- fprintf(stderr, "error initializing control socket");
- err(udev, "error initializing udevd socket");
+ fprintf(stderr, "error initializing udev control socket");
+ err(udev, "error initializing udev control socket");
rc = 1;
goto exit;
}
if (udev_ctrl_enable_receiving(udev_ctrl) < 0) {
- fprintf(stderr, "error binding control socket, seems udevd is already running\n");
- err(udev, "error binding control socket, seems udevd is already running\n");
+ fprintf(stderr, "error binding udev control socket\n");
+ err(udev, "error binding udev control socket\n");
rc = 1;
goto exit;
}
IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
/* watch dynamic rules directory */
- util_strscpyl(filename, sizeof(filename), udev_get_dev_path(udev), "/.run/udev/rules.d", NULL);
+ util_strscpyl(filename, sizeof(filename), udev_get_run_path(udev), "/rules.d", NULL);
if (stat(filename, &statbuf) != 0) {
util_create_path(udev, filename);
udev_selinux_setfscreatecon(udev, filename, S_IFDIR|0755);