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  }