mirror of
git://github.com/lxc/lxc
synced 2025-08-31 16:01:03 +00:00
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 <stgraber@ubuntu.com> Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
This commit is contained in:
@@ -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([openpty])
|
||||
AC_CHECK_FUNCS([getline],
|
||||
|
@@ -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
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user