#include "log.h"
#include "macro.h"
+#include "process-util.h"
/**
* raw_clone() - uses clone to create a new process with clone flags
[files('test-ratelimit.c')],
+ [files('test-raw-clone.c')],
+
[files('test-limits-util.c')],
[files('test-util.c')],
--- /dev/null
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include "errno-util.h"
+#include "format-util.h"
+#include "missing_syscall.h"
+#include "raw-clone.h"
+#include "tests.h"
+
+TEST(raw_clone) {
+ pid_t parent, pid, pid2;
+
+ parent = getpid();
+ log_info("before clone: getpid()→"PID_FMT, parent);
+ assert_se(raw_getpid() == parent);
+
+ pid = raw_clone(0);
+ assert_se(pid >= 0);
+
+ pid2 = raw_getpid();
+ log_info("raw_clone: "PID_FMT" getpid()→"PID_FMT" raw_getpid()→"PID_FMT,
+ pid, getpid(), pid2);
+ if (pid == 0) {
+ assert_se(pid2 != parent);
+ _exit(EXIT_SUCCESS);
+ } else {
+ int status;
+
+ assert_se(pid2 == parent);
+ waitpid(pid, &status, __WCLONE);
+ assert_se(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
+ }
+
+ errno = 0;
+ assert_se(raw_clone(CLONE_FS|CLONE_NEWNS) == -1);
+ assert_se(errno == EINVAL || ERRNO_IS_PRIVILEGE(errno)); /* Certain container environments prohibit namespaces to us, don't fail in that case */
+}
+
+DEFINE_TEST_MAIN(LOG_INFO);
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include <errno.h>
-#include <sys/wait.h>
-#include <unistd.h>
#include "fileio.h"
#include "fs-util.h"
assert_se(!eqzero(longer));
}
-TEST(raw_clone) {
- pid_t parent, pid, pid2;
-
- parent = getpid();
- log_info("before clone: getpid()→"PID_FMT, parent);
- assert_se(raw_getpid() == parent);
-
- pid = raw_clone(0);
- assert_se(pid >= 0);
-
- pid2 = raw_getpid();
- log_info("raw_clone: "PID_FMT" getpid()→"PID_FMT" raw_getpid()→"PID_FMT,
- pid, getpid(), pid2);
- if (pid == 0) {
- assert_se(pid2 != parent);
- _exit(EXIT_SUCCESS);
- } else {
- int status;
-
- assert_se(pid2 == parent);
- waitpid(pid, &status, __WCLONE);
- assert_se(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
- }
-
- errno = 0;
- assert_se(raw_clone(CLONE_FS|CLONE_NEWNS) == -1);
- assert_se(errno == EINVAL || ERRNO_IS_PRIVILEGE(errno)); /* Certain container environments prohibit namespaces to us, don't fail in that case */
-}
-
DEFINE_TEST_MAIN(LOG_INFO);