On Sat, Jan 23, 2010 at 06:39:51PM +0100, Aurelien Jarno wrote: > Please find below a patch to support GNU/kFreeBSD. I don't know how you > plan to deal with architecture specific changes in scripts, so I have > decided to just modify them in this patch. With it I have been able to > get schroot working in plain, directory, block device and loopback modes. > I haven't tested the other modes yet.
Thanks. I've updated schroot on the master branch using the following patch (it's several changes in git). Note this hasn't been tested yet; I'm really just looking for some review before I put it to use. I'll do some testing tomorrow when I have some more time to review it. It may need some further work, so I would appreciate your comments. I've updated the schroot build system (configure and makefiles) to allow different configuration files to be installed for different platforms. I've also introduced a PLATFORM variable into the setup scripts to allow conditional behaviour depending upon the platform. Using your patch, I've added in the appropriate conditional behaviour for a "freebsd" platform (both freebsd and kfreebsd-gnu). Note that the setup scripts are installed into /etc/schroot/default, not just into /etc/schroot. This is a change in addition to the portability changes, so if you manually set script-config in your chroot definitions, it might need adjusting (if not, it's automatic). Regards, Roger -- .''`. Roger Leigh : :' : Debian GNU/Linux http://people.debian.org/~rleigh/ `. `' Printing on GNU/Linux? http://gutenprint.sourceforge.net/ `- GPG Public Key: 0x25BFB848 Please GPG sign your mail.
diff --git a/configure.ac b/configure.ac
index c54ad48..cc32de8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -258,6 +258,7 @@ AC_SUBST([bashcompletiondir])
AC_PROG_CXX
AC_LANG([C++])
ACX_PTHREAD([], [AC_MSG_ERROR([POSIX thread support is required for correct std::tr1::shared_ptr operation])])
+AC_CANONICAL_HOST
AC_DISABLE_SHARED
AC_ENABLE_STATIC
AC_PROG_LIBTOOL
@@ -277,6 +278,27 @@ if test "$enable_doxygen" = "yes" && test -z "$DOXYGEN"; then
fi;
AM_CONDITIONAL([BUILD_DOXYGEN], [test -n "$DOXYGEN" && test "$enable_doxygen" = "yes"])
+
+# Check for host platform
+AC_MSG_CHECKING([for supported host platform type])
+PLATFORM="generic"
+case $host_os in
+ linux*):
+ PLATFORM="linux";;
+ freebsd* | k*bsd*-gnu) :
+ PLATFORM="freebsd";;
+esac
+AC_MSG_RESULT([$PLATFORM])
+AC_SUBST([PLATFORM], [$PLATFORM])
+
+AM_CONDITIONAL([PLATFORM_GENERIC], [test "$PLATFORM" = "generic"])
+AM_CONDITIONAL([PLATFORM_LINUX], [test "$PLATFORM" = "linux"])
+AM_CONDITIONAL([PLATFORM_FREEBSD], [test "$PLATFORM" = "freebsd"])
+
+AH_TEMPLATE(SBUILD_PLATFORM, [Platform type, used to modify run-time platform-specific behaviour])
+AC_DEFINE_UNQUOTED(SBUILD_PLATFORM, ["$PLATFORM"])
+
+
# Checks for libraries.
PKG_CHECK_MODULES([UUID], [uuid],
[AC_DEFINE(HAVE_UUID)
@@ -755,6 +777,10 @@ AC_CONFIG_FILES([bin/dchroot/Makefile])
AC_CONFIG_FILES([bin/dchroot-dsa/Makefile])
AC_CONFIG_FILES([bin/csbuild/Makefile])
AC_CONFIG_FILES([etc/Makefile])
+AC_CONFIG_FILES([etc/default/Makefile])
+AC_CONFIG_FILES([etc/default/freebsd/Makefile])
+AC_CONFIG_FILES([etc/default/generic/Makefile])
+AC_CONFIG_FILES([etc/default/linux/Makefile])
AC_CONFIG_FILES([etc/pam/Makefile])
AC_CONFIG_FILES([etc/setup.d/Makefile])
AC_CONFIG_FILES([etc/bash_completion/Makefile])
diff --git a/etc/Makefile.am b/etc/Makefile.am
index c09d370..b1effa4 100644
--- a/etc/Makefile.am
+++ b/etc/Makefile.am
@@ -21,15 +21,12 @@
include $(top_srcdir)/scripts/global.mk
-SUBDIRS = pam setup.d bash_completion
+SUBDIRS = pam default setup.d bash_completion
pkgsysconfdir = $(PACKAGE_SYSCONF_DIR)
+
pkgsysconf_DATA = \
- schroot.conf \
- copyfiles-defaults \
- mount-defaults \
- nssdatabases-defaults \
- script-defaults
+ schroot.conf
EXTRA_DIST = \
$(pkgsysconf_DATA)
diff --git a/etc/copyfiles-defaults b/etc/copyfiles-defaults
deleted file mode 100644
index 6bb4d96..0000000
--- a/etc/copyfiles-defaults
+++ /dev/null
@@ -1,2 +0,0 @@
-/etc/resolv.conf
-/etc/gshadow
diff --git a/etc/default/Makefile.am b/etc/default/Makefile.am
new file mode 100644
index 0000000..7a81701
--- /dev/null
+++ b/etc/default/Makefile.am
@@ -0,0 +1,24 @@
+# schroot Makefile template
+#
+#
+# Copyright © 2004-2009 Roger Leigh <[email protected]>
+#
+# schroot is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# schroot is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see
+# <http://www.gnu.org/licenses/>.
+#
+#####################################################################
+
+include $(top_srcdir)/scripts/global.mk
+
+SUBDIRS = generic freebsd linux
diff --git a/etc/default/freebsd/Makefile.am b/etc/default/freebsd/Makefile.am
new file mode 100644
index 0000000..0e11058
--- /dev/null
+++ b/etc/default/freebsd/Makefile.am
@@ -0,0 +1,36 @@
+# schroot Makefile template
+#
+#
+# Copyright © 2004-2009 Roger Leigh <[email protected]>
+#
+# schroot is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# schroot is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see
+# <http://www.gnu.org/licenses/>.
+#
+#####################################################################
+
+include $(top_srcdir)/scripts/global.mk
+
+pkgsysconfdir = $(PACKAGE_SYSCONF_DIR)/default
+
+if PLATFORM_FREEBSD
+SCRIPT_CONFIG = \
+ copyfiles \
+ fstab \
+ nssdatabases
+endif
+
+pkgsysconf_DATA = $(SCRIPT_CONFIG)
+
+EXTRA_DIST = \
+ $(SCRIPT_CONFIG)
diff --git a/etc/default/freebsd/copyfiles b/etc/default/freebsd/copyfiles
new file mode 100644
index 0000000..6bb4d96
--- /dev/null
+++ b/etc/default/freebsd/copyfiles
@@ -0,0 +1,2 @@
+/etc/resolv.conf
+/etc/gshadow
diff --git a/etc/default/freebsd/fstab b/etc/default/freebsd/fstab
new file mode 100644
index 0000000..de8b733
--- /dev/null
+++ b/etc/default/freebsd/fstab
@@ -0,0 +1,12 @@
+# mount.defaults: static file system information for chroots.
+# Note that the mount point will be prefixed by the chroot path
+# (CHROOT_PATH)
+#
+# <file system> <mount point> <type> <options> <dump> <pass>
+proc /proc proc defaults 0 0
+#procbususb /proc/bus/usb usbfs defaults 0 0
+#/dev /dev none rw,bind 0 0
+/dev/pts /dev/pts none rw,bind 0 0
+/dev/shm /dev/shm none rw,bind 0 0
+/home /home none rw,bind 0 0
+/tmp /tmp none rw,bind 0 0
diff --git a/etc/default/freebsd/nssdatabases b/etc/default/freebsd/nssdatabases
new file mode 100644
index 0000000..bfd5eea
--- /dev/null
+++ b/etc/default/freebsd/nssdatabases
@@ -0,0 +1,7 @@
+passwd
+shadow
+group
+services
+protocols
+networks
+hosts
diff --git a/etc/default/generic/Makefile.am b/etc/default/generic/Makefile.am
new file mode 100644
index 0000000..b67c718
--- /dev/null
+++ b/etc/default/generic/Makefile.am
@@ -0,0 +1,40 @@
+# schroot Makefile template
+#
+#
+# Copyright © 2004-2009 Roger Leigh <[email protected]>
+#
+# schroot is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# schroot is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see
+# <http://www.gnu.org/licenses/>.
+#
+#####################################################################
+
+include $(top_srcdir)/scripts/global.mk
+
+pkgsysconfdir = $(PACKAGE_SYSCONF_DIR)/default
+
+if PLATFORM_GENERIC
+SCRIPT_CONFIG = \
+ copyfiles \
+ fstab \
+ nssdatabases
+endif
+
+SCRIPT_GLOBAL = \
+ config
+
+pkgsysconf_DATA = $(SCRIPT_CONFIG)
+
+EXTRA_DIST = \
+ $(SCRIPT_GLOBAL) \
+ $(SCRIPT_CONFIG)
diff --git a/etc/default/generic/config b/etc/default/generic/config
new file mode 100644
index 0000000..afc9a38
--- /dev/null
+++ b/etc/default/generic/config
@@ -0,0 +1,11 @@
+# Default settings for chroot setup and exec scripts.
+# See schroot-script-config(5) for further details.
+
+# Filesystems to mount inside the chroot.
+FSTAB="/etc/schroot/default/fstab"
+
+# Files to copy from the host system into the chroot.
+COPYFILES="/etc/schroot/default/copyfiles"
+
+# System NSS databases to copy into the chroot.
+NSSDATABASES="/etc/schroot/default/nssdatabases"
diff --git a/etc/default/generic/copyfiles b/etc/default/generic/copyfiles
new file mode 100644
index 0000000..6bb4d96
--- /dev/null
+++ b/etc/default/generic/copyfiles
@@ -0,0 +1,2 @@
+/etc/resolv.conf
+/etc/gshadow
diff --git a/etc/default/generic/fstab b/etc/default/generic/fstab
new file mode 100644
index 0000000..de8b733
--- /dev/null
+++ b/etc/default/generic/fstab
@@ -0,0 +1,12 @@
+# mount.defaults: static file system information for chroots.
+# Note that the mount point will be prefixed by the chroot path
+# (CHROOT_PATH)
+#
+# <file system> <mount point> <type> <options> <dump> <pass>
+proc /proc proc defaults 0 0
+#procbususb /proc/bus/usb usbfs defaults 0 0
+#/dev /dev none rw,bind 0 0
+/dev/pts /dev/pts none rw,bind 0 0
+/dev/shm /dev/shm none rw,bind 0 0
+/home /home none rw,bind 0 0
+/tmp /tmp none rw,bind 0 0
diff --git a/etc/default/generic/nssdatabases b/etc/default/generic/nssdatabases
new file mode 100644
index 0000000..bfd5eea
--- /dev/null
+++ b/etc/default/generic/nssdatabases
@@ -0,0 +1,7 @@
+passwd
+shadow
+group
+services
+protocols
+networks
+hosts
diff --git a/etc/default/linux/Makefile.am b/etc/default/linux/Makefile.am
new file mode 100644
index 0000000..ac440cd
--- /dev/null
+++ b/etc/default/linux/Makefile.am
@@ -0,0 +1,36 @@
+# schroot Makefile template
+#
+#
+# Copyright © 2004-2009 Roger Leigh <[email protected]>
+#
+# schroot is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# schroot is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see
+# <http://www.gnu.org/licenses/>.
+#
+#####################################################################
+
+include $(top_srcdir)/scripts/global.mk
+
+pkgsysconfdir = $(PACKAGE_SYSCONF_DIR)/default
+
+if PLATFORM_LINUX
+SCRIPT_CONFIG = \
+ copyfiles \
+ fstab \
+ nssdatabases
+endif
+
+pkgsysconf_DATA = $(SCRIPT_CONFIG)
+
+EXTRA_DIST = \
+ $(SCRIPT_CONFIG)
diff --git a/etc/default/linux/copyfiles b/etc/default/linux/copyfiles
new file mode 100644
index 0000000..6bb4d96
--- /dev/null
+++ b/etc/default/linux/copyfiles
@@ -0,0 +1,2 @@
+/etc/resolv.conf
+/etc/gshadow
diff --git a/etc/default/linux/fstab b/etc/default/linux/fstab
new file mode 100644
index 0000000..de8b733
--- /dev/null
+++ b/etc/default/linux/fstab
@@ -0,0 +1,12 @@
+# mount.defaults: static file system information for chroots.
+# Note that the mount point will be prefixed by the chroot path
+# (CHROOT_PATH)
+#
+# <file system> <mount point> <type> <options> <dump> <pass>
+proc /proc proc defaults 0 0
+#procbususb /proc/bus/usb usbfs defaults 0 0
+#/dev /dev none rw,bind 0 0
+/dev/pts /dev/pts none rw,bind 0 0
+/dev/shm /dev/shm none rw,bind 0 0
+/home /home none rw,bind 0 0
+/tmp /tmp none rw,bind 0 0
diff --git a/etc/default/linux/nssdatabases b/etc/default/linux/nssdatabases
new file mode 100644
index 0000000..bfd5eea
--- /dev/null
+++ b/etc/default/linux/nssdatabases
@@ -0,0 +1,7 @@
+passwd
+shadow
+group
+services
+protocols
+networks
+hosts
diff --git a/etc/mount-defaults b/etc/mount-defaults
deleted file mode 100644
index de8b733..0000000
--- a/etc/mount-defaults
+++ /dev/null
@@ -1,12 +0,0 @@
-# mount.defaults: static file system information for chroots.
-# Note that the mount point will be prefixed by the chroot path
-# (CHROOT_PATH)
-#
-# <file system> <mount point> <type> <options> <dump> <pass>
-proc /proc proc defaults 0 0
-#procbususb /proc/bus/usb usbfs defaults 0 0
-#/dev /dev none rw,bind 0 0
-/dev/pts /dev/pts none rw,bind 0 0
-/dev/shm /dev/shm none rw,bind 0 0
-/home /home none rw,bind 0 0
-/tmp /tmp none rw,bind 0 0
diff --git a/etc/nssdatabases-defaults b/etc/nssdatabases-defaults
deleted file mode 100644
index bfd5eea..0000000
--- a/etc/nssdatabases-defaults
+++ /dev/null
@@ -1,7 +0,0 @@
-passwd
-shadow
-group
-services
-protocols
-networks
-hosts
diff --git a/etc/script-defaults b/etc/script-defaults
deleted file mode 100644
index 86450cd..0000000
--- a/etc/script-defaults
+++ /dev/null
@@ -1,11 +0,0 @@
-# Default settings for chroot setup and exec scripts.
-# See schroot-script-config(5) for further details.
-
-# Filesystems to mount inside the chroot.
-FSTAB="/etc/schroot/mount-defaults"
-
-# Files to copy from the host system into the chroot.
-COPYFILES="/etc/schroot/copyfiles-defaults"
-
-# System NSS databases to copy into the chroot.
-NSSDATABASES="/etc/schroot/nssdatabases-defaults"
diff --git a/etc/setup.d/00check b/etc/setup.d/00check
index f62f068..e3dcaf9 100755
--- a/etc/setup.d/00check
+++ b/etc/setup.d/00check
@@ -53,6 +53,7 @@ if [ "$AUTH_VERBOSITY" = "verbose" ]; then
echo "MOUNT_DIR=$MOUNT_DIR"
echo "LIBEXEC_DIR=$LIBEXEC_DIR"
echo "PID=$PID"
+ echo "PLATFORM=$PLATFORM"
echo "SESSION_ID=$SESSION_ID"
echo "CHROOT_TYPE=$CHROOT_TYPE"
echo "CHROOT_NAME=$CHROOT_NAME"
@@ -116,7 +117,13 @@ case "$CHROOT_TYPE" in
fi
;;
block-device | lvm-snapshot)
- if [ ! -b "$CHROOT_DEVICE" ]; then
+ if [ "$PLATFORM" = "freebsd" ]; then
+ DEVTYPE="-c"
+ else
+ DEVTYPE="-b"
+ fi
+
+ if [ ! "$DEVTYPE" "$CHROOT_DEVICE" ]; then
echo "Device '$CHROOT_DEVICE' does not exist"
exit 1
fi
diff --git a/etc/setup.d/10mount b/etc/setup.d/10mount
index f0b5632..7c4501c 100755
--- a/etc/setup.d/10mount
+++ b/etc/setup.d/10mount
@@ -103,22 +103,34 @@ if [ "$CHROOT_TYPE" = "directory" ] || [ "$CHROOT_TYPE" = "file" ] || [ "$CHROOT
CREATE_UNION="no"
fi
+ if [ "$PLATFORM" = "freebsd" ]; then
+ BINDOPT="-t nullfs"
+ else
+ BINDOPT="--bind"
+ fi
+
if [ "$CHROOT_TYPE" = "directory" ]; then
- CHROOT_MOUNT_OPTIONS="--bind"
+ CHROOT_MOUNT_OPTIONS="$BINDOPT"
CHROOT_MOUNT_DEVICE="$CHROOT_DIRECTORY"
elif [ "$CHROOT_TYPE" = "file" ]; then
UNPACK_LOCATION="${UNPACK_DIR}/${SESSION_ID}"
- CHROOT_MOUNT_OPTIONS="--bind"
+ CHROOT_MOUNT_OPTIONS="$BINDOPT"
CHROOT_MOUNT_DEVICE="${CHROOT_FILE_UNPACK_DIR}/${SESSION_ID}"
elif [ "$CHROOT_TYPE" = "loopback" ]; then
- LOOP_DEVICE="$(/sbin/losetup -j "$CHROOT_FILE" | sed -e 's/:.*$//')"
- if [ -z "$LOOP_DEVICE" ]; then
- CHROOT_MOUNT_DEVICE="$CHROOT_FILE"
- CHROOT_MOUNT_OPTIONS="${CHROOT_MOUNT_OPTIONS},loop"
- else
+ if [ "$PLATFORM" = "freebsd" ]; then
+ LOOP_DEVICE="/dev/$(/sbin/mdconfig -a -t vnode -f "$CHROOT_FILE")"
CHROOT_MOUNT_DEVICE="$LOOP_DEVICE"
CHROOT_MOUNT_OPTIONS=""
+ else
+ LOOP_DEVICE="$(/sbin/losetup -j "$CHROOT_FILE" | sed -e 's/:.*$//')"
+ if [ -z "$LOOP_DEVICE" ]; then
+ CHROOT_MOUNT_DEVICE="$CHROOT_FILE"
+ CHROOT_MOUNT_OPTIONS="${CHROOT_MOUNT_OPTIONS},loop"
+ else
+ CHROOT_MOUNT_DEVICE="$LOOP_DEVICE"
+ CHROOT_MOUNT_OPTIONS=""
+ fi
fi
fi
diff --git a/sbuild/sbuild-chroot-block-device.cc b/sbuild/sbuild-chroot-block-device.cc
index 542d73e..90cec1a 100644
--- a/sbuild/sbuild-chroot-block-device.cc
+++ b/sbuild/sbuild-chroot-block-device.cc
@@ -123,7 +123,13 @@ chroot_block_device::setup_lock (chroot::setup_type type,
try
{
- if (!stat(this->get_device()).is_block())
+ if (!stat
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+ (this->get_device()).is_character()
+#else
+ (this->get_device()).is_block()
+#endif
+ )
{
throw error(get_device(), DEVICE_NOTBLOCK);
}
diff --git a/sbuild/sbuild-chroot.cc b/sbuild/sbuild-chroot.cc
index c516a84..ca52696 100644
--- a/sbuild/sbuild-chroot.cc
+++ b/sbuild/sbuild-chroot.cc
@@ -108,7 +108,7 @@ sbuild::chroot::chroot ():
mount_location(),
original(true),
run_setup_scripts(true),
- script_config("script-defaults"),
+ script_config("default/config"),
command_prefix(),
facets()
{
diff --git a/sbuild/sbuild-session.cc b/sbuild/sbuild-session.cc
index 70076b7..de8f0ed 100644
--- a/sbuild/sbuild-session.cc
+++ b/sbuild/sbuild-session.cc
@@ -1036,6 +1036,7 @@ session::setup_chroot (sbuild::chroot::ptr& session_chroot,
env.add("LIBEXEC_DIR", SCHROOT_LIBEXEC_DIR);
env.add("PID", getpid());
env.add("SESSION_ID", session_chroot->get_session_id());
+ env.add("PLATFORM", SBUILD_PLATFORM);
run_parts rp(SCHROOT_CONF_SETUP_D,
true, true, 022);
diff --git a/test/test-sbuild-chroot.h b/test/test-sbuild-chroot.h
index e8c3f13..6ab74f1 100644
--- a/test/test-sbuild-chroot.h
+++ b/test/test-sbuild-chroot.h
@@ -176,7 +176,7 @@ public:
{
env.add("CHROOT_NAME", "test-name");
env.add("CHROOT_DESCRIPTION", "test-description");
- env.add("CHROOT_SCRIPT_CONFIG", sbuild::normalname(std::string(PACKAGE_SYSCONF_DIR) + "/script-defaults"));
+ env.add("CHROOT_SCRIPT_CONFIG", sbuild::normalname(std::string(PACKAGE_SYSCONF_DIR) + "/default/config"));
}
void setup_keyfile_chroot (sbuild::keyfile& keyfile,
@@ -193,7 +193,7 @@ public:
SBUILD_DEFAULT_ENVIRONMENT_FILTER);
keyfile.set_value(group, "personality", "undefined");
keyfile.set_value(group, "command-prefix", "");
- keyfile.set_value(group, "script-config", "script-defaults");
+ keyfile.set_value(group, "script-config", "default/config");
}
void setup_keyfile_session (sbuild::keyfile& keyfile,
signature.asc
Description: Digital signature

