From: Stéphane Graber Date: Thu, 3 Jan 2013 17:24:14 +0000 (-0500) Subject: Workaround missing functions in other libc X-Git-Tag: lxc-0.9.0.alpha3~1^2~58 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2d76d1d7e5fc15693e086ca46dc06ef0fd74806e;p=thirdparty%2Flxc.git Workaround missing functions in other libc 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 Acked-by: Serge E. Hallyn --- diff --git a/configure.ac b/configure.ac index 51a7749bd..d6ecc909b 100644 --- a/configure.ac +++ b/configure.ac @@ -223,6 +223,9 @@ AC_CHECK_DECLS([PR_CAPBSET_DROP], [], [], [#include ]) # 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([openpty]) AC_CHECK_FUNCS([getline], diff --git a/src/lxc/attach.c b/src/lxc/attach.c index 9b7efbc0b..b86d2f46a 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 673048d7f..7428b0a35 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -31,6 +31,7 @@ #include #include #include +#include #if HAVE_PTY_H #include @@ -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 {