#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
* 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.
* 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);