Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 03266d0560 | |||
| 0f8a4e0027 |
@@ -0,0 +1,19 @@
|
|||||||
|
package toreader
|
||||||
|
|
||||||
|
import "io"
|
||||||
|
|
||||||
|
type OffsetReader struct {
|
||||||
|
r io.ReaderAt
|
||||||
|
off int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewOffsetReader(r io.ReaderAt, off int64) *OffsetReader {
|
||||||
|
return &OffsetReader{
|
||||||
|
r: r,
|
||||||
|
off: off,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r OffsetReader) ReadAt(p []byte, off int64) (n int, e error) {
|
||||||
|
return r.r.ReadAt(p, off+r.off)
|
||||||
|
}
|
||||||
+5
-3
@@ -3,6 +3,7 @@ package squashfslow
|
|||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
|
|
||||||
@@ -88,7 +89,7 @@ func (r *Reader) Id(i uint16) (uint32, error) {
|
|||||||
// Populate the id table as needed
|
// Populate the id table as needed
|
||||||
var blockNum uint32
|
var blockNum uint32
|
||||||
if i != 0 { // If i == 0, we go negatives causing issues with uint32s
|
if i != 0 { // If i == 0, we go negatives causing issues with uint32s
|
||||||
blockNum = uint32(math.Ceil(float64(i)/2048)) - 1
|
blockNum = uint32(math.Ceil(float64(i+1)/2048)) - 1
|
||||||
} else {
|
} else {
|
||||||
blockNum = 0
|
blockNum = 0
|
||||||
}
|
}
|
||||||
@@ -131,10 +132,11 @@ func (r *Reader) fragEntry(i uint32) (fragEntry, error) {
|
|||||||
// Populate the fragment table as needed
|
// Populate the fragment table as needed
|
||||||
var blockNum uint32
|
var blockNum uint32
|
||||||
if i != 0 { // If i == 0, we go negatives causing issues with uint32s
|
if i != 0 { // If i == 0, we go negatives causing issues with uint32s
|
||||||
blockNum = uint32(math.Ceil(float64(i)/512)) - 1
|
blockNum = uint32(math.Ceil(float64(i+1)/512)) - 1
|
||||||
} else {
|
} else {
|
||||||
blockNum = 0
|
blockNum = 0
|
||||||
}
|
}
|
||||||
|
fmt.Println(blockNum)
|
||||||
blocksRead := len(r.fragTable) / 512
|
blocksRead := len(r.fragTable) / 512
|
||||||
blocksToRead := int(blockNum) - blocksRead + 1
|
blocksToRead := int(blockNum) - blocksRead + 1
|
||||||
|
|
||||||
@@ -177,7 +179,7 @@ func (r *Reader) inodeRef(i uint32) (uint64, error) {
|
|||||||
// Populate the export table as needed
|
// Populate the export table as needed
|
||||||
var blockNum uint32
|
var blockNum uint32
|
||||||
if i != 0 { // If i == 0, we go negatives causing issues with uint32s
|
if i != 0 { // If i == 0, we go negatives causing issues with uint32s
|
||||||
blockNum = uint32(math.Ceil(float64(i)/1024)) - 1
|
blockNum = uint32(math.Ceil(float64(i+1)/1024)) - 1
|
||||||
} else {
|
} else {
|
||||||
blockNum = 0
|
blockNum = 0
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-8
@@ -1,4 +1,4 @@
|
|||||||
package squashfslow_test
|
package squashfslow
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -8,13 +8,11 @@ import (
|
|||||||
"os/exec"
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
squashfslow "github.com/CalebQ42/squashfs/low"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
squashfsURL = "https://darkstorm.tech/files/LinuxPATest.sfs"
|
squashfsURL = "https://darkstorm.tech/files/LinuxPATest.sfs"
|
||||||
squashfsName = "LinuxPATest.sfs"
|
squashfsName = "airootfs.sfs"
|
||||||
)
|
)
|
||||||
|
|
||||||
func preTest(dir string) (fil *os.File, err error) {
|
func preTest(dir string) (fil *os.File, err error) {
|
||||||
@@ -50,6 +48,21 @@ func preTest(dir string) (fil *os.File, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMisc(t *testing.T) {
|
||||||
|
tmpDir := "../testing"
|
||||||
|
fil, err := preTest(tmpDir)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer fil.Close()
|
||||||
|
rdr, err := NewReader(fil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Log(rdr.Superblock.FragCount)
|
||||||
|
t.Fatal(rdr.fragEntry(1233))
|
||||||
|
}
|
||||||
|
|
||||||
func TestReader(t *testing.T) {
|
func TestReader(t *testing.T) {
|
||||||
tmpDir := "../testing"
|
tmpDir := "../testing"
|
||||||
fil, err := preTest(tmpDir)
|
fil, err := preTest(tmpDir)
|
||||||
@@ -57,7 +70,7 @@ func TestReader(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
defer fil.Close()
|
defer fil.Close()
|
||||||
rdr, err := squashfslow.NewReader(fil)
|
rdr, err := NewReader(fil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -77,7 +90,7 @@ func TestSingleFile(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
defer fil.Close()
|
defer fil.Close()
|
||||||
rdr, err := squashfslow.NewReader(fil)
|
rdr, err := NewReader(fil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -92,7 +105,7 @@ func TestSingleFile(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func extractToDir(rdr *squashfslow.Reader, b *squashfslow.FileBase, folder string) error {
|
func extractToDir(rdr *Reader, b *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 +116,7 @@ func extractToDir(rdr *squashfslow.Reader, b *squashfslow.FileBase, folder strin
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var nestBast squashfslow.FileBase
|
var nestBast 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 {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/CalebQ42/squashfs/internal/toreader"
|
||||||
squashfslow "github.com/CalebQ42/squashfs/low"
|
squashfslow "github.com/CalebQ42/squashfs/low"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -27,6 +28,10 @@ func NewReader(r io.ReaderAt) (*Reader, error) {
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewReaderAtOffset(r io.ReaderAt, offset int64) (*Reader, error) {
|
||||||
|
return NewReader(toreader.NewOffsetReader(r, offset))
|
||||||
|
}
|
||||||
|
|
||||||
func (r *Reader) ModTime() time.Time {
|
func (r *Reader) ModTime() time.Time {
|
||||||
return time.Unix(int64(r.Low.Superblock.ModTime), 0)
|
return time.Unix(int64(r.Low.Superblock.ModTime), 0)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user