summaryrefslogtreecommitdiff
path: root/lib/btrfs/btrfsitem/item_inoderef.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-07-14 04:45:48 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-07-14 05:45:45 -0600
commitbb73a2fb7678698353bb995754e8702caa2f6e0a (patch)
tree0ecd149e8ea61db883c7450accfacf42db08b82e /lib/btrfs/btrfsitem/item_inoderef.go
parentae42c45061e6e68ed2cdb455ba45a14c39f7cae7 (diff)
wip ls-files
Diffstat (limited to 'lib/btrfs/btrfsitem/item_inoderef.go')
-rw-r--r--lib/btrfs/btrfsitem/item_inoderef.go36
1 files changed, 34 insertions, 2 deletions
diff --git a/lib/btrfs/btrfsitem/item_inoderef.go b/lib/btrfs/btrfsitem/item_inoderef.go
index b1eaf1b..083f19e 100644
--- a/lib/btrfs/btrfsitem/item_inoderef.go
+++ b/lib/btrfs/btrfsitem/item_inoderef.go
@@ -12,8 +12,40 @@ import (
)
// key.objectid = inode number of the file
-// key.offset = inode number of the parent file
-type InodeRef struct { // INODE_REF=12
+// key.offset = inode number of the parent directory
+//
+// Might have multiple entries if the same file has multiple hardlinks
+// in the same directory.
+type InodeRefs []InodeRef // INODE_REF=12
+
+func (o *InodeRefs) UnmarshalBinary(dat []byte) (int, error) {
+ *o = nil
+ n := 0
+ for n < len(dat) {
+ var ref InodeRef
+ _n, err := binstruct.Unmarshal(dat[n:], &ref)
+ n += _n
+ if err != nil {
+ return n, err
+ }
+ *o = append(*o, ref)
+ }
+ return n, nil
+}
+
+func (o InodeRefs) MarshalBinary() ([]byte, error) {
+ var dat []byte
+ for _, ref := range o {
+ _dat, err := binstruct.Marshal(ref)
+ dat = append(dat, _dat...)
+ if err != nil {
+ return dat, err
+ }
+ }
+ return dat, nil
+}
+
+type InodeRef struct {
Index int64 `bin:"off=0x0, siz=0x8"`
NameLen uint16 `bin:"off=0x8, siz=0x2"` // [ignored-when-writing]
binstruct.End `bin:"off=0xa"`