io_unix.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // +build !windows
  2. package libcontainerd
  3. import (
  4. "context"
  5. "io"
  6. "syscall"
  7. "github.com/containerd/containerd/cio"
  8. "github.com/containerd/fifo"
  9. "github.com/pkg/errors"
  10. )
  11. func newIOPipe(fifos *cio.FIFOSet) (*IOPipe, error) {
  12. var (
  13. err error
  14. ctx, cancel = context.WithCancel(context.Background())
  15. f io.ReadWriteCloser
  16. iop = &IOPipe{
  17. Terminal: fifos.Terminal,
  18. cancel: cancel,
  19. config: cio.Config{
  20. Terminal: fifos.Terminal,
  21. Stdin: fifos.In,
  22. Stdout: fifos.Out,
  23. Stderr: fifos.Err,
  24. },
  25. }
  26. )
  27. defer func() {
  28. if err != nil {
  29. cancel()
  30. iop.Close()
  31. }
  32. }()
  33. if fifos.In != "" {
  34. if f, err = fifo.OpenFifo(ctx, fifos.In, syscall.O_WRONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); err != nil {
  35. return nil, errors.WithStack(err)
  36. }
  37. iop.Stdin = f
  38. }
  39. if fifos.Out != "" {
  40. if f, err = fifo.OpenFifo(ctx, fifos.Out, syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); err != nil {
  41. return nil, errors.WithStack(err)
  42. }
  43. iop.Stdout = f
  44. }
  45. if fifos.Err != "" {
  46. if f, err = fifo.OpenFifo(ctx, fifos.Err, syscall.O_RDONLY|syscall.O_CREAT|syscall.O_NONBLOCK, 0700); err != nil {
  47. return nil, errors.WithStack(err)
  48. }
  49. iop.Stderr = f
  50. }
  51. return iop, nil
  52. }