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