3 which debugreiserfs >/dev/null 2>&1 && debugreiserfs $device >/dev/null 2>&1
17 echo "fstype reiserfs"
19 # Step 6: Get filesystem blocksize and convert sector number to filesystem block number
21 blocksize="`debugreiserfs $device 2>/dev/null | awk '/^Blocksize:/{print $2/512}'`"
23 if [ -z "$blocksize" ]; then
24 echo "! $device is not reiserfs" 1>&2
28 block="`dc -e "$sector $blocksize ~ n [ ] n p"`" #`"
29 subsector="${block% *}"
32 echo "blocksize $blocksize"
34 echo "subsector $subsector"
36 # Step 7: Check, whether block is in use
38 if debugreiserfs -1 $block $device 2>&1 >/dev/null | grep -qF "free in ondisk bitmap"; then
39 echo "blockstate free"
42 echo "blockstate used"
44 # Use debugreiserfs -1 to check the block type. This however only works if the block is readable.
45 type="`debugreiserfs -1 $block $device 2>/dev/null | sed -e '/^=*$/d' | head -1`"
48 "Looks like unformatted") type="data" ;;
49 "Reiserfs super block"*) type="superblock" ;;
50 "LEAF NODE"*) type="meta" ;;
51 "INTERNAL NODE"*) type="meta" ;;
52 "Desc block"*) type="journal" ;;
56 if [ -n "$type" ]; then
57 echo "blocktype $type"
60 # Step 8: Find object id to which this block belongs
61 # Step 9: Find file name(s) referencing this object id
63 # Currently we only look for $block in indirect blocks.
65 python - $device $block <<EOF
71 blocknr = int(sys.argv[2])
76 fp = os.popen("debugreiserfs -d %s 2>/dev/null" % device)
81 #sys.stderr.write("> leafnode(1): %s\n" % repr(l))
82 if not l.startswith("LEAF NODE") : return
83 for i in range(4) : fp.readline()
86 #sys.stderr.write("> leafnode(2): %s\n" % repr(l))
88 if len(parts)<2 : return
89 parts = parts[2].split()
90 if len(parts)<4 : return
91 obid=(int(parts[0]),int(parts[1]))
92 if parts[3] == "DIR" : parse_dir(obid)
93 elif parts[3] == "IND" : parse_indirect(obid)
96 l = fp.readline().strip()
97 #sys.stderr.write("> leafnode(3): %s\n" % repr(l))
98 if l == 79*"-" or l == 67*"=" : break
106 l = fp.readline().rstrip()
107 #sys.stderr.write("> dir: %s\n" % repr(l))
108 if l == 79*"-" or l == 67*"=": return
109 if l.endswith("not set"): continue
111 name = l[6:6+int(l[i+2:i+5])]
112 if name == "." or name == ".." : continue
113 i = l.index("[",len(name)+12)
114 entryid = tuple(map(int,l[i+1:l.index("]",i+1)].split()))
115 entry = dirtree.get(entryid)
116 if entry is None : entry = dirtree[entryid] = set()
117 entry.add((name,obid))
121 def parse_indirect(obid):
126 for pointer in fp.readline().strip()[1:-1].split():
127 i = pointer.find("(")
129 blkmin = blkmax = int(pointer)
131 blkmin = int(pointer[:i])
132 blkmax = blkmin+int(pointer[i+1:-1])-1
133 if blocknr >= blkmin and blocknr <= blkmax:
139 entry = dirtree.get(id)
140 #sys.stderr.write("> scan_path: %s->%s\n" % (id, entry))
145 for name, parent in entry:
146 for path in scan_path(parent):
147 rv.append(os.path.join(path,name))
155 #sys.stderr.write("> parse: %s\n" % repr(l))
157 if l.strip() == 67*"=" : break
165 sys.stdout.write("objectid %d %d\n" % blockid)
167 for path in scan_path(blockid):
169 sys.stdout.write("name %s\n" % path)
174 register_scanner "reiserfs"