aboutsummaryrefslogtreecommitdiff
path: root/internal/syscallcompat/sys_darwin.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/syscallcompat/sys_darwin.go')
-rw-r--r--internal/syscallcompat/sys_darwin.go23
1 files changed, 14 insertions, 9 deletions
diff --git a/internal/syscallcompat/sys_darwin.go b/internal/syscallcompat/sys_darwin.go
index 4068e1a..527598b 100644
--- a/internal/syscallcompat/sys_darwin.go
+++ b/internal/syscallcompat/sys_darwin.go
@@ -6,6 +6,8 @@ import (
"path/filepath"
"sync"
"syscall"
+
+ "golang.org/x/sys/unix"
)
// Sorry, fallocate is not available on OSX at all and
@@ -71,21 +73,24 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) error
}
// Poor man's Unlinkat
-func Unlinkat(dirfd int, path string) error {
+func Unlinkat(dirfd int, path string, flags int) (err error) {
chdirMutex.Lock()
defer chdirMutex.Unlock()
- if !filepath.IsAbs(path) {
- oldWd, err := os.Getwd()
- if err != nil {
- return err
- }
- defer os.Chdir(oldWd)
+ cwd, err := syscall.Open(".", syscall.O_RDONLY, 0)
+ if err != nil {
+ return err
}
- path, err := dirfdAbs(dirfd, path)
+ defer syscall.Close(cwd)
+ err = syscall.Fchdir(dirfd)
if err != nil {
return err
}
- return syscall.Unlink(path)
+ defer syscall.Fchdir(cwd)
+ if (flags & unix.AT_REMOVEDIR) != 0 {
+ return syscall.Rmdir(path)
+ } else {
+ return syscall.Unlink(path)
+ }
}
// Poor man's Mknodat