]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
namespace: add lxc_raw_clone_cb()
authorChristian Brauner <christian.brauner@ubuntu.com>
Fri, 15 Dec 2017 16:35:43 +0000 (17:35 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Mon, 1 Jan 2018 23:56:49 +0000 (00:56 +0100)
This is a copy-on-write (no stack passed) variant of lxc_clone().

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/namespace.c
src/lxc/namespace.h

index 1b4d7179672e905d66673834cb52de613c1ba5ff..0e3d08d46b4eba21cb51c9cbbde13e27ec554e09 100644 (file)
@@ -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
index 871e81e1a4c9a287f98f3f73557016ba22db8bb2..9896da732a8cf32e700bf67564360d5e8e9eb35a 100644 (file)
@@ -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);