-
Notifications
You must be signed in to change notification settings - Fork 245
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2071 from dfr/freebsd-exists
pkg/fileutils: fix Lexists on FreeBSD
- Loading branch information
Showing
2 changed files
with
39 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
package fileutils | ||
|
||
import ( | ||
"errors" | ||
"os" | ||
"syscall" | ||
|
||
"golang.org/x/sys/unix" | ||
) | ||
|
||
// Exists checks whether a file or directory exists at the given path. | ||
// If the path is a symlink, the symlink is followed. | ||
func Exists(path string) error { | ||
// It uses unix.Faccessat which is a faster operation compared to os.Stat for | ||
// simply checking the existence of a file. | ||
err := unix.Faccessat(unix.AT_FDCWD, path, unix.F_OK, 0) | ||
if err != nil { | ||
return &os.PathError{Op: "faccessat", Path: path, Err: err} | ||
} | ||
return nil | ||
} | ||
|
||
// Lexists checks whether a file or directory exists at the given path. | ||
// If the path is a symlink, the symlink itself is checked. | ||
func Lexists(path string) error { | ||
// FreeBSD before 15.0 does not support the AT_SYMLINK_NOFOLLOW flag for | ||
// faccessat. In this case, the call to faccessat will return EINVAL and | ||
// we fall back to using Lstat. | ||
err := unix.Faccessat(unix.AT_FDCWD, path, unix.F_OK, unix.AT_SYMLINK_NOFOLLOW) | ||
if err != nil && errors.Is(err, syscall.EINVAL) { | ||
_, err = os.Lstat(path) | ||
} | ||
if err != nil { | ||
return &os.PathError{Op: "faccessat", Path: path, Err: err} | ||
} | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters