use different files for 'bcap' and 'ccap' for now
[util-vserver.git] / util-vserver / scripts / chcontext
index 69f644c..41f1582 100755 (executable)
@@ -18,7 +18,7 @@
 
 : ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars}
 test -e "$UTIL_VSERVER_VARS" || {
-    echo "Can not find util-vserver installation; aborting..."
+    echo "Can not find util-vserver installation; aborting..." >&2
     exit 1
 }
 . "$UTIL_VSERVER_VARS"
@@ -99,4 +99,82 @@ the GNU General Public License.  This program has absolutely no warranty."
     exit $1
 }
 
-isKernelAPI 0x00010012 || exec $_CHCONTEXT_COMPAT "$@"
+function cleanup()
+{
+    if test -d "$tmpdir"; then
+       local S="$tmpdir"/socket
+       test ! -S "$S" || $_KEEP_CTX_ALIVE --quit "$S" &>/dev/null
+       rm -rf "$tmpdir"
+    fi
+}
+
+
+$_VSERVER_INFO - FEATURE migrate || exec $_CHCONTEXT_COMPAT "$@"
+
+tmp=$(getopt -o + --long cap:,ctx:,disconnect,domainname:,flag:,hostname:,secure,silent,help,version -n "$0" -- "$@") || exit 1
+eval set -- "$tmp"
+
+OPT_CAPS=()
+OPT_CTX=
+OPT_DISCONNECT=
+OPT_FLAGS=()
+OPT_SECURE=
+OPT_SILENT=
+
+while true; do
+    case "$1" in
+       --help)         showHelp $0 ;;
+       --version)      showVersion ;;
+       --cap)          OPT_CAPS=( "${OPT_CAPS[@]}" "$1" ); shift;;
+       --ctx)          OPT_CTX=$1; shift;;
+       --disconnect)   OPT_DISCONNECT=1;
+       --domainname)   OPT_DOMAINNAME=$1; shift;;
+       --hostname)     OPT_HOSTNAME=$1;   shift;;
+       --flag)         OPT_FLAGS=( "${OPT_FLAGS[@]}" "$1" ); shift;;
+       --secure)       OPT_SECURE=1;;
+       --silent)       OPT_SILENT=1;;
+       --)             shift; break;;
+       *)              echo $"chcontext: internal error; arg=='$1'" >&2; exit 1;;
+    esac
+    shift
+done
+
+tmpdir=
+tmpdir=$(mktemp -d /tmp/chcontext.XXXXXX)
+trap "cleanup" EXIT
+
+xid=$($_VCONTEXT --create ${OPT_SILENT:+--silent} ${OPT_CTX:+--xid "$OPT_CTX"} -- $_CTX_KEEP_ALIVE --socket "$tmpdir"/socket --timeout 60)
+rc=$?
+test "$rc" -ne 255 ||
+    echo $"chcontext: Failed to create the context; aborting..." >&2
+    exit 1
+}
+
+test "$rc" -ne 254 || xid=$OPT_CTX
+test "$xid" || {
+    echo $"chcontext: Failed to determine context xid; aborting..." >&2
+    exit 1
+}
+
+set -e
+test "$rc" -ne 0 || {
+    rm -rf "$tmpdir"
+    unset rc
+}
+
+if test "$rc" -ne 254; then
+    $_VATTRIBUTE --xid "$xid" -s \
+       ${OPT_CAPS:+--cap "${OPT_CAPS[@]}"}
+       ${OPT_FLAGS:+--flag "${OPT_FLAGS[@]}"} \
+       ${OPT_SECURE:+--secure}
+
+    $_VUNAME --xid "$xid" -s \
+       ${OPT_DOMAINNAME:+--domainname "$OPT_DOMAINNAME"} \
+       ${OPT_HOSTNAME:+--nodename "$OPT_HOSTNAME"}
+fi
+
+exec $_VCONTEXT --migrate --xid "$xid" \
+    ${OPT_SILENT:+--silent} \
+    ${OPT_DISCONNECT:+--disconnect} \
+    ${rc:--syncsock "$tmpdir"/socket} \
+    -- "$@"