Make sure /dev gets proper permissions.
[util-vserver.git] / scripts / vserver.functions
index e75c768..e6482c6 100644 (file)
@@ -46,6 +46,7 @@ declare -a OPTS_ENV=()
 declare -a OPTS_VTAG_CREATE=()
 declare -a OPTS_VTAG_ENTER=()
 declare -a OPTS_VMEMCTRL=()
+declare -a OPTS_VSPACE=()
 
 declare -a STOPCMD_PREPARE=()
 
@@ -315,9 +316,10 @@ function _generateInitOptions
 
        (xgentoo)
            test -n "$RUNLEVEL_START" || RUNLEVEL_START="default"
+           RC_PATH=/usr/sbin:/usr/bin:/sbin:/bin
 
            INITCMD_START=( env TERM=$TERM /lib/rcscripts/sh/init-vserver.sh "$RUNLEVEL_START" )
-           INITCMD_STOP=( env -i TERM=$TERM RUNLEVEL=0 /sbin/rc shutdown )
+           INITCMD_STOP=( env -i PATH=$RC_PATH TERM=$TERM RUNLEVEL=0 /sbin/rc shutdown )
            INITCMD_PREPARE=( $_FAKE_RUNLEVEL 3 /var/run/utmp )
            ;;
 
@@ -691,7 +693,7 @@ function _generateTagOptions
 
 function _generateMemctrlOptions
 {
-    local vdir="$"
+    local vdir="$1"
     local badness
 
     getFileValue badness "$vdir/badness"
@@ -700,6 +702,26 @@ function _generateMemctrlOptions
     OPTS_VMEMCTRL=( --badness "$badness" )
 }
 
+function _generateSpaceOptions
+{
+    local vdir="$1"
+    local d="$vdir"/spaces
+
+    test ! -e "$d"/pid || \
+      OPTS_VSPACE=( "${OPTS_VSPACE[@]}" --pid )
+
+    test ! -e "$d"/net || {
+       OPTS_VSPACE=( "${OPTS_VSPACE[@]}" --net )
+       # network context and namespace don't make much sense
+       _HAVE_CHBIND_OPTIONS=1
+       CHBIND_CMD=()
+    }
+
+    local mask
+    getFileValue mask "$d"/mask || \
+      OPTS_VSPACE=( "${OPTS_VSPACE[@]}" --mask "$mask" )
+}
+
 ## Usage: prepareInit <vserver-directory>
 function prepareInit
 {
@@ -745,6 +767,7 @@ function generateOptions
     _generatePersonalityOptions "$1"
     _generateTagOptions         "$1"
     _generateMemctrlOptions     "$1"
+    _generateSpaceOptions       "$1"
 
     if test -n "$_IS_FAKEINIT"; then
        CHCONTEXT_INIT_OPTS=( --disconnect --flag fakeinit )
@@ -1254,7 +1277,7 @@ function _namespaceCleanup
     # these are things that have to be accessible post-cleanup
     for i in "$root" "$__SBINDIR" "$__PKGLIBDIR" "$vdir" \
        "$__PKGSTATEDIR" "$__LOCKDIR" /usr/local /tmp "${skip[@]}"; do
-       local real=`readlink -f "$i"`
+       local real=`getPhysicalDir "$i"`
        test "$i" != "$real" || real=
        for j in "$i" "$real"; do
            while test -n "$j"; do
@@ -1265,7 +1288,7 @@ function _namespaceCleanup
     done
 
     local -a list_umount
-    while read dev path opts; do
+    while read -r dev path opts; do
        test -n "$path" || continue
        for i in "$root" /dev /proc; do
            test "${path#$i}" != "$path" && continue 2