Fix/finish modularization
[mapsector.git] / lib / 50_scan_extfs.sh
1 detect_extfs()
2 {
3     which tune2fs >/dev/null 2>&1 && tune2fs -l $device >/dev/null 2>&1
4 }
5
6 describe_extfs()
7 {
8     echo "    ext2-4"
9 }
10
11 do_extfs()
12 {
13     local fsblocksize
14     local fsblock
15     local fssubsector
16     local fstype
17     local inode
18
19     echo "$device: ext2-4 filesystem detected" 1>&2
20
21     fstype="`file -s $device | sed -e 's/.*\(ext[0-9]\).*/\1/'`"
22     echo "fstype $fstype"
23
24     # Step 6: Get filesystem blocksize and convert sector number to filesystem block number
25
26     fsblocksize="`tune2fs -l $device | awk '/Block size/{print $3/512}'`"
27
28     if [ -z "$fsblocksize" ]; then
29         echo "! $device is not ext2/ext3" 1>&2
30         exit 1
31     fi
32
33     fsblock="`dc -e "$sector $fsblocksize ~ n [ ] n p"`" #`"
34     fssubsector="${fsblock% *}"
35     fsblock="${fsblock#* }"
36
37     echo "blocksize $fsblocksize"
38     echo "block $fsblock"
39     echo "subsector $fssubsector"
40
41     # Step 7: Check, whether block is in use
42
43     if echo "testb $fsblock" | debugfs $device 2>/dev/null | grep -qF "not in use"; then
44         echo "blockstate free"
45         exit 0
46     fi
47     echo "blockstate used"
48
49     # Step 8: Find inode, to which the block belongs
50
51     inode="`echo "icheck $fsblock" | debugfs $device 2>/dev/null | awk 'FNR>1{print $2}'`" #`"
52
53     if [ -z "$inode" ]; then
54         echo "blocktype meta?"
55         exit 0
56     fi
57
58     echo "inode $inode"
59
60     # Step 9: Find file name(s) referencing the inode
61
62     (
63         namefound="$(\
64             echo "ncheck $inode" \
65                 | debugfs $device 2>/dev/null \
66                 | sed -e '1d' -e 's/^[0-9]*[    ]*//' -e 's/^\/\//\//' \
67                 | while read name; do \
68                 if [ -z "$firstname" ]; then \
69                     echo "blocktype data" 1>&3; \
70                     echo "1"; \
71                     firstname=1; \
72                 fi; \
73                 echo "name $name" 1>&3; \
74             done \
75         )"
76         if [ -z "$namefound" ]; then
77             echo "blocktype journal?"
78         fi
79     ) 3>&1
80
81     return 0
82 }
83
84 register_scanner "extfs"