From 48019a4884b8936424a74c0a53798494c5c0cfc1 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 2 Jul 2022 22:50:02 -0600 Subject: better --- cmd/btrfs-ls-files/main.go | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) (limited to 'cmd') diff --git a/cmd/btrfs-ls-files/main.go b/cmd/btrfs-ls-files/main.go index 9f5b85d..22eefcb 100644 --- a/cmd/btrfs-ls-files/main.go +++ b/cmd/btrfs-ls-files/main.go @@ -86,7 +86,9 @@ func printDir(fs *btrfs.FS, fsTree btrfsvol.LogicalAddr, prefix0, prefix1, dirNa switch item.Head.Key.ItemType { case btrfsitem.INODE_ITEM_KEY: if dirInodeDatOK { - errs = append(errs, fmt.Errorf("read dir: multiple inodes")) + if !reflect.DeepEqual(dirInodeDat, item.Body.(btrfsitem.Inode)) { + errs = append(errs, fmt.Errorf("read dir: multiple inodes")) + } continue } dirInodeDat = item.Body.(btrfsitem.Inode) @@ -96,7 +98,7 @@ func printDir(fs *btrfs.FS, fsTree btrfsvol.LogicalAddr, prefix0, prefix1, dirNa case btrfsitem.DIR_ITEM_KEY: body := item.Body.(btrfsitem.DirEntries) if len(body) != 1 { - errs = append(errs, fmt.Errorf("read dir: multiple direntries in single dir_item?")) + errs = append(errs, fmt.Errorf("read dir: multiple direntries in single DIR_ITEM?")) continue } for _, entry := range body { @@ -107,24 +109,38 @@ func printDir(fs *btrfs.FS, fsTree btrfsvol.LogicalAddr, prefix0, prefix1, dirNa continue } if other, exists := membersByNameHash[namehash]; exists { - errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry crc32c(%q|%q)=%#x", - other.Name, entry.Name, namehash)) + if !reflect.DeepEqual(entry, other) { + if string(entry.Name) == string(other.Name) { + errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry crc32c(%q)=%#x", + entry.Name, namehash)) + } else { + errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry crc32c(%q|%q)=%#x", + other.Name, entry.Name, namehash)) + } + } continue } membersByNameHash[btrfsitem.NameHash(entry.Name)] = entry } case btrfsitem.DIR_INDEX_KEY: - for i, entry := range item.Body.(btrfsitem.DirEntries) { - index := item.Head.Key.Offset + uint64(i) - if _, exists := membersByIndex[index]; exists { - errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry index %v", index)) + index := item.Head.Key.Offset + body := item.Body.(btrfsitem.DirEntries) + if len(body) != 1 { + errs = append(errs, fmt.Errorf("read dir: multiple direntries in single DIR_INDEX?")) + continue + } + for _, entry := range body { + if other, exists := membersByIndex[index]; exists { + if !reflect.DeepEqual(entry, other) { + errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry index %v", index)) + } continue } membersByIndex[index] = entry } //case btrfsitem.XATTR_ITEM_KEY: default: - panic(fmt.Errorf("TODO: handle item type %v", item.Head.Key.ItemType)) + errs = append(errs, fmt.Errorf("TODO: handle item type %v", item.Head.Key.ItemType)) } } fmt.Printf("%s%q\t[ino=%d", -- cgit v1.2.3-2-g168b