3 which debugreiserfs >/dev/null 2>&1 && debugreiserfs $device >/dev/null 2>&1
17 echo "# $device: reiserfs filesystem detected" 1>&2
19 echo "fstype reiserfs"
21 # Step 6: Get filesystem blocksize and convert sector number to filesystem block number
23 blocksize="`debugreiserfs $device 2>/dev/null | awk '/^Blocksize:/{print $2/512}'`"
25 if [ -z "$blocksize" ]; then
26 echo "! $device is not reiserfs" 1>&2
30 block="`dc -e "$sector $blocksize ~ n [ ] n p"`" #`"
31 subsector="${block% *}"
34 echo "blocksize $blocksize"
36 echo "subsector $subsector"
38 # Step 7: Check, whether block is in use
40 if debugreiserfs -1 $block $device 2>&1 >/dev/null | grep -qF "free in ondisk bitmap"; then
41 echo "blockstate free"
44 echo "blockstate used"
46 # Use debugreiserfs -1 to check the block type. This however only works if the block is readable.
47 type="`debugreiserfs -1 $block $device 2>/dev/null | sed -e '/^=*$/d' | head -1`"
50 "Looks like unformatted") type="data" ;;
51 "Reiserfs super block"*) type="superblock" ;;
52 "LEAF NODE"*) type="meta" ;;
53 "INTERNAL NODE"*) type="meta" ;;
54 "Desc block"*) type="journal" ;;
58 if [ -n "$type" ]; then
59 echo "blocktype $type"
62 # Step 8: Find object id to which this block belongs
63 # Step 9: Find file name(s) referencing this object id
65 # Currently we only look for $block in indirect blocks.
67 python - $device $block <<EOF
73 blocknr = int(sys.argv[2])
78 fp = os.popen("debugreiserfs -d %s 2>/dev/null" % device)
83 #sys.stderr.write("> leafnode(1): %s\n" % repr(l))
84 if not l.startswith("LEAF NODE") : return
85 for i in range(4) : fp.readline()
88 #sys.stderr.write("> leafnode(2): %s\n" % repr(l))
90 if len(parts)<2 : return
91 parts = parts[2].split()
92 if len(parts)<4 : return
93 obid=(int(parts[0]),int(parts[1]))
94 if parts[3] == "DIR" : parse_dir(obid)
95 elif parts[3] == "IND" : parse_indirect(obid)
98 l = fp.readline().strip()
99 #sys.stderr.write("> leafnode(3): %s\n" % repr(l))
100 if l == 79*"-" or l == 67*"=" : break
108 l = fp.readline().rstrip()
109 #sys.stderr.write("> dir: %s\n" % repr(l))
110 if l == 79*"-" or l == 67*"=": return
111 if l.endswith("not set"): continue
113 name = l[6:6+int(l[i+2:i+5])]
114 if name == "." or name == ".." : continue
115 i = l.index("[",len(name)+12)
116 entryid = tuple(map(int,l[i+1:l.index("]",i+1)].split()))
117 entry = dirtree.get(entryid)
118 if entry is None : entry = dirtree[entryid] = set()
119 entry.add((name,obid))
123 def parse_indirect(obid):
128 for pointer in fp.readline().strip()[1:-1].split():
129 i = pointer.find("(")
131 blkmin = blkmax = int(pointer)
133 blkmin = int(pointer[:i])
134 blkmax = blkmin+int(pointer[i+1:-1])-1
135 if blocknr >= blkmin and blocknr <= blkmax:
141 entry = dirtree.get(id)
142 #sys.stderr.write("> scan_path: %s->%s\n" % (id, entry))
147 for name, parent in entry:
148 for path in scan_path(parent):
149 rv.append(os.path.join(path,name))
157 #sys.stderr.write("> parse: %s\n" % repr(l))
159 if l.strip() == 67*"=" : break
167 sys.stdout.write("objectid %d %d\n" % blockid)
169 for path in scan_path(blockid):
171 sys.stdout.write("name %s\n" % path)
177 register_scanner "reiserfs"