[lxc-devel] [PATCH 13/24] Workaround missing functions in other libc

Stéphane Graber stgraber at ubuntu.com
Tue Jan 8 17:03:03 UTC 2013


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 <stgraber at ubuntu.com>
Acked-by: Serge E. Hallyn <serge.hallyn at 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





More information about the lxc-devel mailing list