test-copy: test that xattrs are properly copied
This commit is contained in:
parent
f9bbb4dcec
commit
83412d39de
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue