Export SquashFuse

This commit is contained in:
Caleb Gardner
2023-01-17 09:56:34 -06:00
parent ce2e45ceec
commit 75d2a29319
+16 -11
View File
@@ -24,7 +24,7 @@ func (r *Reader) Mount(mountpoint string) (err error) {
<-r.con.Ready <-r.con.Ready
r.mountDone = make(chan struct{}) r.mountDone = make(chan struct{})
go func() { go func() {
fs.Serve(r.con, &squashFuse{r: r}) fs.Serve(r.con, &SquashFuse{r: r})
close(r.mountDone) close(r.mountDone)
}() }()
return return
@@ -46,19 +46,24 @@ func (r *Reader) Unmount() error {
return errors.New("squashfs archive is not mounted") return errors.New("squashfs archive is not mounted")
} }
type squashFuse struct { func (r *Reader) SquashFuse() SquashFuse {
return SquashFuse{r: r}
}
// A wrapper around squash.Reader that implements fuse/fs.FS
type SquashFuse struct {
r *Reader r *Reader
} }
func (s *squashFuse) Root() (fs.Node, error) { func (s SquashFuse) Root() (fs.Node, error) {
return &fileNode{File: s.r.FS.File}, nil return fileNode{File: s.r.FS.File}, nil
} }
type fileNode struct { type fileNode struct {
*File *File
} }
func (f *fileNode) Attr(ctx context.Context, attr *fuse.Attr) error { func (f fileNode) Attr(ctx context.Context, attr *fuse.Attr) error {
attr.Blocks = f.r.s.Size / 512 attr.Blocks = f.r.s.Size / 512
if f.r.s.Size%512 > 0 { if f.r.s.Size%512 > 0 {
attr.Blocks++ attr.Blocks++
@@ -72,15 +77,15 @@ func (f *fileNode) Attr(ctx context.Context, attr *fuse.Attr) error {
return nil return nil
} }
func (f *fileNode) Id() uint64 { func (f fileNode) Id() uint64 {
return uint64(f.i.Num) return uint64(f.i.Num)
} }
func (f *fileNode) Readlink(ctx context.Context, req *fuse.ReadlinkRequest) (string, error) { func (f fileNode) Readlink(ctx context.Context, req *fuse.ReadlinkRequest) (string, error) {
return f.SymlinkPath(), nil return f.SymlinkPath(), nil
} }
func (f *fileNode) Lookup(ctx context.Context, name string) (fs.Node, error) { func (f fileNode) Lookup(ctx context.Context, name string) (fs.Node, error) {
asFS, err := f.FS() asFS, err := f.FS()
if err != nil { if err != nil {
return nil, fuse.ENOTDIR return nil, fuse.ENOTDIR
@@ -92,7 +97,7 @@ func (f *fileNode) Lookup(ctx context.Context, name string) (fs.Node, error) {
return &fileNode{File: ret}, nil return &fileNode{File: ret}, nil
} }
func (f *fileNode) ReadAll(ctx context.Context) ([]byte, error) { func (f fileNode) ReadAll(ctx context.Context) ([]byte, error) {
if f.IsRegular() { if f.IsRegular() {
var buf bytes.Buffer var buf bytes.Buffer
_, err := f.WriteTo(&buf) _, err := f.WriteTo(&buf)
@@ -101,7 +106,7 @@ func (f *fileNode) ReadAll(ctx context.Context) ([]byte, error) {
return nil, fuse.ENODATA return nil, fuse.ENODATA
} }
func (f *fileNode) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error { func (f fileNode) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error {
if f.IsRegular() { if f.IsRegular() {
buf := make([]byte, req.Size) buf := make([]byte, req.Size)
n, err := f.File.ReadAt(buf, req.Offset) n, err := f.File.ReadAt(buf, req.Offset)
@@ -113,7 +118,7 @@ func (f *fileNode) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.R
return fuse.ENODATA return fuse.ENODATA
} }
func (f *fileNode) ReadDirAll(ctx context.Context) (out []fuse.Dirent, err error) { func (f fileNode) ReadDirAll(ctx context.Context) (out []fuse.Dirent, err error) {
asFS, err := f.FS() asFS, err := f.FS()
if err != nil { if err != nil {
return nil, fuse.ENOTDIR return nil, fuse.ENOTDIR