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).
|
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.
|
Currently has support for reading squashfs files and extracting files and folders.
|
||||||
|
|
||||||
|
|||||||
@@ -12,14 +12,14 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/CalebQ42/squashfs/internal/routinemanager"
|
"github.com/CalebQ42/squashfs/internal/routinemanager"
|
||||||
"github.com/CalebQ42/squashfs/squashfs"
|
squashfslow "github.com/CalebQ42/squashfs/low"
|
||||||
"github.com/CalebQ42/squashfs/squashfs/data"
|
"github.com/CalebQ42/squashfs/low/data"
|
||||||
"github.com/CalebQ42/squashfs/squashfs/inode"
|
"github.com/CalebQ42/squashfs/low/inode"
|
||||||
)
|
)
|
||||||
|
|
||||||
// File represents a file inside a squashfs archive.
|
// File represents a file inside a squashfs archive.
|
||||||
type File struct {
|
type File struct {
|
||||||
b *squashfs.Base
|
b *squashfslow.Base
|
||||||
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 *squashfs.Base, parent *FS) *File {
|
func (r *Reader) FileFromBase(b *squashfslow.Base, parent *FS) *File {
|
||||||
return &File{
|
return &File{
|
||||||
b: b,
|
b: b,
|
||||||
parent: parent,
|
parent: parent,
|
||||||
@@ -40,7 +40,7 @@ func (f *File) FS() (*FS, error) {
|
|||||||
if !f.IsDir() {
|
if !f.IsDir() {
|
||||||
return nil, errors.New("not a directory")
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -114,7 +114,7 @@ func (f *File) ReadDir(n int) ([]fs.DirEntry, error) {
|
|||||||
if !f.IsDir() {
|
if !f.IsDir() {
|
||||||
return nil, errors.New("file is not a directory")
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -173,7 +173,7 @@ func (f *File) WriteTo(w io.Writer) (int64, error) {
|
|||||||
|
|
||||||
func (f *File) initializeReaders() error {
|
func (f *File) initializeReaders() error {
|
||||||
var err 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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,7 +218,7 @@ func (f *File) ExtractWithOptions(path string, op *ExtractionOptions) error {
|
|||||||
}
|
}
|
||||||
switch f.b.Inode.Type {
|
switch f.b.Inode.Type {
|
||||||
case inode.Dir, inode.EDir:
|
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 err != nil {
|
||||||
if op.Verbose {
|
if op.Verbose {
|
||||||
log.Println("Failed to create squashfs.Directory for", path)
|
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))
|
errChan := make(chan error, len(d.Entries))
|
||||||
for i := range 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 err != nil {
|
||||||
if op.Verbose {
|
if op.Verbose {
|
||||||
log.Println("Failed to get squashfs.Base from entry for", path)
|
log.Println("Failed to get squashfs.Base from entry for", path)
|
||||||
}
|
}
|
||||||
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 *squashfs.Base, path string) {
|
go func(b *squashfslow.Base, 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)
|
||||||
@@ -285,7 +285,7 @@ func (f *File) ExtractWithOptions(path string, op *ExtractionOptions) error {
|
|||||||
return errors.Join(errors.New("failed to create file: "+path), err)
|
return errors.Join(errors.New("failed to create file: "+path), err)
|
||||||
}
|
}
|
||||||
defer outFil.Close()
|
defer outFil.Close()
|
||||||
full, err := f.b.GetFullReader(f.r.r)
|
full, err := f.b.GetFullReader(f.r.Low)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if op.Verbose {
|
if op.Verbose {
|
||||||
log.Println("Failed to create full reader for", path)
|
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 {
|
if op.IgnorePerm {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
uid, err := f.b.Uid(f.r.r)
|
uid, err := f.b.Uid(f.r.Low)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if op.Verbose {
|
if op.Verbose {
|
||||||
log.Println("Failed to get uid for", path)
|
log.Println("Failed to get uid for", path)
|
||||||
@@ -414,7 +414,7 @@ func (f *File) ExtractWithOptions(path string, op *ExtractionOptions) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
gid, err := f.b.Gid(f.r.r)
|
gid, err := f.b.Gid(f.r.Low)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if op.Verbose {
|
if op.Verbose {
|
||||||
log.Println("Failed to get gid for", path)
|
log.Println("Failed to get gid for", path)
|
||||||
|
|||||||
+3
-3
@@ -4,8 +4,8 @@ import (
|
|||||||
"io/fs"
|
"io/fs"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/CalebQ42/squashfs/squashfs/directory"
|
"github.com/CalebQ42/squashfs/low/directory"
|
||||||
"github.com/CalebQ42/squashfs/squashfs/inode"
|
"github.com/CalebQ42/squashfs/low/inode"
|
||||||
)
|
)
|
||||||
|
|
||||||
type fileInfo struct {
|
type fileInfo struct {
|
||||||
@@ -17,7 +17,7 @@ type fileInfo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r Reader) newFileInfo(e directory.Entry) (fileInfo, error) {
|
func (r Reader) newFileInfo(e directory.Entry) (fileInfo, error) {
|
||||||
i, err := r.r.InodeFromEntry(e)
|
i, err := r.Low.InodeFromEntry(e)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fileInfo{}, err
|
return fileInfo{}, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,20 +8,20 @@ import (
|
|||||||
"slices"
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/CalebQ42/squashfs/squashfs"
|
squashfslow "github.com/CalebQ42/squashfs/low"
|
||||||
"github.com/CalebQ42/squashfs/squashfs/directory"
|
"github.com/CalebQ42/squashfs/low/directory"
|
||||||
)
|
)
|
||||||
|
|
||||||
// FS is a fs.FS representation of a squashfs directory.
|
// FS is a fs.FS representation of a squashfs directory.
|
||||||
// Implements fs.GlobFS, fs.ReadDirFS, fs.ReadFileFS, fs.StatFS, and fs.SubFS
|
// Implements fs.GlobFS, fs.ReadDirFS, fs.ReadFileFS, fs.StatFS, and fs.SubFS
|
||||||
type FS struct {
|
type FS struct {
|
||||||
d *squashfs.Directory
|
d *squashfslow.Directory
|
||||||
r *Reader
|
r *Reader
|
||||||
parent *FS
|
parent *FS
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates a new *FS from the given squashfs.directory
|
// 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{
|
return &FS{
|
||||||
d: d,
|
d: d,
|
||||||
r: r,
|
r: r,
|
||||||
@@ -124,7 +124,7 @@ func (f *FS) Open(name string) (fs.File, error) {
|
|||||||
Err: fs.ErrNotExist,
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -142,7 +142,7 @@ func (f *FS) Open(name string) (fs.File, error) {
|
|||||||
Err: fs.ErrNotExist,
|
Err: fs.ErrNotExist,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
d, err := b.ToDir(f.r.r)
|
d, err := b.ToDir(f.r.Low)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package squashfs
|
package squashfslow
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
@@ -6,9 +6,9 @@ import (
|
|||||||
|
|
||||||
"github.com/CalebQ42/squashfs/internal/metadata"
|
"github.com/CalebQ42/squashfs/internal/metadata"
|
||||||
"github.com/CalebQ42/squashfs/internal/toreader"
|
"github.com/CalebQ42/squashfs/internal/toreader"
|
||||||
"github.com/CalebQ42/squashfs/squashfs/data"
|
"github.com/CalebQ42/squashfs/low/data"
|
||||||
"github.com/CalebQ42/squashfs/squashfs/directory"
|
"github.com/CalebQ42/squashfs/low/directory"
|
||||||
"github.com/CalebQ42/squashfs/squashfs/inode"
|
"github.com/CalebQ42/squashfs/low/inode"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Base struct {
|
type Base struct {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package squashfs
|
package squashfslow
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
@@ -9,8 +9,8 @@ import (
|
|||||||
|
|
||||||
"github.com/CalebQ42/squashfs/internal/metadata"
|
"github.com/CalebQ42/squashfs/internal/metadata"
|
||||||
"github.com/CalebQ42/squashfs/internal/toreader"
|
"github.com/CalebQ42/squashfs/internal/toreader"
|
||||||
"github.com/CalebQ42/squashfs/squashfs/directory"
|
"github.com/CalebQ42/squashfs/low/directory"
|
||||||
"github.com/CalebQ42/squashfs/squashfs/inode"
|
"github.com/CalebQ42/squashfs/low/inode"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Directory struct {
|
type Directory struct {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package squashfs
|
package squashfslow
|
||||||
|
|
||||||
type fragEntry struct {
|
type fragEntry struct {
|
||||||
Start uint64
|
Start uint64
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
package squashfs
|
package squashfslow
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/CalebQ42/squashfs/internal/metadata"
|
"github.com/CalebQ42/squashfs/internal/metadata"
|
||||||
"github.com/CalebQ42/squashfs/internal/toreader"
|
"github.com/CalebQ42/squashfs/internal/toreader"
|
||||||
"github.com/CalebQ42/squashfs/squashfs/directory"
|
"github.com/CalebQ42/squashfs/low/directory"
|
||||||
"github.com/CalebQ42/squashfs/squashfs/inode"
|
"github.com/CalebQ42/squashfs/low/inode"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (r *Reader) InodeFromRef(ref uint64) (*inode.Inode, error) {
|
func (r *Reader) InodeFromRef(ref uint64) (*inode.Inode, error) {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package squashfs
|
package squashfslow
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/CalebQ42/squashfs/internal/decompress"
|
"github.com/CalebQ42/squashfs/internal/decompress"
|
||||||
"github.com/CalebQ42/squashfs/internal/metadata"
|
"github.com/CalebQ42/squashfs/internal/metadata"
|
||||||
"github.com/CalebQ42/squashfs/internal/toreader"
|
"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
|
// The types of compression supported by squashfs
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package squashfs_test
|
package squashfslow_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/CalebQ42/squashfs/squashfs"
|
squashfslow "github.com/CalebQ42/squashfs/low"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -57,7 +57,7 @@ func TestReader(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
defer fil.Close()
|
defer fil.Close()
|
||||||
rdr, err := squashfs.NewReader(fil)
|
rdr, err := squashfslow.NewReader(fil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -77,7 +77,7 @@ func TestSingleFile(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
defer fil.Close()
|
defer fil.Close()
|
||||||
rdr, err := squashfs.NewReader(fil)
|
rdr, err := squashfslow.NewReader(fil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -92,7 +92,7 @@ func TestSingleFile(t *testing.T) {
|
|||||||
t.Fatal(err)
|
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)
|
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 *squashfs.Reader, b *squashfs.Base, folder string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var nestBast *squashfs.Base
|
var nestBast *squashfslow.Base
|
||||||
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 {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package squashfs
|
package squashfslow
|
||||||
|
|
||||||
import "math"
|
import "math"
|
||||||
|
|
||||||
@@ -4,21 +4,21 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/CalebQ42/squashfs/squashfs"
|
squashfslow "github.com/CalebQ42/squashfs/low"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Reader struct {
|
type Reader struct {
|
||||||
*FS
|
*FS
|
||||||
r *squashfs.Reader
|
Low *squashfslow.Reader
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewReader(r io.ReaderAt) (*Reader, error) {
|
func NewReader(r io.ReaderAt) (*Reader, error) {
|
||||||
rdr, err := squashfs.NewReader(r)
|
rdr, err := squashfslow.NewReader(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
out := &Reader{
|
out := &Reader{
|
||||||
r: rdr,
|
Low: rdr,
|
||||||
}
|
}
|
||||||
out.FS = &FS{
|
out.FS = &FS{
|
||||||
d: rdr.Root,
|
d: rdr.Root,
|
||||||
@@ -28,5 +28,5 @@ func NewReader(r io.ReaderAt) (*Reader, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *Reader) ModTime() time.Time {
|
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