diff options
Diffstat (limited to 'cmd/btrfs-dbg/main.go')
-rw-r--r-- | cmd/btrfs-dbg/main.go | 71 |
1 files changed, 4 insertions, 67 deletions
diff --git a/cmd/btrfs-dbg/main.go b/cmd/btrfs-dbg/main.go index 0990378..3d2103a 100644 --- a/cmd/btrfs-dbg/main.go +++ b/cmd/btrfs-dbg/main.go @@ -6,7 +6,7 @@ import ( "github.com/davecgh/go-spew/spew" - "lukeshu.com/btrfs-tools/pkg/binstruct" + "lukeshu.com/btrfs-tools/pkg/btrfs" ) func main() { @@ -27,7 +27,7 @@ func Main(imgfilename string) (err error) { if err != nil { return err } - img := &Img{ + img := &btrfs.Img{ File: fh, } defer func() { @@ -42,8 +42,8 @@ func Main(imgfilename string) (err error) { spew := spew.NewDefaultConfig() spew.DisablePointerAddresses = true - spew.Dump(superblocks[0].data) - sum, err := superblocks[0].data.CalculateChecksum() + spew.Dump(superblocks[0].Data) + sum, err := superblocks[0].Data.CalculateChecksum() if err != nil { return err } @@ -51,66 +51,3 @@ func Main(imgfilename string) (err error) { return nil } - -type Img struct { - *os.File -} - -func (img *Img) Size() (int64, error) { - fi, err := img.Stat() - if err != nil { - return 0, err - } - return fi.Size(), nil -} - -type Ref[T any] struct { - img *Img - addr int64 - data T -} - -func (r *Ref[T]) Read() error { - size, err := binstruct.Size(r.data) - if err != nil { - return err - } - buf := make([]byte, size) - if _, err := r.img.ReadAt(buf, r.addr); err != nil { - return err - } - return binstruct.Unmarshal(buf, &r.data) -} - -func (img *Img) Superblocks() ([]Ref[Superblock], error) { - const superblockSize = 0x1000 - - var superblockAddrs = []int64{ - 0x00_0001_0000, // 64KiB - 0x00_0400_0000, // 64MiB - 0x40_0000_0000, // 256GiB - } - - sz, err := img.Size() - if err != nil { - return nil, err - } - - var ret []Ref[Superblock] - for i, addr := range superblockAddrs { - if addr+superblockSize <= sz { - superblock := Ref[Superblock]{ - img: img, - addr: addr, - } - if err := superblock.Read(); err != nil { - return nil, fmt.Errorf("superblock %d: %w", i, err) - } - ret = append(ret, superblock) - } - } - if len(ret) == 0 { - return nil, fmt.Errorf("no superblocks") - } - return ret, nil -} |