utils.go 608 B

12345678910111213141516171819202122232425262728293031323334
  1. package hcs
  2. import (
  3. "io"
  4. "syscall"
  5. "github.com/Microsoft/go-winio"
  6. )
  7. // makeOpenFiles calls winio.MakeOpenFile for each handle in a slice but closes all the handles
  8. // if there is an error.
  9. func makeOpenFiles(hs []syscall.Handle) (_ []io.ReadWriteCloser, err error) {
  10. fs := make([]io.ReadWriteCloser, len(hs))
  11. for i, h := range hs {
  12. if h != syscall.Handle(0) {
  13. if err == nil {
  14. fs[i], err = winio.MakeOpenFile(h)
  15. }
  16. if err != nil {
  17. syscall.Close(h)
  18. }
  19. }
  20. }
  21. if err != nil {
  22. for _, f := range fs {
  23. if f != nil {
  24. f.Close()
  25. }
  26. }
  27. return nil, err
  28. }
  29. return fs, nil
  30. }