Files
squashfs/squashfs.go
T
Caleb Gardner 06b188d53c Restarted some stuff so I can do it better.
Made a reader that can reade across data blocks if necessary
Still can't get things to read right
2020-11-13 16:11:44 -06:00

75 lines
1.7 KiB
Go

package squashfs
import (
"encoding/binary"
"fmt"
"io"
"github.com/CalebQ42/GoSquashfs/internal/directory"
"github.com/CalebQ42/GoSquashfs/internal/inode"
)
type Squashfs struct {
r Reader
super Superblock
flags SuperblockFlags
compression CompressionOptions
}
func NewSquashfs(rdr io.ReaderAt) (*Squashfs, error) {
var squash Squashfs
squash.r = NewReader(rdr)
err := binary.Read(&squash.r, binary.LittleEndian, &squash.super)
if err != nil {
return nil, err
}
squash.flags = squash.super.getFlags()
switch squash.super.Compression {
case gzipCompression:
var raw gzipOptionsRaw
err := binary.Read(&squash.r, binary.LittleEndian, &raw)
if err != nil {
return nil, err
}
squash.compression = NewGzipOptions(raw)
default:
fmt.Println("Other compression options are not currently supported")
return nil, err
}
return &squash, nil
}
func (s *Squashfs) printDirTable() error {
offset, metaOffset := inode.ProcessInodeRef(s.super.RootInode)
br, err := s.NewBlockReader(int64(offset))
if err != nil {
return err
}
fmt.Println(offset, metaOffset)
br.dataOffset = int64(metaOffset)
_, inodeType, err := inode.ProcessInode(br, s.super.BlockSize)
if err != nil {
return err
}
rootDir := inodeType.(*inode.BasicDirectory)
fmt.Println(*rootDir)
br, err = s.NewBlockReader(int64(s.super.DirectoryTableOffset) + int64(rootDir.DirectoryIndex))
if err != nil {
return err
}
br.dataOffset = int64(rootDir.DirectoryOffset)
dir, err := directory.NewDirectory(br)
if err != nil {
return err
}
for _, entry := range dir.Entries {
fmt.Println(entry.Name)
}
return nil
}
//GetFlags returns the SuperblockFlags from the Superblock
func (s *Squashfs) GetFlags() SuperblockFlags {
return s.flags
}