--- /dev/null
+/*
+ * lxc: linux Container library
+ *
+ * (C) Copyright IBM Corp. 2007, 2009
+ *
+ * Authors:
+ * Daniel Lezcano <dlezcano at fr.ibm.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <unistd.h>
+#include <alloca.h>
+#include <errno.h>
+#include <signal.h>
+#include <namespace.h>
+
+#include <lxc/lxc.h>
+
+lxc_log_define(lxc_namespace, lxc);
+
+struct clone_arg {
+ int (*fn)(void *);
+ void *arg;
+};
+
+static int do_clone(void *arg)
+{
+ struct clone_arg *clone_arg = arg;
+ return clone_arg->fn(clone_arg->arg);
+}
+
+pid_t lxc_clone(int (*fn)(void *), void *arg, int flags)
+{
+ struct clone_arg clone_arg = {
+ .fn = fn,
+ .arg = arg,
+ };
+
+ long stack_size = sysconf(_SC_PAGESIZE);
+ void *stack = alloca(stack_size) + stack_size;
+ pid_t ret;
+
+ ret = clone(do_clone, stack, flags | SIGCHLD, &clone_arg);
+ if (ret < 0)
+ ERROR("failed to clone(0x%x): %s", flags, strerror(errno));
+
+ return ret;
+}
/*
* lxc: linux Container library
*
- * (C) Copyright IBM Corp. 2007, 2008
+ * (C) Copyright IBM Corp. 2007, 2009
*
* Authors:
* Daniel Lezcano <dlezcano at fr.ibm.com>
#define __namespace_h
#include <syscall.h>
+#define _GNU_SOURCE
+#include <sched.h>
+
#ifndef CLONE_FS
# define CLONE_FS 0x00000200
#endif
#ifndef CLONE_NEWNET
# define CLONE_NEWNET 0x40000000
#endif
-#ifndef __NR_unshare
-# ifdef __i386__
-# define __NR_unshare 310
-# elif __x86_64__
-# define __NR_unshare 272
-# elif __ia64__
-# define __NR_unshare 1296
-# elif __s390__
-# define __NR_unshare 303
-# elif __powerpc__
-# define __NR_unshare 282
-#else
-# error "unsupported architecture"
-# endif
-#endif
+
#if __i386__ || __x86_64__ || __powerpc__
# define fork_ns(flags) syscall(SYS_clone, flags|SIGCHLD, NULL)
#elif __s390__
#else
# error "unsupported architecture"
#endif
-#define unshare_ns(flags) syscall(__NR_unshare, flags, NULL)
+
+#define unshare_ns(flags) unshare(flags)
+
+extern pid_t lxc_clone(int (*fn)(void *), void *arg, int flags);
+
#endif