Rename squashfslow.Base to squashfslow.FileBase

This commit is contained in:
Caleb Gardner
2023-12-27 23:50:27 -06:00
parent bfba5d5b60
commit 144805e747
5 changed files with 63 additions and 28 deletions
+3 -3
View File
@@ -19,7 +19,7 @@ import (
// File represents a file inside a squashfs archive. // File represents a file inside a squashfs archive.
type File struct { type File struct {
b *squashfslow.Base b *squashfslow.FileBase
full *data.FullReader full *data.FullReader
rdr *data.Reader rdr *data.Reader
parent *FS parent *FS
@@ -28,7 +28,7 @@ type File struct {
} }
// Creates a new *File from the given *squashfs.Base // Creates a new *File from the given *squashfs.Base
func (r *Reader) FileFromBase(b *squashfslow.Base, parent *FS) *File { func (r *Reader) FileFromBase(b *squashfslow.FileBase, parent *FS) *File {
return &File{ return &File{
b: b, b: b,
parent: parent, parent: parent,
@@ -234,7 +234,7 @@ func (f *File) ExtractWithOptions(path string, op *ExtractionOptions) error {
} }
return errors.Join(errors.New("failed to get base from entry: "+path), err) return errors.Join(errors.New("failed to get base from entry: "+path), err)
} }
go func(b *squashfslow.Base, path string) { go func(b *squashfslow.FileBase, path string) {
i := op.manager.Lock() i := op.manager.Lock()
if b.IsDir() { if b.IsDir() {
extDir := filepath.Join(path, b.Name) extDir := filepath.Join(path, b.Name)
+1 -1
View File
@@ -255,7 +255,7 @@ func (f *FS) ExtractWithOptions(folder string, op *ExtractionOptions) error {
// Returns the FS as a *File // Returns the FS as a *File
func (f *FS) File() *File { func (f *FS) File() *File {
return &File{ return &File{
b: &f.d.Base, b: &f.d.FileBase,
parent: f.parent, parent: f.parent,
r: f.r, r: f.r,
} }
+5 -5
View File
@@ -14,7 +14,7 @@ import (
) )
type Directory struct { type Directory struct {
Base FileBase
Entries []directory.Entry Entries []directory.Entry
} }
@@ -49,15 +49,15 @@ func (r *Reader) directoryFromRef(ref uint64, name string) (*Directory, error) {
return nil, err return nil, err
} }
return &Directory{ return &Directory{
Base: *r.BaseFromInode(i, name), FileBase: *r.BaseFromInode(i, name),
Entries: entries, Entries: entries,
}, nil }, nil
} }
func (d *Directory) Open(r *Reader, path string) (*Base, error) { func (d *Directory) Open(r *Reader, path string) (*FileBase, error) {
path = filepath.Clean(path) path = filepath.Clean(path)
if path == "." || path == "" { if path == "." || path == "" {
return &d.Base, nil return &d.FileBase, nil
} }
split := strings.Split(path, "/") split := strings.Split(path, "/")
i, found := slices.BinarySearchFunc(d.Entries, split[0], func(e directory.Entry, name string) int { i, found := slices.BinarySearchFunc(d.Entries, split[0], func(e directory.Entry, name string) int {
+51 -16
View File
@@ -11,44 +11,44 @@ import (
"github.com/CalebQ42/squashfs/low/inode" "github.com/CalebQ42/squashfs/low/inode"
) )
type Base struct { type FileBase struct {
Inode *inode.Inode Inode *inode.Inode
Name string Name string
} }
func (r *Reader) BaseFromInode(i *inode.Inode, name string) *Base { func (r *Reader) BaseFromInode(i *inode.Inode, name string) *FileBase {
return &Base{Inode: i, Name: name} return &FileBase{Inode: i, Name: name}
} }
func (r *Reader) BaseFromEntry(e directory.Entry) (*Base, error) { func (r *Reader) BaseFromEntry(e directory.Entry) (*FileBase, error) {
in, err := r.InodeFromEntry(e) in, err := r.InodeFromEntry(e)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &Base{Inode: in, Name: e.Name}, nil return &FileBase{Inode: in, Name: e.Name}, nil
} }
func (r *Reader) BaseFromRef(ref uint64, name string) (*Base, error) { func (r *Reader) BaseFromRef(ref uint64, name string) (*FileBase, error) {
in, err := r.InodeFromRef(ref) in, err := r.InodeFromRef(ref)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &Base{Inode: in, Name: name}, nil return &FileBase{Inode: in, Name: name}, nil
} }
func (b *Base) Uid(r *Reader) (uint32, error) { func (b *FileBase) Uid(r *Reader) (uint32, error) {
return r.Id(b.Inode.UidInd) return r.Id(b.Inode.UidInd)
} }
func (b *Base) Gid(r *Reader) (uint32, error) { func (b *FileBase) Gid(r *Reader) (uint32, error) {
return r.Id(b.Inode.GidInd) return r.Id(b.Inode.GidInd)
} }
func (b *Base) IsDir() bool { func (b *FileBase) IsDir() bool {
return b.Inode.Type == inode.Dir || b.Inode.Type == inode.EDir return b.Inode.Type == inode.Dir || b.Inode.Type == inode.EDir
} }
func (b *Base) ToDir(r *Reader) (*Directory, error) { func (b *FileBase) ToDir(r *Reader) (*Directory, error) {
var blockStart uint32 var blockStart uint32
var size uint32 var size uint32
var offset uint16 var offset uint16
@@ -75,16 +75,16 @@ func (b *Base) ToDir(r *Reader) (*Directory, error) {
return nil, err return nil, err
} }
return &Directory{ return &Directory{
Base: *b, FileBase: *b,
Entries: entries, Entries: entries,
}, nil }, nil
} }
func (b *Base) IsRegular() bool { func (b *FileBase) IsRegular() bool {
return b.Inode.Type == inode.Fil || b.Inode.Type == inode.EFil return b.Inode.Type == inode.Fil || b.Inode.Type == inode.EFil
} }
func (b *Base) GetRegFileReaders(r *Reader) (*data.Reader, *data.FullReader, error) { func (b *FileBase) GetRegFileReaders(r *Reader) (*data.Reader, *data.FullReader, error) {
if !b.IsRegular() { if !b.IsRegular() {
return nil, nil, errors.New("not a regular file") return nil, nil, errors.New("not a regular file")
} }
@@ -130,7 +130,7 @@ func (b *Base) GetRegFileReaders(r *Reader) (*data.Reader, *data.FullReader, err
return outRdr, outFull, nil return outRdr, outFull, nil
} }
func (b *Base) GetFullReader(r *Reader) (*data.FullReader, error) { func (b *FileBase) GetFullReader(r *Reader) (*data.FullReader, error) {
if !b.IsRegular() { if !b.IsRegular() {
return nil, errors.New("not a regular file") return nil, errors.New("not a regular file")
} }
@@ -166,3 +166,38 @@ func (b *Base) GetFullReader(r *Reader) (*data.FullReader, error) {
} }
return outFull, nil return outFull, nil
} }
func (b *FileBase) GetReader(r *Reader) (*data.Reader, error) {
if !b.IsRegular() {
return nil, errors.New("not a regular file")
}
var blockStart uint64
var fragIndex uint32
var fragOffset uint32
var fragSize uint64
var sizes []uint32
if b.Inode.Type == inode.Fil {
blockStart = uint64(b.Inode.Data.(inode.File).BlockStart)
fragIndex = b.Inode.Data.(inode.File).FragInd
fragOffset = b.Inode.Data.(inode.File).FragOffset
sizes = b.Inode.Data.(inode.File).BlockSizes
fragSize = uint64(b.Inode.Data.(inode.File).Size % r.Superblock.BlockSize)
} else {
blockStart = b.Inode.Data.(inode.EFile).BlockStart
fragIndex = b.Inode.Data.(inode.EFile).FragInd
fragOffset = b.Inode.Data.(inode.EFile).FragOffset
sizes = b.Inode.Data.(inode.EFile).BlockSizes
fragSize = b.Inode.Data.(inode.EFile).Size % uint64(r.Superblock.BlockSize)
}
outRdr := data.NewReader(toreader.NewReader(r.r, int64(blockStart)), r.d, sizes, fragSize, r.Superblock.BlockSize)
if fragIndex != 0xffffffff {
ent, err := r.fragEntry(fragIndex)
if err != nil {
return nil, err
}
frag := data.NewReader(toreader.NewReader(r.r, int64(ent.Start)), r.d, []uint32{ent.Size}, uint64(r.Superblock.BlockSize), r.Superblock.BlockSize)
frag.Read(make([]byte, fragOffset))
outRdr.AddFrag(io.LimitReader(frag, int64(fragSize)))
}
return outRdr, nil
}
+3 -3
View File
@@ -64,7 +64,7 @@ func TestReader(t *testing.T) {
path := filepath.Join(tmpDir, "extractTest") path := filepath.Join(tmpDir, "extractTest")
os.RemoveAll(path) os.RemoveAll(path)
os.MkdirAll(path, 0777) os.MkdirAll(path, 0777)
err = extractToDir(rdr, &rdr.Root.Base, path) err = extractToDir(rdr, &rdr.Root.FileBase, path)
t.Fatal(err) t.Fatal(err)
} }
@@ -92,7 +92,7 @@ func TestSingleFile(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
func extractToDir(rdr *squashfslow.Reader, b *squashfslow.Base, folder string) error { func extractToDir(rdr *squashfslow.Reader, b *squashfslow.FileBase, folder string) error {
path := filepath.Join(folder, b.Name) path := filepath.Join(folder, b.Name)
if b.IsDir() { if b.IsDir() {
d, err := b.ToDir(rdr) d, err := b.ToDir(rdr)
@@ -103,7 +103,7 @@ func extractToDir(rdr *squashfslow.Reader, b *squashfslow.Base, folder string) e
if err != nil { if err != nil {
return err return err
} }
var nestBast *squashfslow.Base var nestBast *squashfslow.FileBase
for _, e := range d.Entries { for _, e := range d.Entries {
nestBast, err = rdr.BaseFromEntry(e) nestBast, err = rdr.BaseFromEntry(e)
if err != nil { if err != nil {