func hijack(conn net.Conn, br *bufio.Reader) int { var in io.Reader term, err := pty.OpenRawTerm() if err == nil { defer term.Restore() in = term } else { in = os.Stdin } encoder := json.NewEncoder(conn) decoder := json.NewDecoder(br) resized := pty.ResizeNotifier() go func() { for { <-resized // TODO json race sendSize(encoder) } }() go io.Copy(&stdinWriter{encoder}, in) var exitStatus int for { var output atc.HijackOutput err := decoder.Decode(&output) if err != nil { break } if output.ExitStatus != nil { exitStatus = *output.ExitStatus } else if len(output.Error) > 0 { fmt.Fprintf(os.Stderr, "%s\n", ansi.Color(output.Error, "red+b")) exitStatus = 255 } else if len(output.Stdout) > 0 { os.Stdout.Write(output.Stdout) } else if len(output.Stderr) > 0 { os.Stderr.Write(output.Stderr) } } return exitStatus }
func (h *Hijacker) monitorTTYSize(inputs chan<- atc.HijackInput, finished chan struct{}) { resized := pty.ResizeNotifier() for { select { case <-resized: rows, cols, err := pty.Getsize(os.Stdin) if err == nil { inputs <- atc.HijackInput{ TTYSpec: &atc.HijackTTYSpec{ WindowSize: atc.HijackWindowSize{ Columns: cols, Rows: rows, }, }, } } case <-finished: return } } }