]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tmpfiles: introduce empty_directory()
authorFranck Bui <fbui@suse.com>
Thu, 26 Apr 2018 13:45:17 +0000 (15:45 +0200)
committerFranck Bui <fbui@suse.com>
Mon, 30 Jul 2018 13:54:03 +0000 (15:54 +0200)
src/tmpfiles/tmpfiles.c

index 9e007d54e6e95a5a5087e46d31ccf3418c908e3c..7b8c4bb53ff6f7bd61a9f3ffeb679c8b80ad2640 100644 (file)
@@ -866,40 +866,15 @@ static int path_open_parent_safe(const char *path) {
 
 static int path_set_perms(Item *i, const char *path) {
         _cleanup_close_ int fd = -1;
-        struct stat stbuf, *st = NULL;
 
         assert(i);
         assert(path);
 
         fd = open(path, O_NOFOLLOW|O_CLOEXEC|O_PATH);
-        if (fd < 0) {
-                int level = LOG_ERR, r = -errno;
-
-                /* Option "e" operates only on existing objects. Do not
-                 * print errors about non-existent files or directories */
-                if (i->type == EMPTY_DIRECTORY && errno == ENOENT) {
-                        level = LOG_DEBUG;
-                        r = 0;
-                }
-
-                log_full_errno(level, errno, "Adjusting owner and mode for %s failed: %m", path);
-                return r;
-        }
-
-        if (i->type == EMPTY_DIRECTORY) {
-                /* FIXME: introduce fd_is_dir() helper ? */
-                if (fstat(fd, &stbuf) < 0)
-                        return log_error_errno(errno, "Failed to fstat() file %s: %m", path);
-
-                if (!S_ISDIR(stbuf.st_mode)) {
-                        log_error("'%s' already exists and is not a directory. ", path);
-                        return -EEXIST;
-                }
-
-                st = &stbuf;
-        }
+        if (fd < 0)
+                return log_error_errno(errno, "Failed to open \"%s\" to adjust permissions: %m", path);
 
-        return fd_set_perms(i, fd, st);
+        return fd_set_perms(i, fd, NULL);
 }
 
 static int parse_xattrs_from_arg(Item *i) {
@@ -1642,6 +1617,29 @@ static int create_subvolume(Item *i, const char *path) {
         return r;
 }
 
+static int empty_directory(Item *i, const char *path) {
+        int r;
+
+        assert(i);
+        assert(i->type == EMPTY_DIRECTORY);
+
+        r = is_dir(path, false);
+        if (r == -ENOENT) {
+                /* Option "e" operates only on existing objects. Do not
+                 * print errors about non-existent files or directories */
+                log_debug("Skipping missing directory: %s", path);
+                return 0;
+        }
+        if (r < 0)
+                return log_error_errno(r, "is_dir() failed on path %s: %m", path);
+        if (r == 0) {
+                log_error("'%s' already exists and is not a directory.", path);
+                return -EEXIST;
+        }
+
+        return path_set_perms(i, path);
+}
+
 static int create_device(Item *i, mode_t file_type) {
         _cleanup_close_ int dfd = -1, fd = -1;
         CreationMode creation;
@@ -1901,7 +1899,7 @@ static int create_item(Item *i) {
                 break;
 
         case EMPTY_DIRECTORY:
-                r = glob_item(i, path_set_perms);
+                r = glob_item(i, empty_directory);
                 if (r < 0)
                         return r;
                 break;