applied http://savannah.nongnu.org/patch/?func=detailitem&item_id=4814
[util-vserver.git] / util-vserver / scripts / vserver.stop
index 82e7aa6..79fb97a 100644 (file)
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
+
+lock "$__LOCKDIR"/vserver."$($_VSERVER_INFO "$VSERVER_DIR" CANONIFY)".startup
+
 if ! isVserverRunning "$VSERVER_DIR" S_CONTEXT; then
-    echo $"vserver '$VSERVER_NAME' is not running; aborting..." >&2
-    test "$OPTION_DEBUG" || exec 2>/dev/null >/dev/null
+    warning $"vserver '$VSERVER_NAME' is not running" >&2
+    test -n "$OPTION_DEBUG" || exec 2>/dev/null >/dev/null
     umountVserver     "$VSERVER_DIR" || :
     disableInterfaces "$VSERVER_DIR" || :
-    exit 1
+    unlock
+    exit 0
 fi
 
 function cleanup
 {
+    set +e
+    unlock
+    
     test ! -p "$sync_fifo" || {
-       rm -f "$sync_fifo"
-       rmdir $(dirname "$sync_fifo")
+       $_RM -f "$sync_fifo"
+       $_RMDIR $($_DIRNAME "$sync_fifo")
     }
+
+    test ! -d "$vwait_statdir" ||
+       $_RM -rf "$vwait_statdir"
 }
 
+vwait_statdir=
+vwait_pid=
 sync_fifo=
 trap "cleanup" EXIT
 
+OPTION_FORCE_SYNC=1
+
 set -e
 generateOptions   "$VSERVER_DIR"
 set +e
 
 vshelper.doDestroy "$VSERVER_DIR" "$S_CONTEXT"
-initSync           "$VSERVER_DIR" sync_fifo
+initSync           "$VSERVER_DIR" "$S_CONTEXT" sync_fifo
+prepareStop        "$VSERVER_DIR"
 
 cd "$VSERVER_DIR"/vdir/
-execScriptlets    "$VSERVER_DIR" "$VSERVER_NAME" pre-stop
+execScriptlets     "$VSERVER_DIR" "$VSERVER_NAME" pre-stop
 cd "$VSERVER_DIR"/vdir/
 
-test -z "$OPTION_DEFAULTTTY" || setDefaultTTY
+test -z "$OPTION_DEFAULTTTY" || setDefaultTTY "$VSERVER_DIR"
 
 fail=
-if test "$_IS_FAKEINIT" && \
-   $_VSERVER_INFO - FEATURE vkill && \
-   initpid=$($_VSERVER_INFO "$S_CONTEXT" INITPID 2>/dev/null); then
-    $_VKILL -s INT -- "$initpid" || fail=1
+initWait          "$VSERVER_DIR" "$S_CONTEXT" vwait_statdir
+if test -n "$_IS_FAKEINIT" && \
+   $_VSERVER_INFO - FEATURE vkill; then
+    $_VKILL -s INT --xid "$S_CONTEXT" -- 1 || fail=1
+    ## HACK: remove the 'initpid' stuff above when PID virtualization
+    ## is implemented
 elif $_VSERVER_INFO - FEATURE migrate; then
     "${NICE_CMD[@]}" \
     ${USE_VNAMESPACE:+$_VNAMESPACE --enter "$S_CONTEXT" -- } \
@@ -67,7 +84,7 @@ else
     "${INITCMD_STOP[@]}" || fail=1
 fi
 
-test "$fail" || waitForSync "$VSERVER_DIR" "$sync_fifo"
+waitForSync "$VSERVER_DIR" "$sync_fifo" "$vwait_statdir"
 
 vshelper.doDestroy "$VSERVER_DIR" "$S_CONTEXT"
 sendKillSequence   "$S_CONTEXT" "${INITKILL_SEQ[@]}"
@@ -81,4 +98,6 @@ execScriptlets    "$VSERVER_DIR" "$VSERVER_NAME" post-stop
 umountVserver     "$VSERVER_DIR" || :
 disableInterfaces "$VSERVER_DIR"
 
+saveDiskLimits    "$VSERVER_DIR"
+
 execScriptlets    "$VSERVER_DIR" "$VSERVER_NAME" postpost-stop