diff --git a/README.md b/README.md index 92dd55a..da5e660 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A PURE Go library to read squashfs. There is currently no plans to add archive creation support as it will almost always be better to just call `mksquashfs`. I could see some possible use cases, but probably won't spend time on it unless it's requested (open a discussion if you want this feature). -The library has two parts with this `github.com/CalebQ42/squashfs` being easy to use as it implements `io/fs` interfaces and doesn't expose unnecessary information. 95% this is the library you want. If you need lower level access to the information, use `github.com/CalebQ42/squashfs/squashfs` where far more information is exposed. +The library has two parts with this `github.com/CalebQ42/squashfs` being easy to use as it implements `io/fs` interfaces and doesn't expose unnecessary information. 95% this is the library you want. If you need lower level access to the information, use `github.com/CalebQ42/squashfs/low` where far more information is exposed. Currently has support for reading squashfs files and extracting files and folders. diff --git a/file.go b/file.go index 1b7cbd1..142c7f8 100644 --- a/file.go +++ b/file.go @@ -12,14 +12,14 @@ import ( "strconv" "github.com/CalebQ42/squashfs/internal/routinemanager" - "github.com/CalebQ42/squashfs/squashfs" - "github.com/CalebQ42/squashfs/squashfs/data" - "github.com/CalebQ42/squashfs/squashfs/inode" + squashfslow "github.com/CalebQ42/squashfs/low" + "github.com/CalebQ42/squashfs/low/data" + "github.com/CalebQ42/squashfs/low/inode" ) // File represents a file inside a squashfs archive. type File struct { - b *squashfs.Base + b *squashfslow.Base full *data.FullReader rdr *data.Reader parent *FS @@ -28,7 +28,7 @@ type File struct { } // Creates a new *File from the given *squashfs.Base -func (r *Reader) FileFromBase(b *squashfs.Base, parent *FS) *File { +func (r *Reader) FileFromBase(b *squashfslow.Base, parent *FS) *File { return &File{ b: b, parent: parent, @@ -40,7 +40,7 @@ func (f *File) FS() (*FS, error) { if !f.IsDir() { return nil, errors.New("not a directory") } - d, err := f.b.ToDir(f.r.r) + d, err := f.b.ToDir(f.r.Low) if err != nil { return nil, err } @@ -114,7 +114,7 @@ func (f *File) ReadDir(n int) ([]fs.DirEntry, error) { if !f.IsDir() { return nil, errors.New("file is not a directory") } - d, err := f.b.ToDir(f.r.r) + d, err := f.b.ToDir(f.r.Low) if err != nil { return nil, err } @@ -173,7 +173,7 @@ func (f *File) WriteTo(w io.Writer) (int64, error) { func (f *File) initializeReaders() error { var err error - f.rdr, f.full, err = f.b.GetRegFileReaders(f.r.r) + f.rdr, f.full, err = f.b.GetRegFileReaders(f.r.Low) return err } @@ -218,7 +218,7 @@ func (f *File) ExtractWithOptions(path string, op *ExtractionOptions) error { } switch f.b.Inode.Type { case inode.Dir, inode.EDir: - d, err := f.b.ToDir(f.r.r) + d, err := f.b.ToDir(f.r.Low) if err != nil { if op.Verbose { log.Println("Failed to create squashfs.Directory for", path) @@ -227,14 +227,14 @@ func (f *File) ExtractWithOptions(path string, op *ExtractionOptions) error { } errChan := make(chan error, len(d.Entries)) for i := range d.Entries { - b, err := f.r.r.BaseFromEntry(d.Entries[i]) + b, err := f.r.Low.BaseFromEntry(d.Entries[i]) if err != nil { if op.Verbose { log.Println("Failed to get squashfs.Base from entry for", path) } return errors.Join(errors.New("failed to get base from entry: "+path), err) } - go func(b *squashfs.Base, path string) { + go func(b *squashfslow.Base, path string) { i := op.manager.Lock() if b.IsDir() { extDir := filepath.Join(path, b.Name) @@ -285,7 +285,7 @@ func (f *File) ExtractWithOptions(path string, op *ExtractionOptions) error { return errors.Join(errors.New("failed to create file: "+path), err) } defer outFil.Close() - full, err := f.b.GetFullReader(f.r.r) + full, err := f.b.GetFullReader(f.r.Low) if err != nil { if op.Verbose { log.Println("Failed to create full reader for", path) @@ -406,7 +406,7 @@ func (f *File) ExtractWithOptions(path string, op *ExtractionOptions) error { if op.IgnorePerm { return nil } - uid, err := f.b.Uid(f.r.r) + uid, err := f.b.Uid(f.r.Low) if err != nil { if op.Verbose { log.Println("Failed to get uid for", path) @@ -414,7 +414,7 @@ func (f *File) ExtractWithOptions(path string, op *ExtractionOptions) error { } return nil } - gid, err := f.b.Gid(f.r.r) + gid, err := f.b.Gid(f.r.Low) if err != nil { if op.Verbose { log.Println("Failed to get gid for", path) diff --git a/file_info.go b/file_info.go index b4552a7..d7390a6 100644 --- a/file_info.go +++ b/file_info.go @@ -4,8 +4,8 @@ import ( "io/fs" "time" - "github.com/CalebQ42/squashfs/squashfs/directory" - "github.com/CalebQ42/squashfs/squashfs/inode" + "github.com/CalebQ42/squashfs/low/directory" + "github.com/CalebQ42/squashfs/low/inode" ) type fileInfo struct { @@ -17,7 +17,7 @@ type fileInfo struct { } func (r Reader) newFileInfo(e directory.Entry) (fileInfo, error) { - i, err := r.r.InodeFromEntry(e) + i, err := r.Low.InodeFromEntry(e) if err != nil { return fileInfo{}, err } diff --git a/fs.go b/fs.go index e81acb0..4986790 100644 --- a/fs.go +++ b/fs.go @@ -8,20 +8,20 @@ import ( "slices" "strings" - "github.com/CalebQ42/squashfs/squashfs" - "github.com/CalebQ42/squashfs/squashfs/directory" + squashfslow "github.com/CalebQ42/squashfs/low" + "github.com/CalebQ42/squashfs/low/directory" ) // FS is a fs.FS representation of a squashfs directory. // Implements fs.GlobFS, fs.ReadDirFS, fs.ReadFileFS, fs.StatFS, and fs.SubFS type FS struct { - d *squashfs.Directory + d *squashfslow.Directory r *Reader parent *FS } // Creates a new *FS from the given squashfs.directory -func (r *Reader) FSFromDirectory(d *squashfs.Directory, parent *FS) *FS { +func (r *Reader) FSFromDirectory(d *squashfslow.Directory, parent *FS) *FS { return &FS{ d: d, r: r, @@ -124,7 +124,7 @@ func (f *FS) Open(name string) (fs.File, error) { Err: fs.ErrNotExist, } } - b, err := f.r.r.BaseFromEntry(f.d.Entries[i]) + b, err := f.r.Low.BaseFromEntry(f.d.Entries[i]) if err != nil { return nil, err } @@ -142,7 +142,7 @@ func (f *FS) Open(name string) (fs.File, error) { Err: fs.ErrNotExist, } } - d, err := b.ToDir(f.r.r) + d, err := b.ToDir(f.r.Low) if err != nil { return nil, err } diff --git a/squashfs/README.md b/low/README.md similarity index 100% rename from squashfs/README.md rename to low/README.md diff --git a/squashfs/base.go b/low/base.go similarity index 96% rename from squashfs/base.go rename to low/base.go index 53c8207..caf43fb 100644 --- a/squashfs/base.go +++ b/low/base.go @@ -1,4 +1,4 @@ -package squashfs +package squashfslow import ( "errors" @@ -6,9 +6,9 @@ import ( "github.com/CalebQ42/squashfs/internal/metadata" "github.com/CalebQ42/squashfs/internal/toreader" - "github.com/CalebQ42/squashfs/squashfs/data" - "github.com/CalebQ42/squashfs/squashfs/directory" - "github.com/CalebQ42/squashfs/squashfs/inode" + "github.com/CalebQ42/squashfs/low/data" + "github.com/CalebQ42/squashfs/low/directory" + "github.com/CalebQ42/squashfs/low/inode" ) type Base struct { diff --git a/squashfs/data/fullreader.go b/low/data/fullreader.go similarity index 100% rename from squashfs/data/fullreader.go rename to low/data/fullreader.go diff --git a/squashfs/data/reader.go b/low/data/reader.go similarity index 100% rename from squashfs/data/reader.go rename to low/data/reader.go diff --git a/squashfs/directory.go b/low/directory.go similarity index 94% rename from squashfs/directory.go rename to low/directory.go index 1681e89..6bdc248 100644 --- a/squashfs/directory.go +++ b/low/directory.go @@ -1,4 +1,4 @@ -package squashfs +package squashfslow import ( "errors" @@ -9,8 +9,8 @@ import ( "github.com/CalebQ42/squashfs/internal/metadata" "github.com/CalebQ42/squashfs/internal/toreader" - "github.com/CalebQ42/squashfs/squashfs/directory" - "github.com/CalebQ42/squashfs/squashfs/inode" + "github.com/CalebQ42/squashfs/low/directory" + "github.com/CalebQ42/squashfs/low/inode" ) type Directory struct { diff --git a/squashfs/directory/directory.go b/low/directory/directory.go similarity index 100% rename from squashfs/directory/directory.go rename to low/directory/directory.go diff --git a/squashfs/fragment.go b/low/fragment.go similarity index 77% rename from squashfs/fragment.go rename to low/fragment.go index ad103d9..7230ef1 100644 --- a/squashfs/fragment.go +++ b/low/fragment.go @@ -1,4 +1,4 @@ -package squashfs +package squashfslow type fragEntry struct { Start uint64 diff --git a/squashfs/inode.go b/low/inode.go similarity index 86% rename from squashfs/inode.go rename to low/inode.go index d1cb5a2..a10a2d1 100644 --- a/squashfs/inode.go +++ b/low/inode.go @@ -1,10 +1,10 @@ -package squashfs +package squashfslow import ( "github.com/CalebQ42/squashfs/internal/metadata" "github.com/CalebQ42/squashfs/internal/toreader" - "github.com/CalebQ42/squashfs/squashfs/directory" - "github.com/CalebQ42/squashfs/squashfs/inode" + "github.com/CalebQ42/squashfs/low/directory" + "github.com/CalebQ42/squashfs/low/inode" ) func (r *Reader) InodeFromRef(ref uint64) (*inode.Inode, error) { diff --git a/squashfs/inode/dir.go b/low/inode/dir.go similarity index 100% rename from squashfs/inode/dir.go rename to low/inode/dir.go diff --git a/squashfs/inode/file.go b/low/inode/file.go similarity index 100% rename from squashfs/inode/file.go rename to low/inode/file.go diff --git a/squashfs/inode/inode.go b/low/inode/inode.go similarity index 100% rename from squashfs/inode/inode.go rename to low/inode/inode.go diff --git a/squashfs/inode/misc.go b/low/inode/misc.go similarity index 100% rename from squashfs/inode/misc.go rename to low/inode/misc.go diff --git a/squashfs/inode/sym.go b/low/inode/sym.go similarity index 100% rename from squashfs/inode/sym.go rename to low/inode/sym.go diff --git a/squashfs/reader.go b/low/reader.go similarity index 98% rename from squashfs/reader.go rename to low/reader.go index 302cbc9..d6d6bef 100644 --- a/squashfs/reader.go +++ b/low/reader.go @@ -1,4 +1,4 @@ -package squashfs +package squashfslow import ( "encoding/binary" @@ -9,7 +9,7 @@ import ( "github.com/CalebQ42/squashfs/internal/decompress" "github.com/CalebQ42/squashfs/internal/metadata" "github.com/CalebQ42/squashfs/internal/toreader" - "github.com/CalebQ42/squashfs/squashfs/inode" + "github.com/CalebQ42/squashfs/low/inode" ) // The types of compression supported by squashfs diff --git a/squashfs/reader_test.go b/low/reader_test.go similarity index 89% rename from squashfs/reader_test.go rename to low/reader_test.go index fa85bf9..1edf591 100644 --- a/squashfs/reader_test.go +++ b/low/reader_test.go @@ -1,4 +1,4 @@ -package squashfs_test +package squashfslow_test import ( "fmt" @@ -9,7 +9,7 @@ import ( "path/filepath" "testing" - "github.com/CalebQ42/squashfs/squashfs" + squashfslow "github.com/CalebQ42/squashfs/low" ) const ( @@ -57,7 +57,7 @@ func TestReader(t *testing.T) { t.Fatal(err) } defer fil.Close() - rdr, err := squashfs.NewReader(fil) + rdr, err := squashfslow.NewReader(fil) if err != nil { t.Fatal(err) } @@ -77,7 +77,7 @@ func TestSingleFile(t *testing.T) { t.Fatal(err) } defer fil.Close() - rdr, err := squashfs.NewReader(fil) + rdr, err := squashfslow.NewReader(fil) if err != nil { t.Fatal(err) } @@ -92,7 +92,7 @@ func TestSingleFile(t *testing.T) { t.Fatal(err) } -func extractToDir(rdr *squashfs.Reader, b *squashfs.Base, folder string) error { +func extractToDir(rdr *squashfslow.Reader, b *squashfslow.Base, folder string) error { path := filepath.Join(folder, b.Name) if b.IsDir() { d, err := b.ToDir(rdr) @@ -103,7 +103,7 @@ func extractToDir(rdr *squashfs.Reader, b *squashfs.Base, folder string) error { if err != nil { return err } - var nestBast *squashfs.Base + var nestBast *squashfslow.Base for _, e := range d.Entries { nestBast, err = rdr.BaseFromEntry(e) if err != nil { diff --git a/squashfs/superblock.go b/low/superblock.go similarity index 98% rename from squashfs/superblock.go rename to low/superblock.go index 0b19dd3..dca087a 100644 --- a/squashfs/superblock.go +++ b/low/superblock.go @@ -1,4 +1,4 @@ -package squashfs +package squashfslow import "math" diff --git a/reader.go b/reader.go index 43058c1..ce499f8 100644 --- a/reader.go +++ b/reader.go @@ -4,21 +4,21 @@ import ( "io" "time" - "github.com/CalebQ42/squashfs/squashfs" + squashfslow "github.com/CalebQ42/squashfs/low" ) type Reader struct { *FS - r *squashfs.Reader + Low *squashfslow.Reader } func NewReader(r io.ReaderAt) (*Reader, error) { - rdr, err := squashfs.NewReader(r) + rdr, err := squashfslow.NewReader(r) if err != nil { return nil, err } out := &Reader{ - r: rdr, + Low: rdr, } out.FS = &FS{ d: rdr.Root, @@ -28,5 +28,5 @@ func NewReader(r io.ReaderAt) (*Reader, error) { } func (r *Reader) ModTime() time.Time { - return time.Unix(int64(r.r.Superblock.ModTime), 0) + return time.Unix(int64(r.Low.Superblock.ModTime), 0) }