about summary refs log tree commit diff
diff options
context:
space:
mode:
authoraszlig <aszlig@redmoonstudios.org>2014-02-17 00:34:19 +0100
committeraszlig <aszlig@redmoonstudios.org>2014-02-26 04:52:00 +0100
commite40f41e50562873fcdb78bec891a8f19141d4b42 (patch)
tree2800211450aa15f1e95f01ebbb59f37f3a5c0639
parentb01c9624cf0c77837e1928a49778f74446ddfaa0 (diff)
downloadnixlib-e40f41e50562873fcdb78bec891a8f19141d4b42.tar
nixlib-e40f41e50562873fcdb78bec891a8f19141d4b42.tar.gz
nixlib-e40f41e50562873fcdb78bec891a8f19141d4b42.tar.bz2
nixlib-e40f41e50562873fcdb78bec891a8f19141d4b42.tar.lz
nixlib-e40f41e50562873fcdb78bec891a8f19141d4b42.tar.xz
nixlib-e40f41e50562873fcdb78bec891a8f19141d4b42.tar.zst
nixlib-e40f41e50562873fcdb78bec891a8f19141d4b42.zip
vm/windows: Collect exit code from xchg.
This is the last item that was missing to get a fully working
runInWindowsVM function. Apart from checking exit codes, we also now
have preVM/postVM hooks which we can use to write arbitrary constructs
around this architecture, without the need to worry about specific
details.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
-rw-r--r--pkgs/build-support/vm/windows/controller/default.nix28
1 files changed, 23 insertions, 5 deletions
diff --git a/pkgs/build-support/vm/windows/controller/default.nix b/pkgs/build-support/vm/windows/controller/default.nix
index 4a3e88a22c69..621729eaabb2 100644
--- a/pkgs/build-support/vm/windows/controller/default.nix
+++ b/pkgs/build-support/vm/windows/controller/default.nix
@@ -128,12 +128,10 @@ let
       -i /ssh.key \
       -l Administrator \
       192.168.0.1 -- ${shellEscape command}
-
-    ${lib.optionalString (suspendTo != null) ''
+  '') + lib.optionalString (suspendTo != null) ''
     ${coreutils}/bin/touch /xchg/suspend_now
     ${loopForever}
-    ''}
-  ''));
+  '');
 
   kernelAppend = lib.concatStringsSep " " [
     "panic=1"
@@ -175,6 +173,9 @@ let
     (set; declare -p) > saved-env
     XCHG_DIR="$(${coreutils}/bin/mktemp -d nix-vm.XXXXXXXXXX --tmpdir)"
     ${coreutils}/bin/mv saved-env "$XCHG_DIR/"
+
+    eval "$preVM"
+
     QEMU_VDE_SOCKET="$(pwd)/vde.ctl"
     MONITOR_SOCKET="$(pwd)/monitor"
     ${vde2}/bin/vde_switch -s "$QEMU_VDE_SOCKET" &
@@ -190,7 +191,9 @@ let
   '' else ''
     ${vmTools.qemuProg} ${cygwinQemuArgs} &
     ${vmTools.qemuProg} ${controllerQemuArgs}${bgBoth}
-  '' + lib.optionalString (suspendTo != null) ''
+  '';
+
+  postVM = if suspendTo != null then ''
     while ! test -e "$XCHG_DIR/suspend_now"; do sleep 1; done
     ${socat}/bin/socat - UNIX-CONNECT:$MONITOR_SOCKET <<CMD
     stop
@@ -199,10 +202,25 @@ let
     quit
     CMD
     wait %-
+
+    eval "$postVM"
+    exit 0
+  '' else if installMode then ''
+    eval "$postVM"
+    exit 0
+  '' else ''
+    if ! test -e "$XCHG_DIR/in-vm-exit"; then
+      echo "Virtual machine didn't produce an exit code."
+      exit 1
+    fi
+
+    eval "$postVM"
+    exit $(< "$XCHG_DIR/in-vm-exit")
   '';
 
 in writeScript "run-cygwin-vm.sh" ''
   #!${stdenv.shell} -e
   ${preVM}
   ${vmExec}
+  ${postVM}
 ''