Merge "lib/testutil/integration: use /dev/tty as DebugShell stdout"
diff --git a/lib/testutil/integration/util.go b/lib/testutil/integration/util.go
index 6c4b185..81e148a 100644
--- a/lib/testutil/integration/util.go
+++ b/lib/testutil/integration/util.go
@@ -221,6 +221,13 @@
 	}
 }
 
+func writeStringOrDie(t *testing.T, f *os.File, s string) {
+	_, err := f.WriteString(s)
+	if err != nil {
+		t.Fatalf("Write() failed: %v", err)
+	}
+}
+
 func (e *integrationTestEnvironment) DebugShell() {
 	// Get the current working directory.
 	cwd, err := os.Getwd()
@@ -231,26 +238,27 @@
 	// Transfer stdin, stdout, and stderr to the new process
 	// and also set target directory for the shell to start in.
 	dev := "/dev/tty"
-	fd, err := syscall.Open(dev, 0, 0)
+	fd, err := syscall.Open(dev, syscall.O_RDWR, 0)
 	if err != nil {
-		e.t.Logf("WARNING: Open(%v) failed, not going to create a debug shell: %v", dev, err)
+		e.t.Logf("WARNING: Open(%v) failed, was asked to create a debug shell but cannot: %v", dev, err)
 		return
 	}
+	file := os.NewFile(uintptr(fd), dev)
 	attr := os.ProcAttr{
-		Files: []*os.File{os.NewFile(uintptr(fd), "/dev/tty"), os.Stdout, os.Stderr},
+		Files: []*os.File{file, file, file},
 		Dir:   cwd,
 	}
 
 	// Start up a new shell.
-	fmt.Printf(">> Starting a new interactive shell\n")
-	fmt.Printf("Hit CTRL-D to resume the test\n")
+	writeStringOrDie(e.t, file, ">> Starting a new interactive shell\n")
+	writeStringOrDie(e.t, file, "Hit CTRL-D to resume the test\n")
 	if len(e.builtBinaries) > 0 {
-		fmt.Println("Built binaries:")
+		writeStringOrDie(e.t, file, "Built binaries:")
 		for _, value := range e.builtBinaries {
-			fmt.Println(value.Path())
+			writeStringOrDie(e.t, file, value.Path()+"\n")
 		}
 	}
-	fmt.Println("Root mounttable endpoint:", e.RootMT())
+	writeStringOrDie(e.t, file, fmt.Sprintf("Root mounttable endpoint: %s\n", e.RootMT()))
 
 	shellPath := "/bin/sh"
 	proc, err := os.StartProcess(shellPath, []string{}, &attr)
@@ -264,7 +272,7 @@
 		e.t.Fatalf("Wait(%v) failed: %v", shellPath, err)
 	}
 
-	fmt.Printf("<< Exited shell: %s\n", state.String())
+	writeStringOrDie(e.t, file, fmt.Sprintf("<< Exited shell: %s\n", state.String()))
 }
 
 func (e *integrationTestEnvironment) BuildGoPkg(binary_path string) TestBinary {