+ /* 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 */
+ mkdir(udev_get_run_config_path(udev), 0755);
+
+ 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;
+ mkdir(udev_get_run_path(udev), 0755);
+ err(udev, "error: runtime directory '%s' not writable, for now falling back to '%s'",
+ udev_get_run_config_path(udev), udev_get_run_path(udev));
+ }
+ }
+ /* relabel runtime dir only if it resides below /dev */
+ if (strncmp(udev_get_run_path(udev), udev_get_dev_path(udev), strlen(udev_get_dev_path(udev))) == 0)
+ udev_selinux_lsetfilecon(udev, udev_get_run_path(udev), 0755);
+ info(udev, "runtime dir '%s'\n", udev_get_run_path(udev));
+