Some libc implementation (bionic) is lacking some of the syscall functions that are present in the glibc.
For those, detect at build time the they are missing and implement a minimal syscall() wrapper that will essentially give the same result as the glibc function. Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com> --- configure.ac | 3 +++ src/lxc/attach.c | 26 +++++++++++++++++++++----- src/lxc/conf.c | 31 +++++++++++++++++++++++++++++-- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index 6c0db3c..bc2ddc4 100644 --- a/configure.ac +++ b/configure.ac @@ -223,6 +223,9 @@ AC_CHECK_DECLS([PR_CAPBSET_DROP], [], [], [#include <sys/prctl.h>]) # Check for some headers AC_CHECK_HEADERS([sys/signalfd.h pty.h sys/capability.h sys/personality.h]) +# Check for some syscalls functions +AC_CHECK_FUNCS([setns pivot_root sethostname unshare]) + # Check for some functions AC_CHECK_FUNCS([getline fgetln openpty]) diff --git a/src/lxc/attach.c b/src/lxc/attach.c index 9b7efbc..b86d2f4 100644 --- a/src/lxc/attach.c +++ b/src/lxc/attach.c @@ -47,15 +47,31 @@ lxc_log_define(lxc_attach, lxc); -int setns(int fd, int nstype) +/* Define setns() if missing from the C library */ +#ifndef HAVE_SETNS +static int setns(int fd, int nstype) { -#ifndef __NR_setns - errno = ENOSYS; - return -1; +#ifdef __NR_setns +return syscall(__NR_setns, fd, nstype); #else - return syscall(__NR_setns, fd, nstype); +errno = ENOSYS; +return -1; #endif } +#endif + +/* Define unshare() if missing from the C library */ +#ifndef HAVE_UNSHARE +static int unshare(int flags) +{ +#ifdef __NR_unshare +return syscall(__NR_unshare, flags); +#else +errno = ENOSYS; +return -1; +#endif +} +#endif /* Define getline() if missing from the C library */ #ifndef HAVE_GETLINE diff --git a/src/lxc/conf.c b/src/lxc/conf.c index 2136feb..4a2fd22 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -31,6 +31,7 @@ #include <mntent.h> #include <unistd.h> #include <sys/wait.h> +#include <sys/syscall.h> #if HAVE_PTY_H #include <pty.h> @@ -132,11 +133,37 @@ lxc_log_define(lxc_conf, lxc); #define LO_FLAGS_AUTOCLEAR 4 #endif +/* Define pivot_root() if missing from the C library */ +#ifndef HAVE_PIVOT_ROOT +static int pivot_root(const char * new_root, const char * put_old) +{ +#ifdef __NR_pivot_root +return syscall(__NR_pivot_root, new_root, put_old); +#else +errno = ENOSYS; +return -1; +#endif +} +#else +extern int pivot_root(const char * new_root, const char * put_old); +#endif + +/* Define sethostname() if missing from the C library */ +#ifndef HAVE_SETHOSTNAME +static int sethostname(const char * name, size_t len) +{ +#ifdef __NR_sethostname +return syscall(__NR_sethostname, name, len); +#else +errno = ENOSYS; +return -1; +#endif +} +#endif + char *lxchook_names[NUM_LXC_HOOKS] = { "pre-start", "pre-mount", "mount", "start", "post-stop" }; -extern int pivot_root(const char * new_root, const char * put_old); - typedef int (*instanciate_cb)(struct lxc_handler *, struct lxc_netdev *); struct mount_opt { -- 1.8.0 ------------------------------------------------------------------------------ Master SQL Server Development, Administration, T-SQL, SSAS, SSIS, SSRS and more. Get SQL Server skills now (including 2012) with LearnDevNow - 200+ hours of step-by-step video tutorials by Microsoft MVPs and experts. SALE $99.99 this month only - learn more at: http://p.sf.net/sfu/learnmore_122512 _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel