diff --git a/tools/utils/file_at_fd.go b/tools/utils/file_at_fd.go index ab8101b34..c4456f93d 100644 --- a/tools/utils/file_at_fd.go +++ b/tools/utils/file_at_fd.go @@ -347,12 +347,7 @@ func ConvertFileModeToUnix(goMode os.FileMode) uint32 { func MknodAt(parent *os.File, name string, mode os.FileMode, dev int) (err error) { unix_mode := ConvertFileModeToUnix(mode) - for { - if err = unix.Mknodat(int(parent.Fd()), name, unix_mode, dev); err != unix.EINTR { - break - } - } - if err != nil { + if err = mknodAt(parent, name, unix_mode, dev); err != nil { err = &os.PathError{Op: "mknodat", Path: filepath.Join(parent.Name(), name), Err: err} } return diff --git a/tools/utils/file_at_fd_darwin.go b/tools/utils/file_at_fd_darwin.go new file mode 100644 index 000000000..94d2ad451 --- /dev/null +++ b/tools/utils/file_at_fd_darwin.go @@ -0,0 +1,21 @@ +package utils + +import ( + "fmt" + "os" + "path/filepath" + + "golang.org/x/sys/unix" +) + +var _ = fmt.Print + +func mknodAt(parent *os.File, name string, mode uint32, dev int) (err error) { + path := filepath.Join(parent.Name(), name) + for { + if err = unix.Mknod(path, mode, dev); err != unix.EINTR { + break + } + } + return +} diff --git a/tools/utils/file_at_fd_generic.go b/tools/utils/file_at_fd_generic.go new file mode 100644 index 000000000..e7c5285a0 --- /dev/null +++ b/tools/utils/file_at_fd_generic.go @@ -0,0 +1,21 @@ +//go:build !darwin + +package utils + +import ( + "fmt" + "os" + + "golang.org/x/sys/unix" +) + +var _ = fmt.Print + +func mknodAt(parent *os.File, name string, mode uint32, dev int) (err error) { + for { + if err = unix.Mknodat(int(parent.Fd()), name, mode, dev); err != unix.EINTR { + break + } + } + return +}