mirror of
https://github.com/golang/go
synced 2024-11-13 17:30:24 -07:00
os: make openFdAt act like openFileNolog
- add EINTR loop on Darwin - return PathError on error - call newFile rather than NewFile This tries to minimize the possibility of any future changes. It would be nice to put openFdAt in the same file as openFileNolog, but build tags forbid. Updates #29983 Change-Id: I866002416d6473fbfd80ff6ef09b2bc4607f2934 Reviewed-on: https://go-review.googlesource.com/c/160181 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Damien Neil <dneil@google.com>
This commit is contained in:
parent
f1d662f347
commit
eb72a30f87
@ -186,6 +186,7 @@ func epipecheck(file *File, e error) {
|
|||||||
const DevNull = "/dev/null"
|
const DevNull = "/dev/null"
|
||||||
|
|
||||||
// openFileNolog is the Unix implementation of OpenFile.
|
// openFileNolog is the Unix implementation of OpenFile.
|
||||||
|
// Changes here should be reflected in openFdAt, if relevant.
|
||||||
func openFileNolog(name string, flag int, perm FileMode) (*File, error) {
|
func openFileNolog(name string, flag int, perm FileMode) (*File, error) {
|
||||||
setSticky := false
|
setSticky := false
|
||||||
if !supportsCreateWithStickyBit && flag&O_CREATE != 0 && perm&ModeSticky != 0 {
|
if !supportsCreateWithStickyBit && flag&O_CREATE != 0 && perm&ModeSticky != 0 {
|
||||||
|
@ -9,6 +9,7 @@ package os
|
|||||||
import (
|
import (
|
||||||
"internal/syscall/unix"
|
"internal/syscall/unix"
|
||||||
"io"
|
"io"
|
||||||
|
"runtime"
|
||||||
"syscall"
|
"syscall"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -128,11 +129,31 @@ func removeAllFrom(parent *File, path string) error {
|
|||||||
return unlinkError
|
return unlinkError
|
||||||
}
|
}
|
||||||
|
|
||||||
func openFdAt(fd int, path string) (*File, error) {
|
// openFdAt opens path relative to the directory in fd.
|
||||||
fd, err := unix.Openat(fd, path, O_RDONLY, 0)
|
// Other than that this should act like openFileNolog.
|
||||||
if err != nil {
|
// This acts like openFileNolog rather than OpenFile because
|
||||||
return nil, err
|
// we are going to (try to) remove the file.
|
||||||
|
// The contents of this file are not relevant for test caching.
|
||||||
|
func openFdAt(dirfd int, name string) (*File, error) {
|
||||||
|
var r int
|
||||||
|
for {
|
||||||
|
var e error
|
||||||
|
r, e = unix.Openat(dirfd, name, O_RDONLY, 0)
|
||||||
|
if e == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// See comment in openFileNolog.
|
||||||
|
if runtime.GOOS == "darwin" && e == syscall.EINTR {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, &PathError{"openat", name, e}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NewFile(uintptr(fd), path), nil
|
if !supportsCloseOnExec {
|
||||||
|
syscall.CloseOnExec(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
return newFile(uintptr(r), name, kindOpenFile), nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user