diff options
Diffstat (limited to 'tailfs/shared/stat.go')
| -rw-r--r-- | tailfs/shared/stat.go | 77 |
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, + } +} |
