From e33593d30d9dee6fd6b0e7c0d01832e478815d88 Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sun, 3 Dec 2017 17:53:14 +0100 Subject: syscallcompat: add Fstatat + emulation + test Fstatat has recently been added to x/sys/unix. Make it available for use in gocryptfs. --- internal/syscallcompat/emulate.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'internal/syscallcompat/emulate.go') diff --git a/internal/syscallcompat/emulate.go b/internal/syscallcompat/emulate.go index 96776e2..e5aeae7 100644 --- a/internal/syscallcompat/emulate.go +++ b/internal/syscallcompat/emulate.go @@ -210,3 +210,23 @@ func emulateMkdirat(dirfd int, path string, mode uint32) (err error) { } return syscall.Mkdir(path, mode) } + +// emulateFstatat emulates the syscall for platforms that don't have it +// in the kernel (darwin). +func emulateFstatat(dirfd int, path string, stat *unix.Stat_t, flags int) (err error) { + if !filepath.IsAbs(path) { + chdirMutex.Lock() + defer chdirMutex.Unlock() + cwd, err := syscall.Open(".", syscall.O_RDONLY, 0) + if err != nil { + return err + } + defer syscall.Close(cwd) + err = syscall.Fchdir(dirfd) + if err != nil { + return err + } + defer syscall.Fchdir(cwd) + } + return unix.Lstat(path, stat) +} -- cgit v1.2.3