@@ -14,8 +14,8 @@ import (
1414 "github.com/containerd/fifo"
1515)
1616
17- // NewFifos returns a new set of fifos for the task
18- func NewFifos (id string ) (* FIFOSet , error ) {
17+ // newFIFOSetTempDir returns a new set of fifos for the task
18+ func newFIFOSetTempDir (id string ) (* FIFOSet , error ) {
1919 root := "/run/containerd/fifo"
2020 if err := os .MkdirAll (root , 0700 ); err != nil {
2121 return nil , err
@@ -24,21 +24,23 @@ func NewFifos(id string) (*FIFOSet, error) {
2424 if err != nil {
2525 return nil , err
2626 }
27- return & FIFOSet {
28- Dir : dir ,
29- In : filepath .Join (dir , id + "-stdin" ),
30- Out : filepath .Join (dir , id + "-stdout" ),
31- Err : filepath .Join (dir , id + "-stderr" ),
32- }, nil
27+ closer := func () error {
28+ return os .RemoveAll (dir )
29+ }
30+ return NewFIFOSet (Config {
31+ Stdin : filepath .Join (dir , id + "-stdin" ),
32+ Stdout : filepath .Join (dir , id + "-stdout" ),
33+ Stderr : filepath .Join (dir , id + "-stderr" ),
34+ }, closer ), nil
3335}
3436
3537func copyIO (fifos * FIFOSet , ioset * ioSet , tty bool ) (_ * wgCloser , err error ) {
3638 var (
3739 f io.ReadWriteCloser
38- set []io.Closer
3940 ctx , cancel = context .WithCancel (context .Background ())
4041 wg = & sync.WaitGroup {}
4142 )
43+ set := []io.Closer {fifos }
4244 defer func () {
4345 if err != nil {
4446 for _ , f := range set {
@@ -48,7 +50,7 @@ func copyIO(fifos *FIFOSet, ioset *ioSet, tty bool) (_ *wgCloser, err error) {
4850 }
4951 }()
5052
51- if f , err = fifo .OpenFifo (ctx , fifos .In , syscall .O_WRONLY | syscall .O_CREAT | syscall .O_NONBLOCK , 0700 ); err != nil {
53+ if f , err = fifo .OpenFifo (ctx , fifos .Stdin , syscall .O_WRONLY | syscall .O_CREAT | syscall .O_NONBLOCK , 0700 ); err != nil {
5254 return nil , err
5355 }
5456 set = append (set , f )
@@ -57,7 +59,7 @@ func copyIO(fifos *FIFOSet, ioset *ioSet, tty bool) (_ *wgCloser, err error) {
5759 w .Close ()
5860 }(f )
5961
60- if f , err = fifo .OpenFifo (ctx , fifos .Out , syscall .O_RDONLY | syscall .O_CREAT | syscall .O_NONBLOCK , 0700 ); err != nil {
62+ if f , err = fifo .OpenFifo (ctx , fifos .Stdout , syscall .O_RDONLY | syscall .O_CREAT | syscall .O_NONBLOCK , 0700 ); err != nil {
6163 return nil , err
6264 }
6365 set = append (set , f )
@@ -68,7 +70,7 @@ func copyIO(fifos *FIFOSet, ioset *ioSet, tty bool) (_ *wgCloser, err error) {
6870 wg .Done ()
6971 }(f )
7072
71- if f , err = fifo .OpenFifo (ctx , fifos .Err , syscall .O_RDONLY | syscall .O_CREAT | syscall .O_NONBLOCK , 0700 ); err != nil {
73+ if f , err = fifo .OpenFifo (ctx , fifos .Stderr , syscall .O_RDONLY | syscall .O_CREAT | syscall .O_NONBLOCK , 0700 ); err != nil {
7274 return nil , err
7375 }
7476 set = append (set , f )
@@ -83,35 +85,33 @@ func copyIO(fifos *FIFOSet, ioset *ioSet, tty bool) (_ *wgCloser, err error) {
8385 }
8486 return & wgCloser {
8587 wg : wg ,
86- dir : fifos .Dir ,
8788 set : set ,
8889 cancel : cancel ,
8990 }, nil
9091}
9192
9293// NewDirectIO returns an IO implementation that exposes the pipes directly
9394func NewDirectIO (ctx context.Context , terminal bool ) (* DirectIO , error ) {
94- set , err := NewFifos ("" )
95+ set , err := newFIFOSetTempDir ("" )
9596 if err != nil {
9697 return nil , err
9798 }
98- f := & DirectIO {
99- set : set ,
100- terminal : terminal ,
101- }
99+ set .Terminal = terminal
100+ f := & DirectIO {set : set }
101+
102102 defer func () {
103103 if err != nil {
104104 f .Delete ()
105105 }
106106 }()
107- if f .Stdin , err = fifo .OpenFifo (ctx , set .In , syscall .O_WRONLY | syscall .O_CREAT | syscall .O_NONBLOCK , 0700 ); err != nil {
107+ if f .Stdin , err = fifo .OpenFifo (ctx , set .Stdin , syscall .O_WRONLY | syscall .O_CREAT | syscall .O_NONBLOCK , 0700 ); err != nil {
108108 return nil , err
109109 }
110- if f .Stdout , err = fifo .OpenFifo (ctx , set .Out , syscall .O_RDONLY | syscall .O_CREAT | syscall .O_NONBLOCK , 0700 ); err != nil {
110+ if f .Stdout , err = fifo .OpenFifo (ctx , set .Stdout , syscall .O_RDONLY | syscall .O_CREAT | syscall .O_NONBLOCK , 0700 ); err != nil {
111111 f .Stdin .Close ()
112112 return nil , err
113113 }
114- if f .Stderr , err = fifo .OpenFifo (ctx , set .Err , syscall .O_RDONLY | syscall .O_CREAT | syscall .O_NONBLOCK , 0700 ); err != nil {
114+ if f .Stderr , err = fifo .OpenFifo (ctx , set .Stderr , syscall .O_RDONLY | syscall .O_CREAT | syscall .O_NONBLOCK , 0700 ); err != nil {
115115 f .Stdin .Close ()
116116 f .Stdout .Close ()
117117 return nil , err
@@ -125,8 +125,7 @@ type DirectIO struct {
125125 Stdout io.ReadCloser
126126 Stderr io.ReadCloser
127127
128- set * FIFOSet
129- terminal bool
128+ set * FIFOSet
130129}
131130
132131// IOCreate returns IO avaliable for use with task creation
@@ -141,12 +140,7 @@ func (f *DirectIO) IOAttach(set *FIFOSet) (IO, error) {
141140
142141// Config returns the Config
143142func (f * DirectIO ) Config () Config {
144- return Config {
145- Terminal : f .terminal ,
146- Stdin : f .set .In ,
147- Stdout : f .set .Out ,
148- Stderr : f .set .Err ,
149- }
143+ return f .set .Config
150144}
151145
152146// Cancel stops any IO copy operations
@@ -177,8 +171,5 @@ func (f *DirectIO) Close() error {
177171
178172// Delete removes the underlying directory containing fifos
179173func (f * DirectIO ) Delete () error {
180- if f .set .Dir == "" {
181- return nil
182- }
183- return os .RemoveAll (f .set .Dir )
174+ return f .set .Close ()
184175}
0 commit comments