From 0e20378840bd9d0b330492db4659f0983768f537 Mon Sep 17 00:00:00 2001 From: Oz Katz Date: Fri, 12 Apr 2024 14:49:39 +0300 Subject: [PATCH 1/3] Allow os.FileInfo impls to provide a *file.FileInfo --- file/file.go | 12 +++++++++++- file/file_unix.go | 2 +- file/file_windows.go | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/file/file.go b/file/file.go index 2853868..36cb458 100644 --- a/file/file.go +++ b/file/file.go @@ -11,7 +11,17 @@ type FileInfo struct { Fileid uint64 } +// FileInfoGetter allows os.FileInfo implementations that implement +// the GetFileInfo() method to explicitly return a *FileInfo. +// Useful for explicitly setting a Fileid without having to use the syscall package +type FileInfoGetter interface { + GetFileInfo() *FileInfo +} + // GetInfo extracts some non-standardized items from the result of a Stat call. func GetInfo(fi os.FileInfo) *FileInfo { - return getInfo(fi) + if v, ok := fi.(FileInfoGetter); ok { + return v.GetFileInfo() + } + return getOSFileInfo(fi) } diff --git a/file/file_unix.go b/file/file_unix.go index 6658c20..148c23f 100644 --- a/file/file_unix.go +++ b/file/file_unix.go @@ -9,7 +9,7 @@ import ( "golang.org/x/sys/unix" ) -func getInfo(info os.FileInfo) *FileInfo { +func getOSFileInfo(info os.FileInfo) *FileInfo { fi := &FileInfo{} if s, ok := info.Sys().(*syscall.Stat_t); ok { fi.Nlink = uint32(s.Nlink) diff --git a/file/file_windows.go b/file/file_windows.go index ef173d5..093cf25 100644 --- a/file/file_windows.go +++ b/file/file_windows.go @@ -4,7 +4,7 @@ package file import "os" -func getInfo(info os.FileInfo) *FileInfo { +func getOSFileInfo(info os.FileInfo) *FileInfo { // https://godoc.org/golang.org/x/sys/windows#GetFileInformationByHandle // can be potentially used to populate Nlink From 7bf8f82309a4bb6149625e006fa9dbeb2180678b Mon Sep 17 00:00:00 2001 From: Oz Katz Date: Sat, 13 Apr 2024 17:26:24 +0300 Subject: [PATCH 2/3] test if FileInfo.Sys() returns a *file.FileInfo and use that --- file/file.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/file/file.go b/file/file.go index 36cb458..6394578 100644 --- a/file/file.go +++ b/file/file.go @@ -11,17 +11,11 @@ type FileInfo struct { Fileid uint64 } -// FileInfoGetter allows os.FileInfo implementations that implement -// the GetFileInfo() method to explicitly return a *FileInfo. -// Useful for explicitly setting a Fileid without having to use the syscall package -type FileInfoGetter interface { - GetFileInfo() *FileInfo -} - // GetInfo extracts some non-standardized items from the result of a Stat call. func GetInfo(fi os.FileInfo) *FileInfo { - if v, ok := fi.(FileInfoGetter); ok { - return v.GetFileInfo() + sys := fi.Sys() + if v, ok := sys.(*FileInfo); ok { + return v } return getOSFileInfo(fi) } From 29e3699a267bae2698b8cec31966bd90712bb18c Mon Sep 17 00:00:00 2001 From: Oz Katz Date: Sat, 13 Apr 2024 17:28:32 +0300 Subject: [PATCH 3/3] support both pointer and values --- file/file.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/file/file.go b/file/file.go index 6394578..cdaad26 100644 --- a/file/file.go +++ b/file/file.go @@ -14,8 +14,12 @@ type FileInfo struct { // GetInfo extracts some non-standardized items from the result of a Stat call. func GetInfo(fi os.FileInfo) *FileInfo { sys := fi.Sys() - if v, ok := sys.(*FileInfo); ok { + switch v := sys.(type) { + case FileInfo: + return &v + case *FileInfo: return v + default: + return getOSFileInfo(fi) } - return getOSFileInfo(fi) }