chroot: support multiple users, i.e don't mount/umount if already done.
--HG-- extra : convert_revision : bd5197a38f42fd82a290aaa35a576d0997b1f6f8
This commit is contained in:
parent
167cf768a1
commit
7fce51f267
1 changed files with 51 additions and 32 deletions
|
@ -10,11 +10,12 @@ trap umount_chroot_fs INT QUIT
|
||||||
|
|
||||||
check_installed_pkg xbps-base-chroot 0.1
|
check_installed_pkg xbps-base-chroot 0.1
|
||||||
[ $? -ne 0 ] && msg_error "xbps-base-chroot pkg not installed."
|
[ $? -ne 0 ] && msg_error "xbps-base-chroot pkg not installed."
|
||||||
if [ "$pkgname" != "$origin_tmpl" ]; then
|
|
||||||
setup_tmpl $origin_tmpl
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$(id -u)" -ne 0 ]; then
|
if [ "$(id -u)" -ne 0 ]; then
|
||||||
|
if [ -n "$origin_tmpl" ]; then
|
||||||
|
reset_tmpl_vars
|
||||||
|
run_file $XBPS_TEMPLATESDIR/$origin_tmpl.tmpl
|
||||||
|
fi
|
||||||
if [ -z "$base_chroot" ]; then
|
if [ -z "$base_chroot" ]; then
|
||||||
msg_error "this package must be built inside of the chroot."
|
msg_error "this package must be built inside of the chroot."
|
||||||
else
|
else
|
||||||
|
@ -41,29 +42,6 @@ for f in ${REQDIRS}; do
|
||||||
done
|
done
|
||||||
unset f REQDIRS
|
unset f REQDIRS
|
||||||
|
|
||||||
REQFS="sys proc dev xbps xbps_builddir xbps_destdir xbps_srcdistdir"
|
|
||||||
for f in ${REQFS}; do
|
|
||||||
if [ ! -f $XBPS_MASTERDIR/.${f}_mount_bind_done ]; then
|
|
||||||
echo -n "=> Mounting $f in chroot... "
|
|
||||||
local blah=
|
|
||||||
case $f in
|
|
||||||
xbps) blah=$XBPS_DISTRIBUTIONDIR;;
|
|
||||||
xbps_builddir) blah=$XBPS_BUILDDIR;;
|
|
||||||
xbps_destdir) blah=$XBPS_DESTDIR;;
|
|
||||||
xbps_srcdistdir) blah=$XBPS_SRCDISTDIR;;
|
|
||||||
*) blah=/$f;;
|
|
||||||
esac
|
|
||||||
mount --bind $blah $XBPS_MASTERDIR/$f
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
touch $XBPS_MASTERDIR/.${f}_mount_bind_done
|
|
||||||
echo "done."
|
|
||||||
else
|
|
||||||
echo "failed."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
unset f
|
|
||||||
|
|
||||||
echo "XBPS_DISTRIBUTIONDIR=/xbps" > $XBPS_MASTERDIR/etc/xbps.conf
|
echo "XBPS_DISTRIBUTIONDIR=/xbps" > $XBPS_MASTERDIR/etc/xbps.conf
|
||||||
echo "XBPS_MASTERDIR=/" >> $XBPS_MASTERDIR/etc/xbps.conf
|
echo "XBPS_MASTERDIR=/" >> $XBPS_MASTERDIR/etc/xbps.conf
|
||||||
echo "XBPS_DESTDIR=/xbps_destdir" >> $XBPS_MASTERDIR/etc/xbps.conf
|
echo "XBPS_DESTDIR=/xbps_destdir" >> $XBPS_MASTERDIR/etc/xbps.conf
|
||||||
|
@ -94,6 +72,7 @@ chroot_pkg_handler()
|
||||||
"$action" != "install" -a "$action" != "chroot" ] && return 1
|
"$action" != "install" -a "$action" != "chroot" ] && return 1
|
||||||
|
|
||||||
rebuild_ldso_cache
|
rebuild_ldso_cache
|
||||||
|
mount_chroot_fs
|
||||||
if [ "$action" = "chroot" ]; then
|
if [ "$action" = "chroot" ]; then
|
||||||
env in_chroot=yes chroot $XBPS_MASTERDIR /bin/bash
|
env in_chroot=yes chroot $XBPS_MASTERDIR /bin/bash
|
||||||
else
|
else
|
||||||
|
@ -104,25 +83,65 @@ chroot_pkg_handler()
|
||||||
umount_chroot_fs
|
umount_chroot_fs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mount_chroot_fs()
|
||||||
|
{
|
||||||
|
local cnt=
|
||||||
|
|
||||||
|
REQFS="sys proc dev xbps xbps_builddir xbps_destdir xbps_srcdistdir"
|
||||||
|
for f in ${REQFS}; do
|
||||||
|
if [ ! -f $XBPS_MASTERDIR/.${f}_mount_bind_done ]; then
|
||||||
|
echo -n "=> Mounting $f in chroot... "
|
||||||
|
local blah=
|
||||||
|
case $f in
|
||||||
|
xbps) blah=$XBPS_DISTRIBUTIONDIR;;
|
||||||
|
xbps_builddir) blah=$XBPS_BUILDDIR;;
|
||||||
|
xbps_destdir) blah=$XBPS_DESTDIR;;
|
||||||
|
xbps_srcdistdir) blah=$XBPS_SRCDISTDIR;;
|
||||||
|
*) blah=/$f;;
|
||||||
|
esac
|
||||||
|
mount --bind $blah $XBPS_MASTERDIR/$f
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo 1 > $XBPS_MASTERDIR/.${f}_mount_bind_done
|
||||||
|
echo "done."
|
||||||
|
else
|
||||||
|
echo "failed."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
cnt=$(cat $XBPS_MASTERDIR/.${f}_mount_bind_done)
|
||||||
|
cnt=$(($cnt + 1))
|
||||||
|
echo $cnt > $XBPS_MASTERDIR/.${f}_mount_bind_done
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
unset f
|
||||||
|
}
|
||||||
|
|
||||||
umount_chroot_fs()
|
umount_chroot_fs()
|
||||||
{
|
{
|
||||||
local fs=
|
local fs=
|
||||||
local dir=
|
local dir=
|
||||||
|
local cnt=
|
||||||
|
|
||||||
for fs in ${REQFS}; do
|
for fs in ${REQFS}; do
|
||||||
[ ! -f $XBPS_MASTERDIR/.${fs}_mount_bind_done ] && continue
|
[ ! -f $XBPS_MASTERDIR/.${fs}_mount_bind_done ] && continue
|
||||||
echo -n "=> Unmounting $fs from chroot... "
|
cnt=$(cat $XBPS_MASTERDIR/.${fs}_mount_bind_done)
|
||||||
umount -f $XBPS_MASTERDIR/$fs
|
if [ $cnt -gt 1 ]; then
|
||||||
if [ $? -eq 0 ]; then
|
cnt=$(($cnt - 1))
|
||||||
rm -f $XBPS_MASTERDIR/.${fs}_mount_bind_done
|
echo $cnt > $XBPS_MASTERDIR/.${fs}_mount_bind_done
|
||||||
echo "done."
|
|
||||||
else
|
else
|
||||||
echo "failed."
|
echo -n "=> Unmounting $fs from chroot... "
|
||||||
|
umount -f $XBPS_MASTERDIR/$fs
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
rm -f $XBPS_MASTERDIR/.${fs}_mount_bind_done
|
||||||
|
echo "done."
|
||||||
|
else
|
||||||
|
echo "failed."
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
unset fs
|
unset fs
|
||||||
done
|
done
|
||||||
|
|
||||||
for dir in xbps xbps_builddir xbps_destdir xbps_srcdistdir; do
|
for dir in xbps xbps_builddir xbps_destdir xbps_srcdistdir; do
|
||||||
|
[ -f $XBPS_MASTERDIR/.${dir}_mount_bind_done ] && continue
|
||||||
[ -d $XBPS_MASTERDIR/$dir ] && rmdir $XBPS_MASTERDIR/$dir
|
[ -d $XBPS_MASTERDIR/$dir ] && rmdir $XBPS_MASTERDIR/$dir
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue