bc9adf8ade
Removed DecompressCopy (as I wasn't using it) Started work on fragments
126 lines
2.8 KiB
Go
126 lines
2.8 KiB
Go
package inode
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"io"
|
|
)
|
|
|
|
//Inode holds an inode. Header is the header that's common for all inodes.
|
|
//
|
|
//Info holds the actual Inode. Due to each inode type being a different type, it's store as an interface{}
|
|
type Inode struct {
|
|
Header Header
|
|
Type int //Type the inode type defined in the header. Here so it's easy to access
|
|
Info interface{} //Info is the parsed specific data. It's type is defined by Type.
|
|
}
|
|
|
|
//ProcessInode tries to read an inode from the BlockReader
|
|
func ProcessInode(br io.Reader, blockSize uint32) (*Inode, error) {
|
|
var head Header
|
|
err := binary.Read(br, binary.LittleEndian, &head)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var info interface{}
|
|
switch head.InodeType {
|
|
case BasicDirectoryType:
|
|
var inode BasicDirectory
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case BasicFileType:
|
|
inode, err := NewBasicFile(br, blockSize)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case BasicSymlinkType:
|
|
inode, err := NewBasicSymlink(br)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case BasicBlockDeviceType:
|
|
var inode BasicDevice
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case BasicCharDeviceType:
|
|
var inode BasicDevice
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case BasicFifoType:
|
|
var inode BasicIPC
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case BasicSocketType:
|
|
var inode BasicIPC
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtDirType:
|
|
inode, err := NewExtendedDirectory(br)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtFileType:
|
|
inode, err := NewExtendedFile(br, blockSize)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtSymlinkType:
|
|
inode, err := NewExtendedSymlink(br)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtBlockDeviceType:
|
|
var inode ExtendedDevice
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtCharDeviceType:
|
|
var inode ExtendedDevice
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtFifoType:
|
|
var inode ExtendedIPC
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtSocketType:
|
|
var inode ExtendedIPC
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
}
|
|
return &Inode{
|
|
Type: int(head.InodeType),
|
|
Header: head,
|
|
Info: info,
|
|
}, nil
|
|
}
|