Mounts and show an empty dir
This commit is contained in:
parent
4b98f74e3e
commit
6a110b8dde
@ -7,14 +7,20 @@ import (
|
||||
|
||||
type FS struct {
|
||||
*cryptfs.FS
|
||||
backing string
|
||||
}
|
||||
|
||||
func New(key [16]byte) *FS {
|
||||
func New(key [16]byte, b string) *FS {
|
||||
return &FS {
|
||||
FS: cryptfs.NewFS(key),
|
||||
backing: b,
|
||||
}
|
||||
}
|
||||
|
||||
func (fs *FS) Root() (fs.Node, error) {
|
||||
return nil, nil
|
||||
n := Node{
|
||||
backing: "",
|
||||
parentFS: fs,
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
|
79
frontend/node.go
Normal file
79
frontend/node.go
Normal file
@ -0,0 +1,79 @@
|
||||
package frontend
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"time"
|
||||
"syscall"
|
||||
"io/ioutil"
|
||||
"path"
|
||||
|
||||
"golang.org/x/net/context"
|
||||
|
||||
//"github.com/rfjakob/gocryptfs/cryptfs"
|
||||
"bazil.org/fuse"
|
||||
"bazil.org/fuse/fs"
|
||||
)
|
||||
|
||||
|
||||
type Node struct {
|
||||
fs.NodeRef
|
||||
backing string
|
||||
parentFS *FS
|
||||
}
|
||||
|
||||
func StatToAttr(s *syscall.Stat_t, a *fuse.Attr) {
|
||||
a.Inode = s.Ino
|
||||
a.Size = uint64(s.Size)
|
||||
a.Blocks = uint64(s.Blocks)
|
||||
a.Atime = time.Unix(s.Atim.Sec, s.Atim.Nsec)
|
||||
a.Mtime = time.Unix(s.Mtim.Sec, s.Mtim.Nsec)
|
||||
a.Ctime = time.Unix(s.Ctim.Sec, s.Ctim.Nsec)
|
||||
a.Mode = os.FileMode(s.Mode) | os.ModeDir
|
||||
a.Nlink = uint32(s.Nlink)
|
||||
a.Uid = uint32(s.Uid)
|
||||
a.Gid = uint32(s.Gid)
|
||||
a.Rdev = uint32(s.Rdev)
|
||||
}
|
||||
|
||||
func (n Node) Attr(ctx context.Context, attr *fuse.Attr) error {
|
||||
var err error
|
||||
var st syscall.Stat_t
|
||||
if n.backing == "" {
|
||||
// When GetAttr is called for the toplevel directory, we always want
|
||||
// to look through symlinks.
|
||||
fmt.Printf("Attr %s\n", n.parentFS.backing)
|
||||
//err = syscall.Stat(n.parentFS.backing, &st)
|
||||
err = syscall.Stat("/", &st)
|
||||
} else {
|
||||
fmt.Printf("Attr %s\n", path.Join(n.parentFS.backing, n.backing))
|
||||
p := path.Join(n.parentFS.backing, n.backing)
|
||||
err = syscall.Lstat(p, &st)
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
StatToAttr(&st, attr)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *Node) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
|
||||
entries, err := ioutil.ReadDir(n.backing)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var fuseEntries []fuse.Dirent
|
||||
for _, e := range entries {
|
||||
var d fuse.Dirent
|
||||
d.Name = e.Name()
|
||||
fuseEntries = append(fuseEntries, d)
|
||||
}
|
||||
return fuseEntries, err
|
||||
}
|
||||
|
||||
func (n *Node) Lookup(ctx context.Context, name string) (fs.Node, error) {
|
||||
if name == "hello" {
|
||||
return Node{}, nil
|
||||
}
|
||||
return nil, fuse.ENOENT
|
||||
}
|
17
main.go
17
main.go
@ -18,11 +18,11 @@ import (
|
||||
)
|
||||
|
||||
// debug flag enables logging of debug messages to stderr.
|
||||
var debug = flag.Bool("debug", false, "enable debug log messages to stderr")
|
||||
var debug = flag.Bool("debug", true, "enable debug log messages to stderr")
|
||||
|
||||
func usage() {
|
||||
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
|
||||
fmt.Fprintf(os.Stderr, " %s MOUNTPOINT\n", os.Args[0])
|
||||
fmt.Fprintf(os.Stderr, " %s BACKING MOUNTPOINT\n", os.Args[0])
|
||||
flag.PrintDefaults()
|
||||
}
|
||||
|
||||
@ -34,18 +34,19 @@ func main() {
|
||||
flag.Usage = usage
|
||||
flag.Parse()
|
||||
|
||||
if flag.NArg() != 1 {
|
||||
if flag.NArg() != 2 {
|
||||
usage()
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
mountpoint := flag.Arg(0)
|
||||
backing := flag.Arg(0)
|
||||
mountpoint := flag.Arg(1)
|
||||
c, err := fuse.Mount(
|
||||
mountpoint,
|
||||
fuse.FSName("memfs"),
|
||||
fuse.Subtype("memfs"),
|
||||
fuse.FSName("gocryptfs"),
|
||||
fuse.Subtype("gocryptfs"),
|
||||
fuse.LocalVolume(),
|
||||
fuse.VolumeName("Memory FS"),
|
||||
fuse.VolumeName("gocryptfs"),
|
||||
)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
@ -59,7 +60,7 @@ func main() {
|
||||
|
||||
srv := fs.New(c, cfg)
|
||||
var key [16]byte
|
||||
filesys := frontend.New(key)
|
||||
filesys := frontend.New(key, backing)
|
||||
|
||||
if err := srv.Serve(filesys); err != nil {
|
||||
log.Fatal(err)
|
||||
|
Loading…
Reference in New Issue
Block a user