]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
process_utils: introduce new process_utils.{c,h}
authorChristian Brauner <christian.brauner@ubuntu.com>
Fri, 15 May 2020 10:32:28 +0000 (12:32 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Fri, 15 May 2020 10:32:28 +0000 (12:32 +0200)
This will be the central place for all process management helpers. This also
removes raw_syscalls.{c,h}.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
24 files changed:
configure.ac
src/include/fexecve.c
src/lxc/Makefile.am
src/lxc/af_unix.c
src/lxc/attach.c
src/lxc/cmd/lxc_init.c
src/lxc/cmd/lxc_monitord.c
src/lxc/cmd/lxc_user_nic.c
src/lxc/conf.c
src/lxc/execute.c
src/lxc/lsm/apparmor.c
src/lxc/lxccontainer.c
src/lxc/namespace.c
src/lxc/namespace.h
src/lxc/network.c
src/lxc/process_utils.c [moved from src/lxc/raw_syscalls.c with 82% similarity]
src/lxc/process_utils.h [new file with mode: 0644]
src/lxc/raw_syscalls.h [deleted file]
src/lxc/rexec.c
src/lxc/start.c
src/lxc/utils.c
src/lxc/utils.h
src/tests/Makefile.am
src/tests/lxc_raw_clone.c

index c55810831ec996ab10721c1214db6b7d5cd3bcab..7f589f9405e88d96d3f56346145631678720ff05 100644 (file)
@@ -622,7 +622,7 @@ AC_CHECK_HEADER([ifaddrs.h],
 AC_HEADER_MAJOR
 
 # Check for some syscalls functions
-AC_CHECK_FUNCS([setns pivot_root sethostname unshare rand_r confstr faccessat gettid memfd_create move_mount open_tree])
+AC_CHECK_FUNCS([setns pivot_root sethostname unshare rand_r confstr faccessat gettid memfd_create move_mount open_tree execveat])
 
 # Check for strerror_r() support. Defines:
 # - HAVE_STRERROR_R if available
index 123f273098dd820afdb0fc2826e89d1d931a97ec..0627cc802d4b2da2bc7535a9f1d429f534cfb149 100644 (file)
@@ -29,7 +29,7 @@
 #include <fcntl.h>
 #include "config.h"
 #include "macro.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 
 int fexecve(int fd, char *const argv[], char *const envp[])
 {
index c374c2d0ac7e6eb0798fa7d9b3418413aca5d7f0..d1e23647e04e1fe971faac423056937b8ed3fb7d 100644 (file)
@@ -27,7 +27,7 @@ noinst_HEADERS = api_extensions.h \
                 memory_utils.h \
                 monitor.h \
                 namespace.h \
-                raw_syscalls.h \
+                process_utils.h \
                 rexec.h \
                 start.h \
                 state.h \
@@ -128,7 +128,7 @@ liblxc_la_SOURCES = af_unix.c af_unix.h \
                    network.c network.h \
                    monitor.c monitor.h \
                    parse.c parse.h \
-                   raw_syscalls.c raw_syscalls.h \
+                   process_utils.c process_utils.h \
                    ringbuf.c ringbuf.h \
                    rtnl.c rtnl.h \
                    state.c state.h \
@@ -384,7 +384,7 @@ init_lxc_SOURCES = cmd/lxc_init.c \
                   initutils.c initutils.h \
                   memory_utils.h \
                   parse.c parse.h \
-                  raw_syscalls.c raw_syscalls.h \
+                  process_utils.c process_utils.h \
                   syscall_numbers.h \
                   string_utils.c string_utils.h
 
@@ -395,7 +395,7 @@ lxc_monitord_SOURCES = cmd/lxc_monitord.c \
                       log.c log.h \
                       mainloop.c mainloop.h \
                       monitor.c monitor.h \
-                      raw_syscalls.c raw_syscalls.h \
+                      process_utils.c process_utils.h \
                       syscall_numbers.h \
                       utils.c utils.h
 lxc_user_nic_SOURCES = cmd/lxc_user_nic.c \
@@ -404,7 +404,7 @@ lxc_user_nic_SOURCES = cmd/lxc_user_nic.c \
                       memory_utils.h \
                       network.c network.h \
                       parse.c parse.h \
-                      raw_syscalls.c raw_syscalls.h \
+                      process_utils.c process_utils.h \
                       syscall_numbers.h \
                       file_utils.c file_utils.h \
                       string_utils.c string_utils.h \
index bf626a109e77dd48ff234ef3e364fe1f207e9b53..5cf54917f1b3b1cbc58ef3a94add620365712e53 100644 (file)
@@ -18,7 +18,7 @@
 #include "log.h"
 #include "macro.h"
 #include "memory_utils.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "utils.h"
 
 #ifndef HAVE_STRLCPY
index bbf95bd5b6f072b32888e9ab6f21b2a048875b63..57c7f461703d788a0551210675bb79e72741d0f4 100644 (file)
@@ -40,7 +40,7 @@
 #include "mainloop.h"
 #include "memory_utils.h"
 #include "namespace.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "syscall_wrappers.h"
 #include "terminal.h"
 #include "utils.h"
index a52793343a1fc4b023ab1149757912c730911b68..a03631f1a4243288d193995fb5fa519572dca825 100644 (file)
@@ -28,7 +28,7 @@
 #include "initutils.h"
 #include "memory_utils.h"
 #include "parse.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "string_utils.h"
 
 /* option keys for long only options */
index 7318df9542816f0f3f46b2b6a2bd6e391838404b..da7db282077700fe9082627cb707e8847be71bd4 100644 (file)
@@ -28,7 +28,7 @@
 #include "log.h"
 #include "mainloop.h"
 #include "monitor.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "utils.h"
 
 #define CLIENTFDS_CHUNK 64
index edb2d8f03fb80d164672716470e8da9f9c488c69..4160565f36b288dbcfd2d55af13fba6920feb34b 100644 (file)
@@ -36,7 +36,7 @@
 #include "memory_utils.h"
 #include "network.h"
 #include "parse.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "string_utils.h"
 #include "syscall_wrappers.h"
 #include "utils.h"
index e2e2f9e97a44894e2571cb37ceb599d7196354ae..5cbca60006d8a2d59d14815c10117278850d5379 100644 (file)
@@ -51,7 +51,7 @@
 #include "namespace.h"
 #include "network.h"
 #include "parse.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "ringbuf.h"
 #include "start.h"
 #include "storage.h"
@@ -3245,7 +3245,7 @@ static bool verify_start_hooks(struct lxc_conf *conf)
 
 static bool execveat_supported(void)
 {
-       lxc_raw_execveat(-1, "", NULL, NULL, AT_EMPTY_PATH);
+       execveat(-1, "", NULL, NULL, AT_EMPTY_PATH);
        if (errno == ENOSYS)
                return false;
 
index 7dd835862f4b610a67c91a689180c70427248d8e..7175ef2cf209561f8982bf0e5f1091c7fe3fa7d3 100644 (file)
@@ -14,7 +14,7 @@
 #include "config.h"
 #include "log.h"
 #include "start.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "utils.h"
 
 lxc_log_define(execute, start);
@@ -66,7 +66,7 @@ static int execute_start(struct lxc_handler *handler, void* data)
        NOTICE("Exec'ing \"%s\"", my_args->argv[0]);
 
        if (my_args->init_fd >= 0)
-               lxc_raw_execveat(my_args->init_fd, "", argv, environ, AT_EMPTY_PATH);
+               execveat(my_args->init_fd, "", argv, environ, AT_EMPTY_PATH);
        else
                execvp(argv[0], argv);
        SYSERROR("Failed to exec %s", argv[0]);
index 4fc18eb43812c00611ba0e96d55b6dd524b3c0c0..cef95c854243e3f43513721fb49d7ae6c9f11702 100644 (file)
@@ -19,7 +19,7 @@
 #include "log.h"
 #include "lsm.h"
 #include "parse.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "utils.h"
 
 lxc_log_define(apparmor, lsm);
index 48018fe3292aacc888683f2b3039d8db36c52ce9..9c9d023b874227e221884e58b4cf27667f1bbd52 100644 (file)
@@ -49,7 +49,7 @@
 #include "namespace.h"
 #include "network.h"
 #include "parse.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "start.h"
 #include "state.h"
 #include "storage.h"
index 38d2ae5d71416fcf3ade1f92be8ad840ff2a147b..f2e01756303c30db6a980ca364fb696f13defc27 100644 (file)
 
 lxc_log_define(namespace, lxc);
 
-/*
- * Let's use the "standard stack limit" (i.e. glibc thread size default) for
- * stack sizes: 8MB.
- */
-#define __LXC_STACK_SIZE (8 * 1024 * 1024)
-pid_t lxc_clone(int (*fn)(void *), void *arg, int flags, int *pidfd)
-{
-       pid_t ret;
-       void *stack;
-
-       stack = malloc(__LXC_STACK_SIZE);
-       if (!stack) {
-               SYSERROR("Failed to allocate clone stack");
-               return -ENOMEM;
-       }
-
-#ifdef __ia64__
-       ret = __clone2(fn, stack, __LXC_STACK_SIZE, flags | SIGCHLD, arg, pidfd);
-#else
-       ret = clone(fn, stack + __LXC_STACK_SIZE, flags | SIGCHLD, arg, pidfd);
-#endif
-       if (ret < 0)
-               SYSERROR("Failed to clone (%#x)", flags);
-
-       return ret;
-}
-
 /* Leave the user namespace at the first position in the array of structs so
  * that we always attach to it first when iterating over the struct and using
  * setns() to switch namespaces. This especially affects lxc_attach(): Suppose
index a8fda783c30910c9b45790183d6704a5e4321d05..84976f60f29247cace426ae217506b25ba8e502b 100644 (file)
@@ -7,63 +7,6 @@
 #include <unistd.h>
 #include <sys/syscall.h>
 
-#ifndef CLONE_PARENT_SETTID
-#define CLONE_PARENT_SETTID 0x00100000
-#endif
-
-#ifndef CLONE_CHILD_CLEARTID
-#define CLONE_CHILD_CLEARTID 0x00200000
-#endif
-
-#ifndef CLONE_CHILD_SETTID
-#define CLONE_CHILD_SETTID 0x01000000
-#endif
-
-#ifndef CLONE_VFORK
-#define CLONE_VFORK 0x00004000
-#endif
-
-#ifndef CLONE_THREAD
-#define CLONE_THREAD 0x00010000
-#endif
-
-#ifndef CLONE_SETTLS
-#define CLONE_SETTLS 0x00080000
-#endif
-
-#ifndef CLONE_VM
-#define CLONE_VM 0x00000100
-#endif
-
-#ifndef CLONE_FILES
-#define CLONE_FILES 0x00000400
-#endif
-
-#ifndef CLONE_FS
-#  define CLONE_FS                0x00000200
-#endif
-#ifndef CLONE_NEWNS
-#  define CLONE_NEWNS             0x00020000
-#endif
-#ifndef CLONE_NEWCGROUP
-#  define CLONE_NEWCGROUP         0x02000000
-#endif
-#ifndef CLONE_NEWUTS
-#  define CLONE_NEWUTS            0x04000000
-#endif
-#ifndef CLONE_NEWIPC
-#  define CLONE_NEWIPC            0x08000000
-#endif
-#ifndef CLONE_NEWUSER
-#  define CLONE_NEWUSER           0x10000000
-#endif
-#ifndef CLONE_NEWPID
-#  define CLONE_NEWPID            0x20000000
-#endif
-#ifndef CLONE_NEWNET
-#  define CLONE_NEWNET            0x40000000
-#endif
-
 enum {
        LXC_NS_USER,
        LXC_NS_MNT,
@@ -82,39 +25,6 @@ extern const struct ns_info {
        const char *env_name;
 } ns_info[LXC_NS_MAX];
 
-#if defined(__ia64__)
-int __clone2(int (*__fn) (void *__arg), void *__child_stack_base,
-             size_t __child_stack_size, int __flags, void *__arg, ...);
-#else
-int clone(int (*fn)(void *), void *child_stack,
-       int flags, void *arg, ...
-       /* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
-#endif
-
-/**
- * lxc_clone() - create a new process
- *
- * - allocate stack:
- *   This function allocates a new stack the size of page and passes it to the
- *   kernel.
- *
- * - support all CLONE_*flags:
- *   This function supports all CLONE_* flags. If in doubt or not sufficiently
- *   familiar with process creation in the kernel and interactions with libcs
- *   this function should be used.
- *
- * - pthread_atfork() handlers depending on libc:
- *   Whether this function runs pthread_atfork() handlers depends on the
- *   corresponding libc wrapper. glibc currently does not run pthread_atfork()
- *   handlers but does not guarantee that they are not. Other libcs might or
- *   might not run pthread_atfork() handlers. If you require guarantees please
- *   refer to the lxc_raw_clone*() functions in raw_syscalls.{c,h}.
- *
- * - should call lxc_raw_getpid():
- *   The child should use lxc_raw_getpid() to retrieve its pid.
- */
-extern pid_t lxc_clone(int (*fn)(void *), void *arg, int flags, int *pidfd);
-
 extern int lxc_namespace_2_cloneflag(const char *namespace);
 extern int lxc_namespace_2_ns_idx(const char *namespace);
 extern int lxc_namespace_2_std_identifiers(char *namespaces);
index a825180cf7a39a687bff97d9fcc1f9aec4a2dda6..eaab9eccfee2f644bd234b1d39f5a77f34913ddf 100644 (file)
@@ -36,7 +36,7 @@
 #include "memory_utils.h"
 #include "network.h"
 #include "nl.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "syscall_wrappers.h"
 #include "utils.h"
 
similarity index 82%
rename from src/lxc/raw_syscalls.c
rename to src/lxc/process_utils.c
index 3c6bd2506d9ca7ff477377d77decd18efd1a25e4..89abddec54d19f01e5444809ce9a7c0c591898d7 100644 (file)
 
 #include "compiler.h"
 #include "config.h"
+#include "log.h"
 #include "macro.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "syscall_numbers.h"
 
-int lxc_raw_execveat(int dirfd, const char *pathname, char *const argv[],
-                    char *const envp[], int flags)
-{
-       return syscall(__NR_execveat, dirfd, pathname, argv, envp, flags);
-}
+lxc_log_define(process_utils, lxc);
 
 /*
  * This is based on raw_clone in systemd but adapted to our needs. This uses
@@ -124,3 +121,30 @@ int lxc_raw_pidfd_send_signal(int pidfd, int sig, siginfo_t *info,
 {
        return syscall(__NR_pidfd_send_signal, pidfd, sig, info, flags);
 }
+
+/*
+ * Let's use the "standard stack limit" (i.e. glibc thread size default) for
+ * stack sizes: 8MB.
+ */
+#define __LXC_STACK_SIZE (8 * 1024 * 1024)
+pid_t lxc_clone(int (*fn)(void *), void *arg, int flags, int *pidfd)
+{
+       pid_t ret;
+       void *stack;
+
+       stack = malloc(__LXC_STACK_SIZE);
+       if (!stack) {
+               SYSERROR("Failed to allocate clone stack");
+               return -ENOMEM;
+       }
+
+#ifdef __ia64__
+       ret = __clone2(fn, stack, __LXC_STACK_SIZE, flags | SIGCHLD, arg, pidfd);
+#else
+       ret = clone(fn, stack + __LXC_STACK_SIZE, flags | SIGCHLD, arg, pidfd);
+#endif
+       if (ret < 0)
+               SYSERROR("Failed to clone (%#x)", flags);
+
+       return ret;
+}
diff --git a/src/lxc/process_utils.h b/src/lxc/process_utils.h
new file mode 100644 (file)
index 0000000..6016f79
--- /dev/null
@@ -0,0 +1,248 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+
+#ifndef __LXC_PROCESS_UTILS_H
+#define __LXC_PROCESS_UTILS_H
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+#include <sched.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+#ifndef CSIGNAL
+#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
+#endif
+
+#ifndef CLONE_VM
+#define CLONE_VM 0x00000100 /* set if VM shared between processes */
+#endif
+
+#ifndef CLONE_FS
+#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
+#endif
+
+#ifndef CLONE_FILES
+#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
+#endif
+
+#ifndef CLONE_SIGHAND
+#define CLONE_SIGHAND 0x00000800 /* set if signal handlers and blocked signals shared */
+#endif
+
+#ifndef CLONE_PIDFD
+#define CLONE_PIDFD 0x00001000 /* set if a pidfd should be placed in parent */
+#endif
+
+#ifndef CLONE_PTRACE
+#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
+#endif
+
+#ifndef CLONE_VFORK
+#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
+#endif
+
+#ifndef CLONE_PARENT
+#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
+#endif
+
+#ifndef CLONE_THREAD
+#define CLONE_THREAD 0x00010000 /* Same thread group? */
+#endif
+
+#ifndef CLONE_NEWNS
+#define CLONE_NEWNS 0x00020000 /* New mount namespace group */
+#endif
+
+#ifndef CLONE_SYSVSEM
+#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
+#endif
+
+#ifndef CLONE_SETTLS
+#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
+#endif
+
+#ifndef CLONE_PARENT_SETTID
+#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
+#endif
+
+#ifndef CLONE_CHILD_CLEARTID
+#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
+#endif
+
+#ifndef CLONE_DETACHED
+#define CLONE_DETACHED 0x00400000 /* Unused, ignored */
+#endif
+
+#ifndef CLONE_UNTRACED
+#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
+#endif
+
+#ifndef CLONE_CHILD_SETTID
+#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
+#endif
+
+#ifndef CLONE_NEWCGROUP
+#define CLONE_NEWCGROUP 0x02000000 /* New cgroup namespace */
+#endif
+
+#ifndef CLONE_NEWUTS
+#define CLONE_NEWUTS 0x04000000 /* New utsname namespace */
+#endif
+
+#ifndef CLONE_NEWIPC
+#define CLONE_NEWIPC 0x08000000 /* New ipc namespace */
+#endif
+
+#ifndef CLONE_NEWUSER
+#define CLONE_NEWUSER 0x10000000 /* New user namespace */
+#endif
+
+#ifndef CLONE_NEWPID
+#define CLONE_NEWPID 0x20000000 /* New pid namespace */
+#endif
+
+#ifndef CLONE_NEWNET
+#define CLONE_NEWNET 0x40000000 /* New network namespace */
+#endif
+
+#ifndef CLONE_IO
+#define CLONE_IO 0x80000000 /* Clone io context */
+#endif
+
+/* Flags for the clone3() syscall. */
+#ifndef CLONE_CLEAR_SIGHAND
+#define CLONE_CLEAR_SIGHAND 0x100000000ULL /* Clear any signal handler and reset to SIG_DFL. */
+#endif
+
+#ifndef CLONE_INTO_CGROUP
+#define CLONE_INTO_CGROUP 0x200000000ULL /* Clone into a specific cgroup given the right permissions. */
+#endif
+
+/*
+ * cloning flags intersect with CSIGNAL so can be used with unshare and clone3
+ * syscalls only:
+ */
+#ifndef CLONE_NEWTIME
+#define CLONE_NEWTIME 0x00000080 /* New time namespace */
+#endif
+
+/* waitid */
+#ifndef P_PIDFD
+#define P_PIDFD 3
+#endif
+
+
+#if defined(__ia64__)
+int __clone2(int (*__fn)(void *__arg), void *__child_stack_base,
+            size_t __child_stack_size, int __flags, void *__arg, ...);
+#else
+int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ...
+         /* pid_t *ptid, struct user_desc *tls, pid_t *ctid */);
+#endif
+
+/**
+ * lxc_clone() - create a new process
+ *
+ * - allocate stack:
+ *   This function allocates a new stack the size of page and passes it to the
+ *   kernel.
+ *
+ * - support all CLONE_*flags:
+ *   This function supports all CLONE_* flags. If in doubt or not sufficiently
+ *   familiar with process creation in the kernel and interactions with libcs
+ *   this function should be used.
+ *
+ * - pthread_atfork() handlers depending on libc:
+ *   Whether this function runs pthread_atfork() handlers depends on the
+ *   corresponding libc wrapper. glibc currently does not run pthread_atfork()
+ *   handlers but does not guarantee that they are not. Other libcs might or
+ *   might not run pthread_atfork() handlers. If you require guarantees please
+ *   refer to the lxc_raw_clone*() functions in process_utils.{c,h}.
+ *
+ * - should call lxc_raw_getpid():
+ *   The child should use lxc_raw_getpid() to retrieve its pid.
+ */
+extern pid_t lxc_clone(int (*fn)(void *), void *arg, int flags, int *pidfd);
+
+
+/*
+ * lxc_raw_clone() - create a new process
+ *
+ * - fork() behavior:
+ *   This function returns 0 in the child and > 0 in the parent.
+ *
+ * - copy-on-write:
+ *   This function does not allocate a new stack and relies on copy-on-write
+ *   semantics.
+ *
+ * - supports subset of ClONE_* flags:
+ *   lxc_raw_clone() intentionally only supports a subset of the flags available
+ *   to the actual system call. Please refer to the implementation what flags
+ *   cannot be used. Also, please don't assume that just because a flag isn't
+ *   explicitly checked for as being unsupported that it is supported. If in
+ *   doubt or not sufficiently familiar with process creation in the kernel and
+ *   interactions with libcs this function should be used.
+ *
+ * - no pthread_atfork() handlers:
+ *   This function circumvents - as much as this this is possible - any libc
+ *   wrappers and thus does not run any pthread_atfork() handlers. Make sure
+ *   that this is safe to do in the context you are trying to call this
+ *   function.
+ *
+ * - must call lxc_raw_getpid():
+ *   The child must use lxc_raw_getpid() to retrieve its pid.
+ */
+extern pid_t lxc_raw_clone(unsigned long flags, int *pidfd);
+
+/*
+ * lxc_raw_clone_cb() - create a new process
+ *
+ * - non-fork() behavior:
+ *   Function does return pid of the child or -1 on error. Pass in a callback
+ *   function via the "fn" argument that gets executed in the child process.
+ *   The "args" argument is passed to "fn".
+ *
+ * All other comments that apply to lxc_raw_clone() apply to lxc_raw_clone_cb()
+ * as well.
+ */
+extern pid_t lxc_raw_clone_cb(int (*fn)(void *), void *args,
+                             unsigned long flags, int *pidfd);
+
+#ifndef HAVE_EXECVEAT
+static inline int execveat(int dirfd, const char *pathname, char *const argv[],
+                          char *const envp[], int flags)
+{
+       return syscall(__NR_execveat, dirfd, pathname, argv, envp, flags);
+}
+#else
+extern int execveat(int dirfd, const char *pathname, char *const argv[],
+                   char *const envp[], int flags);
+#endif
+
+/*
+ * Because of older glibc's pid cache (up to 2.25) whenever clone() is called
+ * the child must must retrieve it's own pid via lxc_raw_getpid().
+ */
+static inline pid_t lxc_raw_getpid(void)
+{
+       return (pid_t)syscall(SYS_getpid);
+}
+
+static inline pid_t lxc_raw_gettid(void)
+{
+#if __NR_gettid > 0
+       return syscall(__NR_gettid);
+#else
+       return lxc_raw_getpid();
+#endif
+}
+
+extern int lxc_raw_pidfd_send_signal(int pidfd, int sig, siginfo_t *info,
+                                    unsigned int flags);
+
+#endif /* __LXC_PROCESS_UTILS_H */
diff --git a/src/lxc/raw_syscalls.h b/src/lxc/raw_syscalls.h
deleted file mode 100644 (file)
index 1219f28..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1+ */
-
-#ifndef __LXC_RAW_SYSCALL_H
-#define __LXC_RAW_SYSCALL_H
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE 1
-#endif
-#include <sched.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <sys/syscall.h>
-#include <unistd.h>
-
-/* clone */
-#ifndef CLONE_PIDFD
-#define CLONE_PIDFD 0x00001000
-#endif
-
-/* waitid */
-#ifndef P_PIDFD
-#define P_PIDFD 3
-#endif
-
-/*
- * lxc_raw_clone() - create a new process
- *
- * - fork() behavior:
- *   This function returns 0 in the child and > 0 in the parent.
- *
- * - copy-on-write:
- *   This function does not allocate a new stack and relies on copy-on-write
- *   semantics.
- *
- * - supports subset of ClONE_* flags:
- *   lxc_raw_clone() intentionally only supports a subset of the flags available
- *   to the actual system call. Please refer to the implementation what flags
- *   cannot be used. Also, please don't assume that just because a flag isn't
- *   explicitly checked for as being unsupported that it is supported. If in
- *   doubt or not sufficiently familiar with process creation in the kernel and
- *   interactions with libcs this function should be used.
- *
- * - no pthread_atfork() handlers:
- *   This function circumvents - as much as this this is possible - any libc
- *   wrappers and thus does not run any pthread_atfork() handlers. Make sure
- *   that this is safe to do in the context you are trying to call this
- *   function.
- *
- * - must call lxc_raw_getpid():
- *   The child must use lxc_raw_getpid() to retrieve its pid.
- */
-extern pid_t lxc_raw_clone(unsigned long flags, int *pidfd);
-
-/*
- * lxc_raw_clone_cb() - create a new process
- *
- * - non-fork() behavior:
- *   Function does return pid of the child or -1 on error. Pass in a callback
- *   function via the "fn" argument that gets executed in the child process.
- *   The "args" argument is passed to "fn".
- *
- * All other comments that apply to lxc_raw_clone() apply to lxc_raw_clone_cb()
- * as well.
- */
-extern pid_t lxc_raw_clone_cb(int (*fn)(void *), void *args,
-                             unsigned long flags, int *pidfd);
-
-extern int lxc_raw_execveat(int dirfd, const char *pathname, char *const argv[],
-                           char *const envp[], int flags);
-
-/*
- * Because of older glibc's pid cache (up to 2.25) whenever clone() is called
- * the child must must retrieve it's own pid via lxc_raw_getpid().
- */
-static inline pid_t lxc_raw_getpid(void)
-{
-       return (pid_t)syscall(SYS_getpid);
-}
-
-static inline pid_t lxc_raw_gettid(void)
-{
-#if __NR_gettid > 0
-       return syscall(__NR_gettid);
-#else
-       return lxc_raw_getpid();
-#endif
-}
-
-extern int lxc_raw_pidfd_send_signal(int pidfd, int sig, siginfo_t *info,
-                                    unsigned int flags);
-
-#endif /* __LXC_RAW_SYSCALL_H */
index cd76efb3c4c5f94d9f6e40bfd3356af02678662f..cf198c02111d96bd10ef4955fca62cc59c552cd1 100644 (file)
@@ -13,7 +13,7 @@
 #include "file_utils.h"
 #include "macro.h"
 #include "memory_utils.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "string_utils.h"
 #include "syscall_wrappers.h"
 
index ba92393ebfb99e400c1fde1e2d1e0897ff792916..fa84461c306a12dcee41cdd9d05ff7d9ecd95bcb 100644 (file)
@@ -47,7 +47,7 @@
 #include "monitor.h"
 #include "namespace.h"
 #include "network.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "start.h"
 #include "storage/storage.h"
 #include "storage/storage_utils.h"
index 2cf99945fbdf95c3a87abf3a9368b8ba111d05e1..88d0f85ee5b98cc0d6ec603f375a51916bdc9e41 100644 (file)
@@ -35,7 +35,7 @@
 #include "memory_utils.h"
 #include "namespace.h"
 #include "parse.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "syscall_wrappers.h"
 #include "utils.h"
 
index 45ca5270ded83bfa23fbc402d6624a1b3444b796..cf2c04251bc1e6baff29339f498e2c888ea7bc0d 100644 (file)
@@ -25,7 +25,7 @@
 #include "initutils.h"
 #include "macro.h"
 #include "memory_utils.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "string_utils.h"
 
 /* returns 1 on success, 0 if there were any failures */
index 493b33c9d865b035c4f6a662c9c932ea6448d217..69b8f30fbcaa1df3b6b8e5c91abf24083721750b 100644 (file)
@@ -30,7 +30,7 @@ lxc_test_parse_config_file_SOURCES = parse_config_file.c \
 lxc_test_raw_clone_SOURCES = lxc_raw_clone.c \
                             lxctest.h \
                             ../lxc/namespace.c ../lxc/namespace.h \
-                            ../lxc/raw_syscalls.c ../lxc/raw_syscalls.h
+                            ../lxc/process_utils.c ../lxc/process_utils.h
                             ../lxc/utils.c ../lxc/utils.h
 lxc_test_reboot_SOURCES = reboot.c
 lxc_test_saveconfig_SOURCES = saveconfig.c
index 655454f39529ae66975ec0049611c4061baac067..f72e20cccda6e4c16b09aff7d586800cfd839953 100644 (file)
@@ -39,7 +39,7 @@
 
 #include "lxctest.h"
 #include "namespace.h"
-#include "raw_syscalls.h"
+#include "process_utils.h"
 #include "utils.h"
 
 int main(int argc, char *argv[])