From f40988c7736333b67f55dcc9e3a3340f7793a16f Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Fri, 15 May 2020 12:32:28 +0200 Subject: [PATCH] process_utils: introduce new process_utils.{c,h} This will be the central place for all process management helpers. This also removes raw_syscalls.{c,h}. Signed-off-by: Christian Brauner --- configure.ac | 2 +- src/include/fexecve.c | 2 +- src/lxc/Makefile.am | 10 +- src/lxc/af_unix.c | 2 +- src/lxc/attach.c | 2 +- src/lxc/cmd/lxc_init.c | 2 +- src/lxc/cmd/lxc_monitord.c | 2 +- src/lxc/cmd/lxc_user_nic.c | 2 +- src/lxc/conf.c | 4 +- src/lxc/execute.c | 4 +- src/lxc/lsm/apparmor.c | 2 +- src/lxc/lxccontainer.c | 2 +- src/lxc/namespace.c | 27 --- src/lxc/namespace.h | 90 ------- src/lxc/network.c | 2 +- src/lxc/{raw_syscalls.c => process_utils.c} | 36 ++- src/lxc/process_utils.h | 248 ++++++++++++++++++++ src/lxc/raw_syscalls.h | 94 -------- src/lxc/rexec.c | 2 +- src/lxc/start.c | 2 +- src/lxc/utils.c | 2 +- src/lxc/utils.h | 2 +- src/tests/Makefile.am | 2 +- src/tests/lxc_raw_clone.c | 2 +- 24 files changed, 303 insertions(+), 242 deletions(-) rename src/lxc/{raw_syscalls.c => process_utils.c} (82%) create mode 100644 src/lxc/process_utils.h delete mode 100644 src/lxc/raw_syscalls.h diff --git a/configure.ac b/configure.ac index c55810831..7f589f940 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/src/include/fexecve.c b/src/include/fexecve.c index 123f27309..0627cc802 100644 --- a/src/include/fexecve.c +++ b/src/include/fexecve.c @@ -29,7 +29,7 @@ #include #include "config.h" #include "macro.h" -#include "raw_syscalls.h" +#include "process_utils.h" int fexecve(int fd, char *const argv[], char *const envp[]) { diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am index c374c2d0a..d1e23647e 100644 --- a/src/lxc/Makefile.am +++ b/src/lxc/Makefile.am @@ -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 \ diff --git a/src/lxc/af_unix.c b/src/lxc/af_unix.c index bf626a109..5cf54917f 100644 --- a/src/lxc/af_unix.c +++ b/src/lxc/af_unix.c @@ -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 diff --git a/src/lxc/attach.c b/src/lxc/attach.c index bbf95bd5b..57c7f4617 100644 --- a/src/lxc/attach.c +++ b/src/lxc/attach.c @@ -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" diff --git a/src/lxc/cmd/lxc_init.c b/src/lxc/cmd/lxc_init.c index a52793343..a03631f1a 100644 --- a/src/lxc/cmd/lxc_init.c +++ b/src/lxc/cmd/lxc_init.c @@ -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 */ diff --git a/src/lxc/cmd/lxc_monitord.c b/src/lxc/cmd/lxc_monitord.c index 7318df954..da7db2820 100644 --- a/src/lxc/cmd/lxc_monitord.c +++ b/src/lxc/cmd/lxc_monitord.c @@ -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 diff --git a/src/lxc/cmd/lxc_user_nic.c b/src/lxc/cmd/lxc_user_nic.c index edb2d8f03..4160565f3 100644 --- a/src/lxc/cmd/lxc_user_nic.c +++ b/src/lxc/cmd/lxc_user_nic.c @@ -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" diff --git a/src/lxc/conf.c b/src/lxc/conf.c index e2e2f9e97..5cbca6000 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -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; diff --git a/src/lxc/execute.c b/src/lxc/execute.c index 7dd835862..7175ef2cf 100644 --- a/src/lxc/execute.c +++ b/src/lxc/execute.c @@ -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]); diff --git a/src/lxc/lsm/apparmor.c b/src/lxc/lsm/apparmor.c index 4fc18eb43..cef95c854 100644 --- a/src/lxc/lsm/apparmor.c +++ b/src/lxc/lsm/apparmor.c @@ -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); diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 48018fe32..9c9d023b8 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -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" diff --git a/src/lxc/namespace.c b/src/lxc/namespace.c index 38d2ae5d7..f2e017563 100644 --- a/src/lxc/namespace.c +++ b/src/lxc/namespace.c @@ -21,33 +21,6 @@ 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 diff --git a/src/lxc/namespace.h b/src/lxc/namespace.h index a8fda783c..84976f60f 100644 --- a/src/lxc/namespace.h +++ b/src/lxc/namespace.h @@ -7,63 +7,6 @@ #include #include -#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); diff --git a/src/lxc/network.c b/src/lxc/network.c index a825180cf..eaab9eccf 100644 --- a/src/lxc/network.c +++ b/src/lxc/network.c @@ -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" diff --git a/src/lxc/raw_syscalls.c b/src/lxc/process_utils.c similarity index 82% rename from src/lxc/raw_syscalls.c rename to src/lxc/process_utils.c index 3c6bd2506..89abddec5 100644 --- a/src/lxc/raw_syscalls.c +++ b/src/lxc/process_utils.c @@ -13,15 +13,12 @@ #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 index 000000000..6016f792e --- /dev/null +++ b/src/lxc/process_utils.h @@ -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 +#include +#include +#include +#include +#include +#include + +#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 index 1219f28f4..000000000 --- a/src/lxc/raw_syscalls.h +++ /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 -#include -#include -#include -#include -#include -#include - -/* 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 */ diff --git a/src/lxc/rexec.c b/src/lxc/rexec.c index cd76efb3c..cf198c021 100644 --- a/src/lxc/rexec.c +++ b/src/lxc/rexec.c @@ -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" diff --git a/src/lxc/start.c b/src/lxc/start.c index ba92393eb..fa84461c3 100644 --- a/src/lxc/start.c +++ b/src/lxc/start.c @@ -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" diff --git a/src/lxc/utils.c b/src/lxc/utils.c index 2cf99945f..88d0f85ee 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -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" diff --git a/src/lxc/utils.h b/src/lxc/utils.h index 45ca5270d..cf2c04251 100644 --- a/src/lxc/utils.h +++ b/src/lxc/utils.h @@ -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 */ diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index 493b33c9d..69b8f30fb 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -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 diff --git a/src/tests/lxc_raw_clone.c b/src/tests/lxc_raw_clone.c index 655454f39..f72e20ccc 100644 --- a/src/tests/lxc_raw_clone.c +++ b/src/tests/lxc_raw_clone.c @@ -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[])