Table printing changed. directory parsing corrected.
[fsck.sofs09.git] / test_inused.c
blobaf2d9915b772f80b2b33cfec5b22a83d30965ed2
1 #include <stdio.h>
3 #include "fsck.h"
4 #include "fsck_helper.h"
5 #include "sofs09.h"
7 static bool parse_directory(uint32_t inodeidx)
9 bool ret;
10 uint32_t fret;
11 uint32_t den, den_max, den_mod;
12 SOInode inode, newinode;
13 SODirEntry dec[DPC]; /* direntry cluster */
14 ic_t icstat;
15 SOSuperBlock *sb;
17 fetch_superblock(&sb);
19 ret = true;
21 fret = soReadInode(&inode, inodeidx);
22 if (fret < 0) FABORT(fret, "parse_directory");
24 if ((inode.size % sizeof(SODirEntry)) != 0) {
25 printf("Inode %d is a directory but its size is not multiple of "
26 "sizeof(SODirEntry).\n", inodeidx);
27 return false;
30 den_max = inode.size/sizeof(SODirEntry);
31 for (den = 0; den < den_max; ++den) {
32 /* read a new cluster when necessary */
33 den_mod = den%DPC;
34 if (den_mod == 0) {
35 fret = soReadFileCluster(inodeidx, den/DPC, dec);
36 if (fret < 0) FABORT(fret, "parse_directory");
38 /* process direntry */
39 if (dec[den_mod].name[0] != '\0') {
40 /* check validity of inode address */
41 if (dec[den_mod].inode >= sb->itotal) {
42 printf("Direntry number %d of inode %d is pointing to %d, "
43 "which lies outside inode table.\n", den,
44 inodeidx, dec[den_mod].inode);
45 return false;
48 fret = soReadInode(&newinode, dec[den_mod].inode);
49 if (fret < 0) FABORT(fret, "parse_directory");
51 /* update tables */
52 irtable_inc(dec[den_mod].inode);
53 ictable_get(dec[den_mod].inode, &icstat);
54 switch (icstat) {
55 case bah:
56 ictable_set(dec[den_mod].inode, busy);
57 break;
58 case idle:
59 printf ("Inode %d is marked as free but is in use.\n",
60 dec[den_mod].inode);
61 break;
62 case busy:
63 /* already parsed this inode */
64 break;
65 default:
66 printf("BUM! ictable has something strange in it.\n");
67 return false;
68 break;
71 /* don't parse direntries pointing to non directories, inodes
72 * already parsed or this inode
74 if (((newinode.mode & INODE_DIR) == INODE_DIR) &&
75 (icstat != busy) &&
76 (dec[den_mod].inode != inodeidx))
78 ret = parse_directory(dec[den_mod].inode);
84 return ret;
87 testresult_t test_inused(void)
89 testresult_t ret;
91 ret = nice;
93 /* begin in root directory */
94 if (parse_directory(0) == false) {
95 ret = corrupt;
98 return ret;