func (t *tty) attach(process *libcontainer.Process) error { if t.console != nil { go io.Copy(t.console, os.Stdin) go io.Copy(os.Stdout, t.console) state, err := term.SetRawTerminal(os.Stdin.Fd()) if err != nil { return err } t.state = state process.Stderr = nil process.Stdout = nil process.Stdin = nil } else { // setup standard pipes so that the TTY of the calling nsinit process // is not inherited by the container. r, w, err := os.Pipe() if err != nil { return err } go io.Copy(w, os.Stdin) t.closers = append(t.closers, w) process.Stdin = r if r, w, err = os.Pipe(); err != nil { return err } go io.Copy(os.Stdout, r) process.Stdout = w t.closers = append(t.closers, r) if r, w, err = os.Pipe(); err != nil { return err } go io.Copy(os.Stderr, r) process.Stderr = w t.closers = append(t.closers, r) } return nil }
func (t *tty) attach(process *libcontainer.Process) error { if t.console != nil { go io.Copy(t.console, os.Stdin) go io.Copy(os.Stdout, t.console) state, err := term.SetRawTerminal(os.Stdin.Fd()) if err != nil { return err } t.state = state process.Stderr = nil process.Stdout = nil process.Stdin = nil } return nil }
func setupPipes(container *configs.Config, processConfig *execdriver.ProcessConfig, p *libcontainer.Process, pipes *execdriver.Pipes) error { var term execdriver.Terminal var err error if processConfig.Tty { rootuid, err := container.HostUID() if err != nil { return err } cons, err := p.NewConsole(rootuid) if err != nil { return err } term, err = NewTtyConsole(cons, pipes, rootuid) } else { p.Stdout = pipes.Stdout p.Stderr = pipes.Stderr r, w, err := os.Pipe() if err != nil { return err } if pipes.Stdin != nil { go func() { io.Copy(w, pipes.Stdin) w.Close() }() p.Stdin = r } term = &execdriver.StdConsole{} } if err != nil { return err } processConfig.Terminal = term return nil }