3378651686
Moved directory and the rest of the inodes to manual decoding
79 lines
1.8 KiB
Go
79 lines
1.8 KiB
Go
package inode
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"io"
|
|
)
|
|
|
|
type Directory struct {
|
|
BlockStart uint32
|
|
LinkCount uint32
|
|
Size uint16
|
|
Offset uint16
|
|
ParentNum uint32
|
|
}
|
|
|
|
func ReadDir(r io.Reader) (d Directory, err error) {
|
|
dat := make([]byte, 16)
|
|
_, err = r.Read(dat)
|
|
if err != nil {
|
|
return
|
|
}
|
|
d.BlockStart = binary.LittleEndian.Uint32(dat)
|
|
d.LinkCount = binary.LittleEndian.Uint32(dat[4:])
|
|
d.Size = binary.LittleEndian.Uint16(dat[8:])
|
|
d.Offset = binary.LittleEndian.Uint16(dat[10:])
|
|
d.ParentNum = binary.LittleEndian.Uint32(dat[12:])
|
|
return
|
|
}
|
|
|
|
type EDirectory struct {
|
|
LinkCount uint32
|
|
Size uint32
|
|
BlockStart uint32
|
|
ParentNum uint32
|
|
IndCount uint16
|
|
Offset uint16
|
|
XattrInd uint32
|
|
Indexes []DirectoryIndex
|
|
}
|
|
|
|
type DirectoryIndex struct {
|
|
Ind uint32
|
|
Start uint32
|
|
NameSize uint32
|
|
Name []byte
|
|
}
|
|
|
|
func ReadEDir(r io.Reader) (d EDirectory, err error) {
|
|
dat := make([]byte, 24)
|
|
_, err = r.Read(dat)
|
|
if err != nil {
|
|
return
|
|
}
|
|
d.LinkCount = binary.LittleEndian.Uint32(dat)
|
|
d.Size = binary.LittleEndian.Uint32(dat[4:])
|
|
d.BlockStart = binary.LittleEndian.Uint32(dat[8:])
|
|
d.ParentNum = binary.LittleEndian.Uint32(dat[12:])
|
|
d.IndCount = binary.LittleEndian.Uint16(dat[16:])
|
|
d.Offset = binary.LittleEndian.Uint16(dat[18:])
|
|
d.XattrInd = binary.LittleEndian.Uint32(dat[20:])
|
|
d.Indexes = make([]DirectoryIndex, d.IndCount)
|
|
for i := range d.IndCount {
|
|
dat = make([]byte, 12)
|
|
_, err = r.Read(dat)
|
|
if err != nil {
|
|
return
|
|
}
|
|
d.Indexes[i].Ind = binary.LittleEndian.Uint32(dat)
|
|
d.Indexes[i].Start = binary.LittleEndian.Uint32(dat[4:])
|
|
d.Indexes[i].NameSize = binary.LittleEndian.Uint32(dat[8:])
|
|
d.Indexes[i].Name = make([]byte, d.Indexes[i].NameSize+1)
|
|
_, err = r.Read(d.Indexes[i].Name)
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|