diff --git a/dir.go b/dir.go index 99f6eaf..4dac2bb 100644 --- a/dir.go +++ b/dir.go @@ -47,7 +47,7 @@ func newVersionedDir(node *versionedNode, inode uint64) *versionedDir { func (this versionedDir) Attr(attr *fuse.Attr) { log.Printf("versionedDir::Attr: %s", this.node) - attr.Mode = this.node.info.Mode() + this.node.attr(attr) attr.Inode = this.inode } diff --git a/file.go b/file.go index e19a44d..86311c8 100644 --- a/file.go +++ b/file.go @@ -41,9 +41,8 @@ func newVersionedFile(node *versionedNode, inode uint64) *versionedFile { func (this versionedFile) Attr(attr *fuse.Attr) { log.Printf("versionedFile::Attr: %s", this.node) - attr.Mode = this.node.info.Mode() + this.node.attr(attr) attr.Inode = this.inode - attr.Size = uint64(this.node.info.Size()) } func (this versionedFile) ReadAll(ctx context.Context) ([]byte, error) { diff --git a/node.go b/node.go index b015217..f7af5ca 100644 --- a/node.go +++ b/node.go @@ -23,8 +23,11 @@ package main import ( + "bazil.org/fuse" "fmt" "os" + "syscall" + "time" ) type versionedNode struct { @@ -39,6 +42,21 @@ func (this *versionedNode) rebasedPath() string { return this.ver.rebasePath(this.path) } +func (this *versionedNode) attr(attr *fuse.Attr) { + stat := this.info.Sys().(*syscall.Stat_t) + + attr.Size = uint64(this.info.Size()) + attr.Blocks = uint64(stat.Blocks) + attr.Atime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec)) + attr.Mtime = this.info.ModTime() + attr.Ctime = time.Unix(int64(stat.Ctim.Sec), int64(stat.Ctim.Nsec)) + attr.Mode = this.info.Mode() + attr.Nlink = uint32(stat.Nlink) + attr.Uid = stat.Uid + attr.Gid = stat.Gid + attr.Rdev = uint32(stat.Rdev) +} + func (this *versionedNode) String() string { return fmt.Sprintf("%s (%s)", this.path, this.rebasedPath()) }