Some work on reading the root inode's dir table
This commit is contained in:
@@ -24,4 +24,4 @@ I am focusing purely on unsquashing before squashing.
|
|||||||
|
|
||||||
# Where I'm at
|
# Where I'm at
|
||||||
|
|
||||||
* Re-redid a bunch to try to make sure I wasn't durping. After that didn't work, I tried to figure out why things wheren't working, then realized HOW I was durping.
|
* Something is wrong with my directory table reading. Need to figure that out.
|
||||||
+4
-6
@@ -23,7 +23,6 @@ type BlockReader struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Reader) NewBlockReader(offset int64) (*BlockReader, error) {
|
func (s *Reader) NewBlockReader(offset int64) (*BlockReader, error) {
|
||||||
fmt.Println("Offset", offset)
|
|
||||||
var br BlockReader
|
var br BlockReader
|
||||||
br.s = s
|
br.s = s
|
||||||
br.offset = offset
|
br.offset = offset
|
||||||
@@ -39,7 +38,6 @@ func (s *Reader) NewBlockReader(offset int64) (*BlockReader, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (br *BlockReader) parseMetadata() error {
|
func (br *BlockReader) parseMetadata() error {
|
||||||
fmt.Println("meta offset", br.offset)
|
|
||||||
var raw uint16
|
var raw uint16
|
||||||
err := binary.Read(io.NewSectionReader(br.s.r, br.offset, 2), binary.LittleEndian, &raw)
|
err := binary.Read(io.NewSectionReader(br.s.r, br.offset, 2), binary.LittleEndian, &raw)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -53,7 +51,6 @@ func (br *BlockReader) parseMetadata() error {
|
|||||||
size: size,
|
size: size,
|
||||||
compressed: compressed,
|
compressed: compressed,
|
||||||
})
|
})
|
||||||
fmt.Println("compression", compressed)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,16 +77,18 @@ func (br *BlockReader) readNextDataBlock() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (br *BlockReader) Read(p []byte) (int, error) {
|
func (br *BlockReader) Read(p []byte) (int, error) {
|
||||||
|
fmt.Println("reading", len(p))
|
||||||
if br.readOffset+len(p) < len(br.data) {
|
if br.readOffset+len(p) < len(br.data) {
|
||||||
for i := 0; i < len(p); i++ {
|
for i := 0; i < len(p); i++ {
|
||||||
p[i] = br.data[br.readOffset+i]
|
p[i] = br.data[br.readOffset+i]
|
||||||
}
|
}
|
||||||
br.readOffset += len(p)
|
br.readOffset += len(p)
|
||||||
|
fmt.Println("enough data available")
|
||||||
return len(p), nil
|
return len(p), nil
|
||||||
}
|
}
|
||||||
read := 0
|
read := 0
|
||||||
for read < len(p) {
|
for read < len(p) {
|
||||||
if read+br.readOffset == len(br.data) {
|
fmt.Println("Reading new block")
|
||||||
err := br.parseMetadata()
|
err := br.parseMetadata()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
br.readOffset += read
|
br.readOffset += read
|
||||||
@@ -100,8 +99,8 @@ func (br *BlockReader) Read(p []byte) (int, error) {
|
|||||||
br.readOffset += read
|
br.readOffset += read
|
||||||
return read, err
|
return read, err
|
||||||
}
|
}
|
||||||
}
|
|
||||||
for ; read < len(p); read++ {
|
for ; read < len(p); read++ {
|
||||||
|
// fmt.Println("Reading...")
|
||||||
if br.readOffset+read < len(br.data) {
|
if br.readOffset+read < len(br.data) {
|
||||||
p[read] = br.data[br.readOffset+read]
|
p[read] = br.data[br.readOffset+read]
|
||||||
} else {
|
} else {
|
||||||
@@ -113,7 +112,6 @@ func (br *BlockReader) Read(p []byte) (int, error) {
|
|||||||
if read != len(p) {
|
if read != len(p) {
|
||||||
return read, errors.New("Didn't read enough data")
|
return read, errors.New("Didn't read enough data")
|
||||||
}
|
}
|
||||||
fmt.Println("Read", p)
|
|
||||||
return read, nil
|
return read, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,11 +31,15 @@ type Entry struct {
|
|||||||
func NewEntry(rdr io.Reader) (Entry, error) {
|
func NewEntry(rdr io.Reader) (Entry, error) {
|
||||||
var entry Entry
|
var entry Entry
|
||||||
err := binary.Read(rdr, binary.LittleEndian, &entry.Init)
|
err := binary.Read(rdr, binary.LittleEndian, &entry.Init)
|
||||||
|
fmt.Println("entry", entry.Init)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return entry, err
|
return Entry{}, err
|
||||||
}
|
}
|
||||||
entry.Name = make([]byte, entry.Init.NameSize+1, entry.Init.NameSize+1)
|
entry.Name = make([]byte, entry.Init.NameSize+1, entry.Init.NameSize+1)
|
||||||
err = binary.Read(rdr, binary.LittleEndian, &entry.Name)
|
err = binary.Read(rdr, binary.LittleEndian, &entry.Name)
|
||||||
|
if err != nil {
|
||||||
|
return Entry{}, err
|
||||||
|
}
|
||||||
return entry, err
|
return entry, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,6 +59,7 @@ func NewDirectory(rdr io.Reader) (*Directory, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
hdr.Count++
|
hdr.Count++
|
||||||
|
fmt.Println("entries coutn", hdr.Count)
|
||||||
headers := hdr.Count / 256
|
headers := hdr.Count / 256
|
||||||
if hdr.Count%256 > 0 {
|
if hdr.Count%256 > 0 {
|
||||||
headers++
|
headers++
|
||||||
@@ -63,7 +68,9 @@ func NewDirectory(rdr io.Reader) (*Directory, error) {
|
|||||||
dir.Headers = make([]Header, headers)
|
dir.Headers = make([]Header, headers)
|
||||||
dir.Headers[0] = hdr
|
dir.Headers[0] = hdr
|
||||||
for i := uint32(0); i < hdr.Count; i++ {
|
for i := uint32(0); i < hdr.Count; i++ {
|
||||||
|
fmt.Println("reading entry", i)
|
||||||
if i != 0 && i%256 == 0 {
|
if i != 0 && i%256 == 0 {
|
||||||
|
fmt.Println("reading new header...")
|
||||||
var newHdr Header
|
var newHdr Header
|
||||||
err = binary.Read(rdr, binary.LittleEndian, &newHdr)
|
err = binary.Read(rdr, binary.LittleEndian, &newHdr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ func (r *Reader) readRootDirTable() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
fmt.Println("Done reading inode...")
|
||||||
dirRdr, err := r.NewBlockReader(int64(r.super.DirTableStart + uint64(i.Info.(inode.BasicDirectory).DirectoryIndex)))
|
dirRdr, err := r.NewBlockReader(int64(r.super.DirTableStart + uint64(i.Info.(inode.BasicDirectory).DirectoryIndex)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
Reference in New Issue
Block a user