| package libcontainerd |
| |
| import ( |
| "os" |
| "path/filepath" |
| |
| "github.com/pkg/errors" |
| "golang.org/x/sys/unix" |
| ) |
| |
| var fdNames = map[int]string{ |
| unix.Stdin: "stdin", |
| unix.Stdout: "stdout", |
| unix.Stderr: "stderr", |
| } |
| |
| func (p *process) pipeName(index int) string { |
| return filepath.Join(p.root, p.id+"-"+fdNames[index]) |
| } |
| |
| func (p *process) IOPaths() (string, string, string) { |
| var ( |
| stdin = p.pipeName(unix.Stdin) |
| stdout = p.pipeName(unix.Stdout) |
| stderr = p.pipeName(unix.Stderr) |
| ) |
| // TODO: debug why we're having zombies when I don't unset those |
| if p.io.Stdin == nil { |
| stdin = "" |
| } |
| if p.io.Stderr == nil { |
| stderr = "" |
| } |
| return stdin, stdout, stderr |
| } |
| |
| func (p *process) Cleanup() error { |
| var retErr error |
| |
| // Ensure everything was closed |
| p.CloseIO() |
| |
| for _, i := range [3]string{ |
| p.pipeName(unix.Stdin), |
| p.pipeName(unix.Stdout), |
| p.pipeName(unix.Stderr), |
| } { |
| err := os.Remove(i) |
| if err != nil { |
| if retErr == nil { |
| retErr = errors.Wrapf(err, "failed to remove %s", i) |
| } else { |
| retErr = errors.Wrapf(retErr, "failed to remove %s", i) |
| } |
| } |
| } |
| |
| return retErr |
| } |