summaryrefslogtreecommitdiffhomepage
path: root/tailfs/shared/stat.go
diff options
context:
space:
mode:
Diffstat (limited to 'tailfs/shared/stat.go')
-rw-r--r--tailfs/shared/stat.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/tailfs/shared/stat.go b/tailfs/shared/stat.go
new file mode 100644
index 000000000..7425aa70a
--- /dev/null
+++ b/tailfs/shared/stat.go
@@ -0,0 +1,77 @@
+// Copyright (c) Tailscale Inc & AUTHORS
+// SPDX-License-Identifier: BSD-3-Clause
+
+package shared
+
+import (
+ "context"
+ "io/fs"
+ "os"
+ "time"
+
+ "github.com/tailscale/xnet/webdav"
+)
+
+const (
+ modeReadOnlyDir = 0555
+)
+
+// StaticFileInfo implements a static fs.FileInfo
+type StaticFileInfo struct {
+ // Named controls Name()
+ Named string
+ // Sized controls Size()
+ Sized int64
+ // Moded controls Mode()
+ Moded os.FileMode
+ // BirthedTime controls BirthTime()
+ BirthedTime time.Time
+ // BirthedTimeErr stores any error encountered when trying to get BirthTime()
+ BirthedTimeErr error
+ // ModdedTime controls ModTime()
+ ModdedTime time.Time
+ // Dir controls IsDir()
+ Dir bool
+}
+
+// BirthTime implements the method from webdav.BirthTimer
+func (fi *StaticFileInfo) BirthTime(_ context.Context) (time.Time, error) {
+ return fi.BirthedTime, fi.BirthedTimeErr
+}
+func (fi *StaticFileInfo) Name() string { return fi.Named }
+func (fi *StaticFileInfo) Size() int64 { return fi.Sized }
+func (fi *StaticFileInfo) Mode() os.FileMode { return fi.Moded }
+func (fi *StaticFileInfo) ModTime() time.Time { return fi.ModdedTime }
+func (fi *StaticFileInfo) IsDir() bool { return fi.Dir }
+func (fi *StaticFileInfo) Sys() any { return nil }
+
+func RenamedFileInfo(ctx context.Context, name string, fi fs.FileInfo) *StaticFileInfo {
+ var birthTime time.Time
+ var birthTimeErr error
+ birthTimer, ok := fi.(webdav.BirthTimer)
+ if ok {
+ birthTime, birthTimeErr = birthTimer.BirthTime(ctx)
+ }
+
+ return &StaticFileInfo{
+ Named: name,
+ Sized: fi.Size(),
+ Moded: fi.Mode(),
+ BirthedTime: birthTime,
+ BirthedTimeErr: birthTimeErr,
+ ModdedTime: fi.ModTime(),
+ Dir: fi.IsDir(),
+ }
+}
+
+// ReadOnlyDirInfo returns a static fs.FileInfo for a read-only directory
+func ReadOnlyDirInfo(name string, ts time.Time) *StaticFileInfo {
+ return &StaticFileInfo{
+ Named: name,
+ Sized: 0,
+ Moded: modeReadOnlyDir,
+ BirthedTime: ts,
+ ModdedTime: ts,
+ Dir: true,
+ }
+}