summaryrefslogtreecommitdiff
path: root/internal/fusefrontend_reverse/virtualfile.go
diff options
context:
space:
mode:
authorJakob Unterwurzacher2020-08-09 22:11:46 +0200
committerJakob Unterwurzacher2020-08-09 22:11:46 +0200
commit6d4f1a6888cafd218cb97bd11de6a7553d9bc8f1 (patch)
tree7b48b6e97c4c73a4e0e9dce3456768526c46da65 /internal/fusefrontend_reverse/virtualfile.go
parent527609266386890fe1657c225c643ca448bcd71d (diff)
v2api/reverse: implement Read
Diffstat (limited to 'internal/fusefrontend_reverse/virtualfile.go')
-rw-r--r--internal/fusefrontend_reverse/virtualfile.go115
1 files changed, 0 insertions, 115 deletions
diff --git a/internal/fusefrontend_reverse/virtualfile.go b/internal/fusefrontend_reverse/virtualfile.go
deleted file mode 100644
index a7f6913..0000000
--- a/internal/fusefrontend_reverse/virtualfile.go
+++ /dev/null
@@ -1,115 +0,0 @@
-package fusefrontend_reverse
-
-import (
- "context"
- "log"
- "syscall"
-
- "github.com/hanwen/go-fuse/v2/fs"
- "github.com/hanwen/go-fuse/v2/fuse"
-
- "github.com/rfjakob/gocryptfs/internal/configfile"
- "github.com/rfjakob/gocryptfs/internal/inomap"
- "github.com/rfjakob/gocryptfs/internal/nametransform"
-)
-
-const (
- // virtualFileMode is the mode to use for virtual files (gocryptfs.diriv and
- // *.name). They are always readable, as stated in func Access
- virtualFileMode = syscall.S_IFREG | 0444
- // We use inomap's `Tag` feature to generate unique inode numbers for
- // virtual files. These are the tags we use.
- inoTagDirIV = 1
- inoTagNameFile = 2
-)
-
-type fileType int
-
-// Values returned by lookupFileType
-const (
- // A real file/directory/symlink in the backing plaintext directory
- typeReal fileType = iota
- // A DirIV (gocryptfs.diriv) file
- typeDiriv
- // A gocryptfs.longname.*.name file for a file with a long name
- typeName
- // The config file gocryptfs.conf
- typeConfig
-)
-
-// lookupFileType returns the type of child file name
-// (one of the fileType constants above). Called from Lookup().
-func (n *Node) lookupFileType(cName string) fileType {
- rn := n.rootNode()
- // In -plaintextname mode, neither diriv nor longname files exist.
- if !rn.args.PlaintextNames {
- // Is it a gocryptfs.diriv file?
- if cName == nametransform.DirIVFilename {
- return typeDiriv
- }
- // Is it a gocryptfs.longname.*.name file?
- if t := nametransform.NameType(cName); t == nametransform.LongNameFilename {
- return typeName
- }
- }
- // gocryptfs.conf in the root directory. This is passed through to
- // .gocryptfs.reverse.conf in the backing plaintext directory.
- if n.isRoot() && !rn.args.ConfigCustom && cName == configfile.ConfDefaultName {
- return typeConfig
- }
- return typeReal
-}
-
-type virtualFile struct {
- fs.Inode
-
- // file content
- content []byte
- // attributes for Getattr()
- attr fuse.Attr
-}
-
-// newVirtualFile creates a new in-memory file that does not have a representation
-// on disk. "content" is the file content. Timestamps and file owner are copied
-// from "parentFile" (file descriptor).
-// For a "gocryptfs.diriv" file, you would use the parent directory as
-// "parentFile".
-func (n *Node) newVirtualFile(content []byte, parentStat *syscall.Stat_t, inoTag uint8) (vf *virtualFile, errno syscall.Errno) {
- if inoTag == 0 {
- log.Panicf("BUG: inoTag for virtual file is zero - this will cause ino collisions!")
- }
-
- // Adjust inode number and size
- rn := n.rootNode()
- st := parentStat
- q := inomap.NewQIno(uint64(st.Dev), inoTag, uint64(st.Ino))
- st.Ino = rn.inoMap.Translate(q)
- st.Size = int64(len(content))
- st.Mode = virtualFileMode
- st.Nlink = 1
- var a fuse.Attr
- a.FromStat(st)
-
- vf = &virtualFile{content: content, attr: a}
- return
-}
-
-// Open - FUSE call
-func (f *virtualFile) Open(ctx context.Context, flags uint32) (fh fs.FileHandle, fuseFlags uint32, errno syscall.Errno) {
- return nil, fuse.FOPEN_KEEP_CACHE, 0
-}
-
-// GetAttr - FUSE call
-func (f *virtualFile) Getattr(ctx context.Context, fh fs.FileHandle, out *fuse.AttrOut) syscall.Errno {
- out.Attr = f.attr
- return 0
-}
-
-// Read - FUSE call
-func (f *virtualFile) Read(ctx context.Context, fh fs.FileHandle, dest []byte, off int64) (fuse.ReadResult, syscall.Errno) {
- end := int(off) + len(dest)
- if end > len(f.content) {
- end = len(f.content)
- }
- return fuse.ReadResultData(f.content[off:end]), 0
-}