]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tmpfiles: introduce copy_files() routine
authorFranck Bui <fbui@suse.com>
Thu, 12 Apr 2018 10:19:22 +0000 (12:19 +0200)
committerFranck Bui <fbui@suse.com>
Mon, 30 Jul 2018 13:54:02 +0000 (15:54 +0200)
No functional changes.

src/tmpfiles/tmpfiles.c

index 36784a3ad9b2759e4bcf794ef3d0213a5c0db591..06ae67b40312b1edb4ec0870f37f1290e90e531a 100644 (file)
@@ -1459,6 +1459,41 @@ static int truncate_file(Item *i, const char *path) {
         return fd_set_perms(i, fd, st);
 }
 
+static int copy_files(Item *i) {
+        struct stat st;
+        int r;
+
+        log_debug("Copying tree \"%s\" to \"%s\".", i->argument, i->path);
+
+        r = copy_tree(i->argument, i->path,
+                      i->uid_set ? i->uid : UID_INVALID,
+                      i->gid_set ? i->gid : GID_INVALID,
+                      COPY_REFLINK);
+
+        if (r == -EROFS && stat(i->path, &st) == 0)
+                r = -EEXIST;
+
+        if (r < 0) {
+                struct stat a, b;
+
+                if (r != -EEXIST)
+                        return log_error_errno(r, "Failed to copy files to %s: %m", i->path);
+
+                if (stat(i->argument, &a) < 0)
+                        return log_error_errno(errno, "stat(%s) failed: %m", i->argument);
+
+                if (stat(i->path, &b) < 0)
+                        return log_error_errno(errno, "stat(%s) failed: %m", i->path);
+
+                if ((a.st_mode ^ b.st_mode) & S_IFMT) {
+                        log_debug("Can't copy to %s, file exists already and is of different type", i->path);
+                        return 0;
+                }
+        }
+
+        return path_set_perms(i, i->path);
+}
+
 typedef int (*action_t)(Item *, const char *);
 typedef int (*fdaction_t)(Item *, int fd, const struct stat *st);
 
@@ -1627,37 +1662,9 @@ static int create_item(Item *i) {
                 RUN_WITH_UMASK(0000)
                         (void) mkdir_parents_label(i->path, 0755);
 
-                log_debug("Copying tree \"%s\" to \"%s\".", i->argument, i->path);
-                r = copy_tree(i->argument, i->path,
-                              i->uid_set ? i->uid : UID_INVALID,
-                              i->gid_set ? i->gid : GID_INVALID,
-                              COPY_REFLINK);
-
-                if (r == -EROFS && stat(i->path, &st) == 0)
-                        r = -EEXIST;
-
-                if (r < 0) {
-                        struct stat a, b;
-
-                        if (r != -EEXIST)
-                                return log_error_errno(r, "Failed to copy files to %s: %m", i->path);
-
-                        if (stat(i->argument, &a) < 0)
-                                return log_error_errno(errno, "stat(%s) failed: %m", i->argument);
-
-                        if (stat(i->path, &b) < 0)
-                                return log_error_errno(errno, "stat(%s) failed: %m", i->path);
-
-                        if ((a.st_mode ^ b.st_mode) & S_IFMT) {
-                                log_debug("Can't copy to %s, file exists already and is of different type", i->path);
-                                return 0;
-                        }
-                }
-
-                r = path_set_perms(i, i->path);
+                r = copy_files(i);
                 if (r < 0)
                         return r;
-
                 break;
 
         case WRITE_FILE: