package command import ( "io" "os" "github.com/Sirupsen/logrus" "github.com/docker/docker/pkg/term" ) // OutStream is an output stream used by the DockerCli to write normal program // output. type OutStream struct { out io.Writer fd uintptr isTerminal bool state *term.State } func (o *OutStream) Write(p []byte) (int, error) { return o.out.Write(p) } // FD returns the file descriptor number for this stream func (o *OutStream) FD() uintptr { return o.fd } // IsTerminal returns true if this stream is connected to a terminal func (o *OutStream) IsTerminal() bool { return o.isTerminal } // SetRawTerminal sets raw mode on the output terminal func (o *OutStream) SetRawTerminal() (err error) { if os.Getenv("NORAW") != "" || !o.isTerminal { return nil } o.state, err = term.SetRawTerminalOutput(o.fd) return err } // RestoreTerminal restores normal mode to the terminal func (o *OutStream) RestoreTerminal() { if o.state != nil { term.RestoreTerminal(o.fd, o.state) } } // GetTtySize returns the height and width in characters of the tty func (o *OutStream) GetTtySize() (uint, uint) { if !o.isTerminal { return 0, 0 } ws, err := term.GetWinsize(o.fd) if err != nil { logrus.Debugf("Error getting size: %s", err) if ws == nil { return 0, 0 } } return uint(ws.Height), uint(ws.Width) } // NewOutStream returns a new OutStream object from a Writer func NewOutStream(out io.Writer) *OutStream { fd, isTerminal := term.GetFdInfo(out) return &OutStream{out: out, fd: fd, isTerminal: isTerminal} }