Rename squashfs/squashfs to squashfs/low
squashfs/low library name is now squashfslow
This commit is contained in:
@@ -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.
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
+3
-3
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
@@ -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 {
|
||||
@@ -1,4 +1,4 @@
|
||||
package squashfs
|
||||
package squashfslow
|
||||
|
||||
type fragEntry struct {
|
||||
Start uint64
|
||||
@@ -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) {
|
||||
@@ -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
|
||||
@@ -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 {
|
||||
@@ -1,4 +1,4 @@
|
||||
package squashfs
|
||||
package squashfslow
|
||||
|
||||
import "math"
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user