bfba5d5b60
squashfs/low library name is now squashfslow
61 lines
1.1 KiB
Go
61 lines
1.1 KiB
Go
package directory
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"io"
|
|
)
|
|
|
|
type header struct {
|
|
Count uint32
|
|
BlockStart uint32
|
|
Num uint32
|
|
}
|
|
|
|
type decEntry struct {
|
|
Offset uint16
|
|
NumOffset int16
|
|
InodeType uint16
|
|
NameSize uint16
|
|
// Name []byte (not decoded along with decEntry)
|
|
}
|
|
|
|
type Entry struct {
|
|
Name string
|
|
BlockStart uint32
|
|
Offset uint16
|
|
InodeType uint16
|
|
}
|
|
|
|
func ReadDirectory(r io.Reader, size uint32) (out []Entry, err error) {
|
|
size -= 3
|
|
var curRead uint32
|
|
var h header
|
|
var de decEntry
|
|
for curRead < size {
|
|
err = binary.Read(r, binary.LittleEndian, &h)
|
|
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)
|
|
if err != nil {
|
|
return
|
|
}
|
|
curRead += 8 + uint32(de.NameSize) + 1
|
|
out = append(out, Entry{
|
|
BlockStart: h.BlockStart,
|
|
Offset: de.Offset,
|
|
Name: string(nameTmp),
|
|
InodeType: de.InodeType,
|
|
})
|
|
}
|
|
}
|
|
return
|
|
}
|