package execdriver import ( "io" "os/exec" ) // StdConsole defines standard console operations for execdriver type StdConsole struct { // Closers holds io.Closer references for closing at terminal close time Closers []io.Closer } // NewStdConsole returns a new StdConsole struct func NewStdConsole(processConfig *ProcessConfig, pipes *Pipes) (*StdConsole, error) { std := &StdConsole{} if err := std.AttachPipes(&processConfig.Cmd, pipes); err != nil { return nil, err } return std, nil } // AttachPipes attaches given pipes to exec.Cmd func (s *StdConsole) AttachPipes(command *exec.Cmd, pipes *Pipes) error { command.Stdout = pipes.Stdout command.Stderr = pipes.Stderr if pipes.Stdin != nil { stdin, err := command.StdinPipe() if err != nil { return err } go func() { defer stdin.Close() io.Copy(stdin, pipes.Stdin) }() } return nil } // Resize implements Resize method of Terminal interface func (s *StdConsole) Resize(h, w int) error { // we do not need to resize a non tty return nil } // Close implements Close method of Terminal interface func (s *StdConsole) Close() error { for _, c := range s.Closers { c.Close() } return nil }