diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-06-05 15:43:41 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-06-05 15:43:41 -0600 |
commit | abfd61441c4b36d6e01e589e03cadaa74fa2febf (patch) | |
tree | 44bb4061f2cdf06df85a1d7348a158d4a815c7d8 /pkg/btrfs/btrfsitem/items.go | |
parent | b4938aba1d890721cb6b2123fad9d81dfd156180 (diff) |
handle untyped items
Diffstat (limited to 'pkg/btrfs/btrfsitem/items.go')
-rw-r--r-- | pkg/btrfs/btrfsitem/items.go | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/pkg/btrfs/btrfsitem/items.go b/pkg/btrfs/btrfsitem/items.go index 3c4392e..c4ad7e9 100644 --- a/pkg/btrfs/btrfsitem/items.go +++ b/pkg/btrfs/btrfsitem/items.go @@ -31,12 +31,26 @@ func (o *Error) UnmarshalBinary(dat []byte) (int, error) { } // Rather than returning a separate error value, return an Error item. -func UnmarshalItem(keytyp Type, dat []byte) Item { - gotyp, ok := keytype2gotype[keytyp] - if !ok { - return Error{ - Dat: dat, - Err: fmt.Errorf("btrfsitem.UnmarshalItem(typ=%v, dat): unknown item type", keytyp), +func UnmarshalItem(key internal.Key, dat []byte) Item { + var gotyp reflect.Type + if key.ItemType == UNTYPED_KEY { + var ok bool + gotyp, ok = untypedObjID2gotype[key.ObjectID] + if !ok { + return Error{ + Dat: dat, + Err: fmt.Errorf("btrfsitem.UnmarshalItem({ItemType:%v, ObjectID:%v}, dat): unknown object ID for untyped item", + key.ItemType, key.ObjectID), + } + } + } else { + var ok bool + gotyp, ok = keytype2gotype[key.ItemType] + if !ok { + return Error{ + Dat: dat, + Err: fmt.Errorf("btrfsitem.UnmarshalItem({ItemType:%v}, dat): unknown item type", key.ItemType), + } } } retPtr := reflect.New(gotyp) @@ -44,15 +58,15 @@ func UnmarshalItem(keytyp Type, dat []byte) Item { if err != nil { return Error{ Dat: dat, - Err: fmt.Errorf("btrfsitem.UnmarshalItem(typ=%v, dat): %w", keytyp, err), + Err: fmt.Errorf("btrfsitem.UnmarshalItem({ItemType:%v}, dat): %w", key.ItemType, err), } } if n < len(dat) { return Error{ Dat: dat, - Err: fmt.Errorf("btrfsitem.UnmarshalItem(typ=%v, dat): left over data: got %d bytes but only consumed %d", - keytyp, len(dat), n), + Err: fmt.Errorf("btrfsitem.UnmarshalItem({ItemType:%v}, dat): left over data: got %d bytes but only consumed %d", + key.ItemType, len(dat), n), } } return retPtr.Elem().Interface().(Item) |