diff options
author | Jakob Unterwurzacher | 2017-09-03 15:05:54 +0200 |
---|---|---|
committer | Jakob Unterwurzacher | 2017-09-03 15:05:54 +0200 |
commit | 538cae610cc4f7512cfb7a3b64a47e2fba9ea3c7 (patch) | |
tree | 30971b89484437aefe2f68f125af4d1a7b7b8a30 /internal/syscallcompat | |
parent | a710451d9218aea35709343e5de94a004e431c35 (diff) |
syscallcompat: Getdents: warn once if we get DT_UNKNOWN
...and if Getdents is not available at all.
Due to this warning I now know that SSHFS always returns DT_UNKNOWN:
gocryptfs[8129]: Getdents: convertDType: received DT_UNKNOWN, falling back to Lstat
This behavoir is confirmed at http://ahefner.livejournal.com/16875.html:
"With sshfs, I finally found that obscure case. The dtype is always set to DT_UNKNOWN [...]"
Diffstat (limited to 'internal/syscallcompat')
-rw-r--r-- | internal/syscallcompat/getdents_linux.go | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/internal/syscallcompat/getdents_linux.go b/internal/syscallcompat/getdents_linux.go index 97cd75f..55bffff 100644 --- a/internal/syscallcompat/getdents_linux.go +++ b/internal/syscallcompat/getdents_linux.go @@ -8,6 +8,7 @@ package syscallcompat import ( "bytes" + "sync" "syscall" "unsafe" @@ -121,6 +122,8 @@ func getdentsName(s syscall.Dirent) (string, error) { return string(name), nil } +var dtUnknownWarnOnce sync.Once + // convertDType converts a Dirent.Type to at Stat_t.Mode value. func convertDType(dtype uint8, file string) (uint32, error) { if dtype != syscall.DT_UNKNOWN { @@ -128,6 +131,9 @@ func convertDType(dtype uint8, file string) (uint32, error) { return uint32(dtype) << 12, nil } // DT_UNKNOWN: we have to call Lstat() + dtUnknownWarnOnce.Do(func() { + tlog.Warn.Printf("Getdents: convertDType: received DT_UNKNOWN, falling back to Lstat") + }) var st syscall.Stat_t err := syscall.Lstat(file, &st) if err != nil { |