AC_CHECK_FUNCS_ONCE([cfmakeraw fallocate geteuid getgid getgrnam_r \
getmntent_r getpwuid_r getrlimit getuid kill mmap newlocale posix_fallocate \
posix_memalign prlimit regexec sched_getaffinity setgroups setns \
- setrlimit symlink sysctlbyname getifaddrs sched_setscheduler])
+ setrlimit symlink sysctlbyname getifaddrs sched_setscheduler unshare])
dnl Availability of pthread functions. Because of $LIB_PTHREAD, we
dnl cannot use AC_CHECK_FUNCS_ONCE. LIB_PTHREAD and LIBMULTITHREAD
virProcessSetMaxProcesses;
virProcessSetNamespaces;
virProcessSetScheduler;
+virProcessSetupPrivateMountNS;
virProcessTranslateStatus;
virProcessWait;
static int
virLXCControllerSetupPrivateNS(void)
{
- int ret = -1;
-
/*
* If doing a chroot style setup, we need to prepare
* a private /dev/pts for the child now, which they
* marked as shared
*/
- if (unshare(CLONE_NEWNS) < 0) {
- virReportSystemError(errno, "%s",
- _("Cannot unshare mount namespace"));
- goto cleanup;
- }
-
- if (mount("", "/", NULL, MS_SLAVE|MS_REC, NULL) < 0) {
- virReportSystemError(errno, "%s",
- _("Failed to switch root mount into slave mode"));
- goto cleanup;
- }
-
- ret = 0;
- cleanup:
- return ret;
+ return virProcessSetupPrivateMountNS();
}
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
+#if HAVE_SYS_MOUNT_H
+# include <sys/mount.h>
+#endif
#if HAVE_SETRLIMIT
# include <sys/time.h>
# include <sys/resource.h>
}
+#if defined(HAVE_SYS_MOUNT_H) && defined(HAVE_UNSHARE)
+int
+virProcessSetupPrivateMountNS(void)
+{
+ int ret = -1;
+
+ if (unshare(CLONE_NEWNS) < 0) {
+ virReportSystemError(errno, "%s",
+ _("Cannot unshare mount namespace"));
+ goto cleanup;
+ }
+
+ if (mount("", "/", NULL, MS_SLAVE|MS_REC, NULL) < 0) {
+ virReportSystemError(errno, "%s",
+ _("Failed to switch root mount into slave mode"));
+ goto cleanup;
+ }
+
+ ret = 0;
+ cleanup:
+ return ret;
+}
+
+#else /* !defined(HAVE_SYS_MOUNT_H) || !defined(HAVE_UNSHARE) */
+
+int
+virProcessSetupPrivateMountNS(void)
+{
+ virReportSystemError(ENOSYS, "%s",
+ _("Namespaces are not supported on this platform."));
+ return -1;
+}
+#endif /* !defined(HAVE_SYS_MOUNT_H) || !defined(HAVE_UNSHARE) */
+
+
/**
* virProcessExitWithStatus:
* @status: raw status to be reproduced when this process dies
virProcessNamespaceCallback cb,
void *opaque);
+int virProcessSetupPrivateMountNS(void);
+
int virProcessSetScheduler(pid_t pid,
virProcessSchedPolicy policy,
int priority);