8 "golang.org/x/sys/unix"
13 Stdin() io.WriteCloser
14 Stdout() io.ReadCloser
15 Stderr() io.ReadCloser
19 type StartCloser interface {
20 CloseAfterStart() error
23 // NewPipeIO creates pipe pairs to be used with runc
24 func NewPipeIO(uid, gid int) (i IO, err error) {
26 // cleanup in case of an error
29 for _, p := range pipes {
34 stdin, err := newPipe(uid, gid)
38 pipes = append(pipes, stdin)
40 stdout, err := newPipe(uid, gid)
44 pipes = append(pipes, stdout)
46 stderr, err := newPipe(uid, gid)
50 pipes = append(pipes, stderr)
59 func newPipe(uid, gid int) (*pipe, error) {
60 r, w, err := os.Pipe()
64 if err := unix.Fchown(int(r.Fd()), uid, gid); err != nil {
67 if err := unix.Fchown(int(w.Fd()), uid, gid); err != nil {
81 func (p *pipe) Close() error {
83 if werr := p.w.Close(); err == nil {
95 func (i *pipeIO) Stdin() io.WriteCloser {
99 func (i *pipeIO) Stdout() io.ReadCloser {
103 func (i *pipeIO) Stderr() io.ReadCloser {
107 func (i *pipeIO) Close() error {
109 for _, v := range []*pipe{
114 if cerr := v.Close(); err == nil {
121 func (i *pipeIO) CloseAfterStart() error {
122 for _, f := range []*os.File{
131 // Set sets the io to the exec.Cmd
132 func (i *pipeIO) Set(cmd *exec.Cmd) {
138 func NewSTDIO() (IO, error) {
145 func (s *stdio) Close() error {
149 func (s *stdio) Set(cmd *exec.Cmd) {
151 cmd.Stdout = os.Stdout
152 cmd.Stderr = os.Stderr
155 func (s *stdio) Stdin() io.WriteCloser {
159 func (s *stdio) Stdout() io.ReadCloser {
163 func (s *stdio) Stderr() io.ReadCloser {