Merge pull request #10996 from poettering/oci-prep
Preparation for the nspawn-OCI work
This commit is contained in:
@@ -156,6 +156,10 @@ tests += [
|
||||
[],
|
||||
[]],
|
||||
|
||||
[['src/test/test-dev-setup.c'],
|
||||
[],
|
||||
[]],
|
||||
|
||||
[['src/test/test-capability.c'],
|
||||
[],
|
||||
[libcap]],
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1+ */
|
||||
|
||||
#include "capability-util.h"
|
||||
#include "dev-setup.h"
|
||||
#include "fileio.h"
|
||||
#include "fs-util.h"
|
||||
#include "path-util.h"
|
||||
#include "rm-rf.h"
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
_cleanup_(rm_rf_physical_and_freep) char *p = NULL;
|
||||
const char *f;
|
||||
struct stat st;
|
||||
|
||||
if (have_effective_cap(CAP_DAC_OVERRIDE) <= 0)
|
||||
return EXIT_TEST_SKIP;
|
||||
|
||||
assert_se(mkdtemp_malloc("/tmp/test-dev-setupXXXXXX", &p) >= 0);
|
||||
|
||||
f = prefix_roota(p, "/run");
|
||||
assert_se(mkdir(f, 0755) >= 0);
|
||||
|
||||
assert_se(make_inaccessible_nodes(p, 1, 1) >= 0);
|
||||
|
||||
f = prefix_roota(p, "/run/systemd/inaccessible/reg");
|
||||
assert_se(stat(f, &st) >= 0);
|
||||
assert_se(S_ISREG(st.st_mode));
|
||||
assert_se((st.st_mode & 07777) == 0000);
|
||||
|
||||
f = prefix_roota(p, "/run/systemd/inaccessible/dir");
|
||||
assert_se(stat(f, &st) >= 0);
|
||||
assert_se(S_ISDIR(st.st_mode));
|
||||
assert_se((st.st_mode & 07777) == 0000);
|
||||
|
||||
f = prefix_roota(p, "/run/systemd/inaccessible/fifo");
|
||||
assert_se(stat(f, &st) >= 0);
|
||||
assert_se(S_ISFIFO(st.st_mode));
|
||||
assert_se((st.st_mode & 07777) == 0000);
|
||||
|
||||
f = prefix_roota(p, "/run/systemd/inaccessible/sock");
|
||||
assert_se(stat(f, &st) >= 0);
|
||||
assert_se(S_ISSOCK(st.st_mode));
|
||||
assert_se((st.st_mode & 07777) == 0000);
|
||||
|
||||
f = prefix_roota(p, "/run/systemd/inaccessible/chr");
|
||||
if (stat(f, &st) < 0)
|
||||
assert_se(errno == ENOENT);
|
||||
else {
|
||||
assert_se(S_ISCHR(st.st_mode));
|
||||
assert_se((st.st_mode & 07777) == 0000);
|
||||
}
|
||||
|
||||
f = prefix_roota(p, "/run/systemd/inaccessible/blk");
|
||||
if (stat(f, &st) < 0)
|
||||
assert_se(errno == ENOENT);
|
||||
else {
|
||||
assert_se(S_ISBLK(st.st_mode));
|
||||
assert_se((st.st_mode & 07777) == 0000);
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
@@ -726,10 +726,12 @@ static void test_parse_dev(void) {
|
||||
assert_se(parse_dev("5", &dev) == -EINVAL);
|
||||
assert_se(parse_dev("5:", &dev) == -EINVAL);
|
||||
assert_se(parse_dev(":5", &dev) == -EINVAL);
|
||||
assert_se(parse_dev("-1:-1", &dev) == -EINVAL);
|
||||
#if SIZEOF_DEV_T < 8
|
||||
assert_se(parse_dev("4294967295:4294967295", &dev) == -EINVAL);
|
||||
#endif
|
||||
assert_se(parse_dev("8:11", &dev) >= 0 && major(dev) == 8 && minor(dev) == 11);
|
||||
assert_se(parse_dev("0:0", &dev) >= 0 && major(dev) == 0 && minor(dev) == 0);
|
||||
}
|
||||
|
||||
static void test_parse_errno(void) {
|
||||
|
||||
@@ -567,6 +567,43 @@ static void test_path_startswith_set(void) {
|
||||
assert_se(streq_ptr(PATH_STARTSWITH_SET("/foo2/bar", "/foo/quux", "", "/zzz"), NULL));
|
||||
}
|
||||
|
||||
static void test_path_join_many(void) {
|
||||
char *j;
|
||||
|
||||
assert_se(streq_ptr(j = path_join_many("", NULL), ""));
|
||||
free(j);
|
||||
|
||||
assert_se(streq_ptr(j = path_join_many("foo", NULL), "foo"));
|
||||
free(j);
|
||||
|
||||
assert_se(streq_ptr(j = path_join_many("foo", "bar"), "foo/bar"));
|
||||
free(j);
|
||||
|
||||
assert_se(streq_ptr(j = path_join_many("", "foo", "", "bar", ""), "foo/bar"));
|
||||
free(j);
|
||||
|
||||
assert_se(streq_ptr(j = path_join_many("", "", "", "", "foo", "", "", "", "bar", "", "", ""), "foo/bar"));
|
||||
free(j);
|
||||
|
||||
assert_se(streq_ptr(j = path_join_many("", "/", "", "/foo/", "", "/", "", "/bar/", "", "/", ""), "//foo///bar//"));
|
||||
free(j);
|
||||
|
||||
assert_se(streq_ptr(j = path_join_many("/", "foo", "/", "bar", "/"), "/foo/bar/"));
|
||||
free(j);
|
||||
|
||||
assert_se(streq_ptr(j = path_join_many("foo", "bar", "baz"), "foo/bar/baz"));
|
||||
free(j);
|
||||
|
||||
assert_se(streq_ptr(j = path_join_many("foo/", "bar", "/baz"), "foo/bar/baz"));
|
||||
free(j);
|
||||
|
||||
assert_se(streq_ptr(j = path_join_many("foo/", "/bar/", "/baz"), "foo//bar//baz"));
|
||||
free(j);
|
||||
|
||||
assert_se(streq_ptr(j = path_join_many("//foo/", "///bar/", "///baz//"), "//foo////bar////baz//"));
|
||||
free(j);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
test_setup_logging(LOG_DEBUG);
|
||||
|
||||
@@ -588,6 +625,7 @@ int main(int argc, char **argv) {
|
||||
test_skip_dev_prefix();
|
||||
test_empty_or_root();
|
||||
test_path_startswith_set();
|
||||
test_path_join_many();
|
||||
|
||||
test_systemd_installation_has_version(argv[1]); /* NULL is OK */
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "missing.h"
|
||||
#include "mountpoint-util.h"
|
||||
#include "stat-util.h"
|
||||
#include "path-util.h"
|
||||
|
||||
static void test_files_same(void) {
|
||||
_cleanup_close_ int fd = -1;
|
||||
@@ -81,12 +82,87 @@ static void test_fd_is_network_ns(void) {
|
||||
assert_se(IN_SET(fd_is_network_ns(fd), 1, -EUCLEAN));
|
||||
}
|
||||
|
||||
static void test_device_major_minor_valid(void) {
|
||||
/* on glibc dev_t is 64bit, even though in the kernel it is only 32bit */
|
||||
assert_cc(sizeof(dev_t) == sizeof(uint64_t));
|
||||
|
||||
assert_se(DEVICE_MAJOR_VALID(0U));
|
||||
assert_se(DEVICE_MINOR_VALID(0U));
|
||||
|
||||
assert_se(DEVICE_MAJOR_VALID(1U));
|
||||
assert_se(DEVICE_MINOR_VALID(1U));
|
||||
|
||||
assert_se(!DEVICE_MAJOR_VALID(-1U));
|
||||
assert_se(!DEVICE_MINOR_VALID(-1U));
|
||||
|
||||
assert_se(DEVICE_MAJOR_VALID(1U << 10));
|
||||
assert_se(DEVICE_MINOR_VALID(1U << 10));
|
||||
|
||||
assert_se(DEVICE_MAJOR_VALID((1U << 12) - 1));
|
||||
assert_se(DEVICE_MINOR_VALID((1U << 20) - 1));
|
||||
|
||||
assert_se(!DEVICE_MAJOR_VALID((1U << 12)));
|
||||
assert_se(!DEVICE_MINOR_VALID((1U << 20)));
|
||||
|
||||
assert_se(!DEVICE_MAJOR_VALID(1U << 25));
|
||||
assert_se(!DEVICE_MINOR_VALID(1U << 25));
|
||||
|
||||
assert_se(!DEVICE_MAJOR_VALID(UINT32_MAX));
|
||||
assert_se(!DEVICE_MINOR_VALID(UINT32_MAX));
|
||||
|
||||
assert_se(!DEVICE_MAJOR_VALID(UINT64_MAX));
|
||||
assert_se(!DEVICE_MINOR_VALID(UINT64_MAX));
|
||||
|
||||
assert_se(DEVICE_MAJOR_VALID(major(0)));
|
||||
assert_se(DEVICE_MINOR_VALID(minor(0)));
|
||||
}
|
||||
|
||||
static void test_device_path_make_canonical_one(const char *path) {
|
||||
_cleanup_free_ char *resolved = NULL, *raw = NULL;
|
||||
struct stat st;
|
||||
dev_t devno;
|
||||
mode_t mode;
|
||||
int r;
|
||||
|
||||
assert_se(stat(path, &st) >= 0);
|
||||
r = device_path_make_canonical(st.st_mode, st.st_rdev, &resolved);
|
||||
if (r == -ENOENT) /* maybe /dev/char/x:y and /dev/block/x:y are missing in this test environment, because we
|
||||
* run in a container or so? */
|
||||
return;
|
||||
|
||||
assert_se(r >= 0);
|
||||
assert_se(path_equal(path, resolved));
|
||||
|
||||
assert_se(device_path_make_major_minor(st.st_mode, st.st_rdev, &raw) >= 0);
|
||||
assert_se(device_path_parse_major_minor(raw, &mode, &devno) >= 0);
|
||||
|
||||
assert_se(st.st_rdev == devno);
|
||||
assert_se((st.st_mode & S_IFMT) == (mode & S_IFMT));
|
||||
}
|
||||
|
||||
static void test_device_path_make_canonical(void) {
|
||||
|
||||
test_device_path_make_canonical_one("/dev/null");
|
||||
test_device_path_make_canonical_one("/dev/zero");
|
||||
test_device_path_make_canonical_one("/dev/full");
|
||||
test_device_path_make_canonical_one("/dev/random");
|
||||
test_device_path_make_canonical_one("/dev/urandom");
|
||||
test_device_path_make_canonical_one("/dev/tty");
|
||||
|
||||
if (is_device_node("/run/systemd/inaccessible/chr") > 0) {
|
||||
test_device_path_make_canonical_one("/run/systemd/inaccessible/chr");
|
||||
test_device_path_make_canonical_one("/run/systemd/inaccessible/blk");
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
test_files_same();
|
||||
test_is_symlink();
|
||||
test_path_is_fs_type();
|
||||
test_path_is_temporary_fs();
|
||||
test_fd_is_network_ns();
|
||||
test_device_major_minor_valid();
|
||||
test_device_path_make_canonical();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user