fs_unix.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. //go:build !windows
  2. // Wrappers for unix syscalls that retry on EINTR
  3. // TODO: Consider moving (for example to moby/sys) and making the wrappers
  4. // auto-generated.
  5. package unix_noeintr
  6. import (
  7. "errors"
  8. "golang.org/x/sys/unix"
  9. )
  10. func Retry(f func() error) {
  11. for {
  12. err := f()
  13. if !errors.Is(err, unix.EINTR) {
  14. return
  15. }
  16. }
  17. }
  18. func Mount(source string, target string, fstype string, flags uintptr, data string) (err error) {
  19. Retry(func() error {
  20. err = unix.Mount(source, target, fstype, flags, data)
  21. return err
  22. })
  23. return
  24. }
  25. func Unmount(target string, flags int) (err error) {
  26. Retry(func() error {
  27. err = unix.Unmount(target, flags)
  28. return err
  29. })
  30. return
  31. }
  32. func Open(path string, mode int, perm uint32) (fd int, err error) {
  33. Retry(func() error {
  34. fd, err = unix.Open(path, mode, perm)
  35. return err
  36. })
  37. return
  38. }
  39. func Close(fd int) (err error) {
  40. Retry(func() error {
  41. err = unix.Close(fd)
  42. return err
  43. })
  44. return
  45. }
  46. func Openat(dirfd int, path string, mode int, perms uint32) (fd int, err error) {
  47. Retry(func() error {
  48. fd, err = unix.Openat(dirfd, path, mode, perms)
  49. return err
  50. })
  51. return
  52. }
  53. func Openat2(dirfd int, path string, how *unix.OpenHow) (fd int, err error) {
  54. Retry(func() error {
  55. fd, err = unix.Openat2(dirfd, path, how)
  56. return err
  57. })
  58. return
  59. }
  60. func Fstat(fd int, stat *unix.Stat_t) (err error) {
  61. Retry(func() error {
  62. err = unix.Fstat(fd, stat)
  63. return err
  64. })
  65. return
  66. }
  67. func Fstatat(fd int, path string, stat *unix.Stat_t, flags int) (err error) {
  68. Retry(func() error {
  69. err = unix.Fstatat(fd, path, stat, flags)
  70. return err
  71. })
  72. return
  73. }