From: Christian Brauner Date: Fri, 15 Dec 2017 16:35:43 +0000 (+0100) Subject: namespace: add lxc_raw_clone_cb() X-Git-Tag: lxc-2.0.10~451 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=14c678f1cb3d05c10e4b13d674c937384881aa11;p=thirdparty%2Flxc.git namespace: add lxc_raw_clone_cb() This is a copy-on-write (no stack passed) variant of lxc_clone(). Signed-off-by: Christian Brauner --- diff --git a/src/lxc/namespace.c b/src/lxc/namespace.c index 1b4d71796..0e3d08d46 100644 --- a/src/lxc/namespace.c +++ b/src/lxc/namespace.c @@ -127,6 +127,23 @@ pid_t lxc_raw_clone(unsigned long flags) #endif } +pid_t lxc_raw_clone_cb(int (*fn)(void *), void *args, unsigned long flags) +{ + pid_t pid; + + pid = lxc_raw_clone(flags); + if (pid < 0) + return -1; + + /* exit() is not thread-safe and might mess with the parent's signal + * handlers and other stuff when exec() fails. + */ + if (pid == 0) + _exit(fn(args)); + + return pid; +} + /* 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 871e81e1a..9896da732 100644 --- a/src/lxc/namespace.h +++ b/src/lxc/namespace.h @@ -129,7 +129,7 @@ int clone(int (*fn)(void *), void *child_stack, * 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() function below. + * refer to the lxc_raw_clone*() functions below. * * - should call lxc_raw_getpid(): * The child should use lxc_raw_getpid() to retrieve its pid. @@ -164,6 +164,19 @@ extern pid_t lxc_clone(int (*fn)(void *), void *arg, int flags); * The child must use lxc_raw_getpid() to retrieve its pid. */ extern pid_t lxc_raw_clone(unsigned long flags); +/** + * 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); extern int lxc_namespace_2_cloneflag(char *namespace); extern int lxc_fill_namespace_flags(char *flaglist, int *flags);