Skip to content

Commit

Permalink
os: make openFdAt act like openFileNolog
Browse files Browse the repository at this point in the history
- 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>
  • Loading branch information
ianlancetaylor committed Jan 30, 2019
1 parent f1d662f commit eb72a30
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 5 deletions.
1 change: 1 addition & 0 deletions src/os/file_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ func epipecheck(file *File, e error) {
const DevNull = "/dev/null"

// 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) {
setSticky := false
if !supportsCreateWithStickyBit && flag&O_CREATE != 0 && perm&ModeSticky != 0 {
Expand Down
31 changes: 26 additions & 5 deletions src/os/removeall_at.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ package os
import (
"internal/syscall/unix"
"io"
"runtime"
"syscall"
)

Expand Down Expand Up @@ -128,11 +129,31 @@ func removeAllFrom(parent *File, path string) error {
return unlinkError
}

func openFdAt(fd int, path string) (*File, error) {
fd, err := unix.Openat(fd, path, O_RDONLY, 0)
if err != nil {
return nil, err
// openFdAt opens path relative to the directory in fd.
// Other than that this should act like openFileNolog.
// This acts like openFileNolog rather than OpenFile because
// 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}
}

if !supportsCloseOnExec {
syscall.CloseOnExec(r)
}

return NewFile(uintptr(fd), path), nil
return newFile(uintptr(r), name, kindOpenFile), nil
}

0 comments on commit eb72a30

Please sign in to comment.