80946f58e7
Removed some shadowed err's
131 lines
2.7 KiB
Go
131 lines
2.7 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 {
|
|
Info interface{} //Info is the parsed specific data. It's type is defined by Type.
|
|
Type int //Type the inode type defined in the header. Here so it's easy to access
|
|
Header
|
|
}
|
|
|
|
//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 DirType:
|
|
var inode Dir
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case FileType:
|
|
var inode File
|
|
inode, err = NewFile(br, blockSize)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case SymType:
|
|
var inode Sym
|
|
inode, err = NewSymlink(br)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case BlockDevType:
|
|
var inode Device
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case CharDevType:
|
|
var inode Device
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case FifoType:
|
|
var inode IPC
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case SocketType:
|
|
var inode IPC
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtDirType:
|
|
var inode ExtDir
|
|
inode, err = NewExtendedDirectory(br)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtFileType:
|
|
var inode ExtFile
|
|
inode, err = NewExtendedFile(br, blockSize)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtSymType:
|
|
var inode ExtSym
|
|
inode, err = NewExtendedSymlink(br)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtBlockDeviceType:
|
|
var inode ExtDevice
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtCharDeviceType:
|
|
var inode ExtDevice
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtFifoType:
|
|
var inode ExtIPC
|
|
err = binary.Read(br, binary.LittleEndian, &inode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
info = inode
|
|
case ExtSocketType:
|
|
var inode ExtIPC
|
|
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
|
|
}
|