summaryrefslogtreecommitdiff
path: root/cmd/btrfs-dbg/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/btrfs-dbg/main.go')
-rw-r--r--cmd/btrfs-dbg/main.go71
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
-}