Skip to content

Commit

Permalink
pkg/fileutils: fix Lexists on FreeBSD
Browse files Browse the repository at this point in the history
The faccessat system call does not support AT_SYMLINK_NOFOLLOW on
FreeBSD versions before 15.0. This works around the limitation by
falling back to os.Lstat if faccessat returns an EINVAL error.

Signed-off-by: Doug Rabson <[email protected]>
  • Loading branch information
dfr committed Aug 21, 2024
1 parent 7908bb8 commit a603753
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 2 deletions.
37 changes: 37 additions & 0 deletions pkg/fileutils/exists_freebsd.go
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
}
4 changes: 2 additions & 2 deletions pkg/fileutils/exists_unix.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//go:build !windows
// +build !windows
//go:build !windows && !freebsd
// +build !windows,!freebsd

package fileutils

Expand Down

0 comments on commit a603753

Please sign in to comment.