]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-copy: test that xattrs are properly copied 14081/head
authorLennart Poettering <lennart@poettering.net>
Tue, 19 Nov 2019 14:16:46 +0000 (15:16 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 19 Nov 2019 14:44:58 +0000 (15:44 +0100)
src/test/test-copy.c

index ffabf95663ccfcc60e1caa8a3c70f8456740623d..68905c662d96ec5bde742c3582a557833b68eb7a 100644 (file)
@@ -1,5 +1,6 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
+#include <sys/xattr.h>
 #include <unistd.h>
 
 #include "alloc-util.h"
@@ -7,6 +8,7 @@
 #include "fd-util.h"
 #include "fileio.h"
 #include "fs-util.h"
+#include "hexdecoct.h"
 #include "log.h"
 #include "macro.h"
 #include "mkdir.h"
@@ -18,6 +20,7 @@
 #include "tmpfile-util.h"
 #include "user-util.h"
 #include "util.h"
+#include "xattr-util.h"
 
 static void test_copy_file(void) {
         _cleanup_free_ char *buf = NULL;
@@ -75,14 +78,16 @@ static void test_copy_file_fd(void) {
 }
 
 static void test_copy_tree(void) {
-        char original_dir[] = "/tmp/test-copy_tree/";
-        char copy_dir[] = "/tmp/test-copy_tree-copy/";
+        char original_dir[] = "/var/tmp/test-copy_tree/";
+        char copy_dir[] = "/var/tmp/test-copy_tree-copy/";
         char **files = STRV_MAKE("file", "dir1/file", "dir1/dir2/file", "dir1/dir2/dir3/dir4/dir5/file");
         char **links = STRV_MAKE("link", "file",
                                  "link2", "dir1/file");
-        char **p, **link;
         const char *unixsockp;
+        char **p, **link;
         struct stat st;
+        int xattr_worked = -1; /* xattr support is optional in temporary directories, hence use it if we can,
+                                * but don't fail if we can't */
 
         log_info("%s", __func__);
 
@@ -90,12 +95,19 @@ static void test_copy_tree(void) {
         (void) rm_rf(original_dir, REMOVE_ROOT|REMOVE_PHYSICAL);
 
         STRV_FOREACH(p, files) {
-                _cleanup_free_ char *f;
+                _cleanup_free_ char *f, *c;
+                int k;
 
                 assert_se(f = path_join(original_dir, *p));
 
                 assert_se(mkdir_parents(f, 0755) >= 0);
                 assert_se(write_string_file(f, "file", WRITE_STRING_FILE_CREATE) == 0);
+
+                assert_se(base64mem(*p, strlen(*p), &c) >= 0);
+
+                k = setxattr(f, "user.testxattr", c, strlen(c), 0);
+                assert_se(xattr_worked < 0 || ((k >= 0) == !!xattr_worked));
+                xattr_worked = k >= 0;
         }
 
         STRV_FOREACH_PAIR(link, p, links) {
@@ -114,14 +126,25 @@ static void test_copy_tree(void) {
         assert_se(copy_tree(original_dir, copy_dir, UID_INVALID, GID_INVALID, COPY_REFLINK|COPY_MERGE) == 0);
 
         STRV_FOREACH(p, files) {
-                _cleanup_free_ char *buf, *f;
+                _cleanup_free_ char *buf, *f, *c = NULL;
                 size_t sz;
+                int k;
 
                 assert_se(f = path_join(copy_dir, *p));
 
                 assert_se(access(f, F_OK) == 0);
                 assert_se(read_full_file(f, &buf, &sz) == 0);
                 assert_se(streq(buf, "file\n"));
+
+                k = getxattr_malloc(f, "user.testxattr", &c, false);
+                assert_se(xattr_worked < 0 || ((k >= 0) == !!xattr_worked));
+
+                if (k >= 0) {
+                        _cleanup_free_ char *d = NULL;
+
+                        assert_se(base64mem(*p, strlen(*p), &d) >= 0);
+                        assert_se(streq(d, c));
+                }
         }
 
         STRV_FOREACH_PAIR(link, p, links) {