use $(LIBENSCVECTOR) instead of libensc_vector.a
[util-vserver.git] / util-vserver / scripts / vserver.stop
index 55af27d..205da84 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..."
-    umountVserver "$VSERVER_DIR"     &>/dev/null || :
-    disableInterfaces "$VSERVER_DIR" &>/dev/null || :
-    exit 1
+    warning $"vserver '$VSERVER_NAME' is not running" >&2
+    test -n "$OPTION_DEBUG" || exec 2>/dev/null >/dev/null
+    umountVserver     "$VSERVER_DIR" || :
+    disableInterfaces "$VSERVER_DIR" || :
+    unlock
+    exit 0
 fi
 
-generateOptions   "$VSERVER_DIR"
+function cleanup
+{
+    set +e
+    unlock
+    
+    test ! -p "$sync_fifo" || {
+       $_RM -f "$sync_fifo"
+       $_RMDIR $($_DIRNAME "$sync_fifo")
+    }
+}
+
+sync_fifo=
+trap "cleanup" EXIT
 
 set -e
+generateOptions   "$VSERVER_DIR"
+set +e
+
+vshelper.doDestroy "$VSERVER_DIR" "$S_CONTEXT"
+initSync           "$VSERVER_DIR" sync_fifo
+prepareStop "$VSERVER_DIR"
+
 cd "$VSERVER_DIR"/vdir/
 execScriptlets    "$VSERVER_DIR" "$VSERVER_NAME" pre-stop
-
 cd "$VSERVER_DIR"/vdir/
-"${NICE_CMD[@]}" \
+
+test -z "$OPTION_DEFAULTTTY" || setDefaultTTY "$VSERVER_DIR"
+
+fail=
+if test -n "$_IS_FAKEINIT" && \
+   $_VSERVER_INFO - FEATURE vkill && \
+   initpid=$($_VSERVER_INFO "$S_CONTEXT" INITPID 2>/dev/null); then
+    $_VKILL -s INT --xid "$S_CONTEXT" -- 1 "$initpid" || 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" -- } \
+    $_VCONTEXT $SILENT_OPT --migrate --chroot --xid "$S_CONTEXT" -- \
+    "${INITCMD_STOP[@]}" || fail=1
+else
+    "${NICE_CMD[@]}" \
     "$_CHBIND"       "${CHBIND_OPTS[@]}" \
     "$_EXEC_ULIMIT"  "$VSERVER_DIR/ulimits" \
-    "$_CHCONTEXT"    "${CHCONTEXT_OPTS[@]}" \
-    "$_CAPCHROOT"    "${CAPCHROOT_OPTS[@]}" . "${INITCMD_STOP[@]}"
+    ${USE_VNAMESPACE:+$_VNAMESPACE --enter "$S_CONTEXT"} \
+    $_CHCONTEXT_COMPAT    "${CHCONTEXT_OPTS[@]}" \
+    "$_CAPCHROOT"    "${CAPCHROOT_OPTS[@]}" "." \
+    "${INITCMD_STOP[@]}" || fail=1
+fi
+
+test -n "$fail" || waitForSync "$VSERVER_DIR" "$sync_fifo"
+
+vshelper.doDestroy "$VSERVER_DIR" "$S_CONTEXT"
+sendKillSequence   "$S_CONTEXT" "${INITKILL_SEQ[@]}"
 
-"${INITCMD_STOP_SYNC[@]}"
-sendKillSequence  "$S_CONTEXT" "${INITKILL_SEQ[@]}"
+## Small hack... isVserverRunning removes stale runfiles as a sideeffect
+! isVserverRunning  "$VSERVER_DIR" || \
+    echo $"Vserver '$VSERVER_DIR' still running unexpectedly; please investigate it manually..." >&2
 
 execScriptlets    "$VSERVER_DIR" "$VSERVER_NAME" post-stop