Re-write data fullreader & reader
Moved directory and the rest of the inodes to manual decoding
This commit is contained in:
+39
-11
@@ -11,12 +11,45 @@ type header struct {
|
||||
Num uint32
|
||||
}
|
||||
|
||||
type decEntry struct {
|
||||
func readHeader(r io.Reader) (h header, err error) {
|
||||
dat := make([]byte, 12)
|
||||
_, err = r.Read(dat)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
h.Count = binary.LittleEndian.Uint32(dat)
|
||||
h.BlockStart = binary.LittleEndian.Uint32(dat[4:])
|
||||
h.Num = binary.LittleEndian.Uint32(dat[8:])
|
||||
return
|
||||
}
|
||||
|
||||
type dirEntry struct {
|
||||
Offset uint16
|
||||
NumOffset int16
|
||||
InodeType uint16
|
||||
NameSize uint16
|
||||
// Name []byte (not decoded along with decEntry)
|
||||
Name []byte
|
||||
}
|
||||
|
||||
func readEntry(r io.Reader) (e dirEntry, err error) {
|
||||
dat := make([]byte, 8)
|
||||
_, err = r.Read(dat)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
e.Offset = binary.LittleEndian.Uint16(dat)
|
||||
_, err = binary.Decode(dat[2:], binary.LittleEndian, &e.NumOffset)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
e.InodeType = binary.LittleEndian.Uint16(dat[4:])
|
||||
e.NameSize = binary.LittleEndian.Uint16(dat[6:])
|
||||
e.Name = make([]byte, e.NameSize+1)
|
||||
_, err = r.Read(e.Name)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
type Entry struct {
|
||||
@@ -31,20 +64,15 @@ func ReadDirectory(r io.Reader, size uint32) (out []Entry, err error) {
|
||||
size -= 3
|
||||
var curRead uint32
|
||||
var h header
|
||||
var de decEntry
|
||||
var de dirEntry
|
||||
for curRead < size {
|
||||
err = binary.Read(r, binary.LittleEndian, &h)
|
||||
h, err = readHeader(r)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
curRead += 12
|
||||
for i := uint32(0); i < h.Count+1 && curRead < size; i++ {
|
||||
err = binary.Read(r, binary.LittleEndian, &de)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
nameTmp := make([]byte, de.NameSize+1)
|
||||
err = binary.Read(r, binary.LittleEndian, &nameTmp)
|
||||
de, err = readEntry(r)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@@ -52,7 +80,7 @@ func ReadDirectory(r io.Reader, size uint32) (out []Entry, err error) {
|
||||
out = append(out, Entry{
|
||||
BlockStart: h.BlockStart,
|
||||
Offset: de.Offset,
|
||||
Name: string(nameTmp),
|
||||
Name: string(de.Name),
|
||||
InodeType: de.InodeType,
|
||||
Num: h.Num + uint32(de.NumOffset),
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user