With this patch, the daemon can perform chrooted builds on Hurd, without
creating problems to other parts of the daemon that can't be supported.

So as Mark said, the cases are:

1. CONTAINER_ENABLED and CHROOT_ENABLED are both true.
In this case, the daemon works as expected, which is what happens in Linux now.

2. CONTAINER_ENABLED is false and CHROOT_ENABLED is true.
Here, things like namespaces cannot be supported, but we can still
perform chrooted builds.

3. CONTAINER_ENABLED and CHROOT_ENABLED are both false.
Here, the daemon is unusable on the system, as it should.
From 9faae6784c63a47f3cc8faa160c208f60dad1e9c Mon Sep 17 00:00:00 2001
From: Manolis Ragkousis <manolis...@gmail.com>
Date: Thu, 20 Aug 2015 13:50:04 +0300
Subject: [PATCH] daemon: Split CHROOT_ENABLED into CHROOT_ENABLED and
 CONTAINER_ENABLED.

* nix/libstore/build.cc (CHROOT_ENABLED): Split.
  (DerivationGoal::startBuilder): Replace CHROOT_ENABLED with CONTAINER_ENABLED.
  (DerivationGoal::runChild): Same.
---
 nix/libstore/build.cc | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc
index a9eedce..7cde735 100644
--- a/nix/libstore/build.cc
+++ b/nix/libstore/build.cc
@@ -51,7 +51,15 @@
 #include <linux/fs.h>
 #endif
 
-#define CHROOT_ENABLED HAVE_CHROOT && HAVE_UNSHARE && HAVE_SYS_MOUNT_H && defined(MS_BIND) && defined(MS_PRIVATE) && defined(CLONE_NEWNS) && defined(SYS_pivot_root)
+/* In non Linux systems we can still support chroot builds, even
+   though <sys/mount.h> doesn't exist.*/
+#if __linux__
+#define CHROOT_ENABLED HAVE_CHROOT && HAVE_SYS_MOUNT_H
+#else
+#define CHROOT_ENABLED HAVE_CHROOT
+#endif
+
+#define CONTAINER_ENABLED CHROOT_ENABLED && defined(MS_BIND) && defined(MS_PRIVATE) && defined(CLONE_NEWNS) && defined(SYS_pivot_root)
 
 #if CHROOT_ENABLED
 #include <sys/socket.h>
@@ -1946,7 +1954,7 @@ void DerivationGoal::startBuilder()
        - The UTS namespace ensures that builders see a hostname of
          localhost rather than the actual hostname.
     */
-#if CHROOT_ENABLED
+#if CONTAINER_ENABLED
     if (useChroot) {
 	char stack[32 * 1024];
 	int flags = CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWIPC | CLONE_NEWUTS | SIGCHLD;
@@ -1994,7 +2002,7 @@ void DerivationGoal::runChild()
 
         commonChildInit(builderOut);
 
-#if CHROOT_ENABLED
+#if CONTAINER_ENABLED
         if (useChroot) {
             /* Initialise the loopback interface. */
             AutoCloseFD fd(socket(PF_INET, SOCK_DGRAM, IPPROTO_IP));
-- 
2.5.0

Reply via email to