forked from bazil/bazil
/
fusefile.go
58 lines (49 loc) · 1.31 KB
/
fusefile.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package snap
import (
"io"
"syscall"
"bazil.org/bazil/fs/snap/wire"
"bazil.org/bazil/util/env"
"bazil.org/fuse"
fusefs "bazil.org/fuse/fs"
"golang.org/x/net/context"
)
type fuseFile struct {
de *wire.Dirent
rat io.ReaderAt
}
var _ = fusefs.Node(fuseFile{})
var _ = fusefs.NodeOpener(fuseFile{})
var _ = fusefs.Handle(fuseFile{})
var _ = fusefs.HandleReader(fuseFile{})
func (e fuseFile) Attr() fuse.Attr {
a := fuse.Attr{
Nlink: 1,
Mode: 0444,
Uid: env.MyUID,
Gid: env.MyGID,
Size: e.de.Type.File.Manifest.Size_,
// Mtime: e.Meta.Written.UTC(),
// Ctime: e.Meta.Written.UTC(),
// Crtime: e.Meta.Written.UTC(),
Blocks: stat_blocks(e.de.Type.File.Manifest.Size_), // TODO .Space?
}
return a
}
func (e fuseFile) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fusefs.Handle, error) {
if !req.Flags.IsReadOnly() {
return nil, fuse.Errno(syscall.EACCES)
}
return e, nil
}
func (e fuseFile) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
// TODO ReadAt is more strict about not giving partial reads
// than we care about, but i like the lack of cursor
resp.Data = resp.Data[0:cap(resp.Data)]
n, err := e.rat.ReadAt(resp.Data, req.Offset)
resp.Data = resp.Data[:n]
if err != nil && err != io.EOF {
return err
}
return nil
}