74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package shared
|
|
|
|
import (
|
|
"context"
|
|
"io/fs"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/tailscale/xnet/webdav"
|
|
)
|
|
|
|
// 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 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: Base(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: Base(name),
|
|
Sized: 0,
|
|
Moded: 0555,
|
|
BirthedTime: ts,
|
|
ModdedTime: ts,
|
|
Dir: true,
|
|
}
|
|
}
|