Re-wrote metadata reader. Seems to work now.

Need to work on test now.
This commit is contained in:
Caleb Gardner
2022-06-18 14:31:17 -05:00
parent 96b38935a6
commit 49595de3f2
5 changed files with 38 additions and 69 deletions
+27 -32
View File
@@ -2,8 +2,6 @@ package metadata
import (
"encoding/binary"
"errors"
"fmt"
"io"
"github.com/CalebQ42/squashfs/internal/decompress"
@@ -15,54 +13,51 @@ type Reader struct {
d decompress.Decompressor
}
func NewReader(r io.Reader, d decompress.Decompressor) (*Reader, error) {
var out Reader
out.d = d
out.master = r
return &out, out.Advance()
func NewReader(master io.Reader, d decompress.Decompressor) *Reader {
return &Reader{
master: master,
d: d,
}
}
func (r *Reader) Advance() error {
func realSize(siz uint16) uint16 {
return siz &^ 0x8000
}
//For some reason things get closed improperly and causes issues.
//NO IDEA HOW THIS IS HAPPENING.
// if clr, ok := r.cur.(io.Closer); ok {
// clr.Close()
// r.cur = nil
// }
var size uint16
err := binary.Read(r.master, binary.LittleEndian, &size)
func (r *Reader) advance() (err error) {
if clr, ok := r.cur.(io.Closer); ok {
clr.Close()
}
var raw uint16
err = binary.Read(r.master, binary.LittleEndian, &raw)
if err != nil {
return err
}
comp := size&0x8000 != 0x8000
size &^= 0x8000
if size > 8196 {
fmt.Println("uhoh")
return errors.New("AH")
return
}
size := realSize(raw)
r.cur = io.LimitReader(r.master, int64(size))
if comp {
if size == raw {
r.cur, err = r.d.Reader(r.cur)
}
return
}
func (r *Reader) Read(p []byte) (n int, err error) {
if r.cur == nil {
err = r.advance()
if err != nil {
return err
return
}
}
return nil
}
func (r Reader) Read(p []byte) (n int, err error) {
n, err = r.cur.Read(p)
if err == io.EOF {
err = r.Advance()
err = r.advance()
if err != nil {
return
}
var tmpN int
tmp := make([]byte, len(p)-n)
tmpN, err = r.Read(tmp)
for i := range tmp {
for i := 0; i < tmpN; i++ {
p[n+i] = tmp[i]
}
n += tmpN