Export SquashFuse
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user