|
|
1.1 root 1: #include <sys/stat.h>
2: #include <canon.h>
3: #include <sys/filsys.h>
4:
5: /*
6: * Check if a special file is a well-formed filesystem.
7: * This routine is derived from code in "mount.c".
8: * Return values:
9: * -1 Not a device, cannot open, read or seek failed
10: * 0 No filesystem
11: * 1 Legal filesystem
12: */
13: int
14: is_fs(special) char *special;
15: {
16: static struct filsys f;
17: struct stat sbuf;
18: register int fd;
19: register struct filsys *fp;
20: register daddr_t *dp;
21: register ino_t *ip, maxinode;
22:
23: if (stat(special, &sbuf) < 0)
24: return -1; /* cannot stat device */
25: else if ((sbuf.st_mode&S_IFMT) != S_IFBLK
26: && (sbuf.st_mode&S_IFMT) != S_IFCHR)
27: return -1; /* not a special file */
28: else if ((fd = open(special, 2)) < 0)
29: return -1; /* cannot open */
30: else if (lseek(fd, (long)SUPERI*BSIZE, 0) == -1L
31: || read(fd, &f, sizeof(f)) != sizeof(f)) {
32: close(fd);
33: return -1; /* seek or read failed */
34: } else
35: close(fd); /* so far so good */
36:
37: /* Canonical stuff. */
38: fp = &f;
39: canshort(fp->s_isize);
40: candaddr(fp->s_fsize);
41: canshort(fp->s_nfree);
42: for (dp = &fp->s_free[0]; dp < &fp->s_free[NICFREE]; dp += 1)
43: candaddr(*dp);
44: canshort(fp->s_ninode);
45: for (ip = &fp->s_inode[0]; ip < &fp->s_inode[NICINOD]; ip += 1)
46: canino(*ip);
47: candaddr(fp->s_tfree);
48: canino(fp->s_tinode);
49:
50: /* Test for rationality. */
51: maxinode = (fp->s_isize - INODEI) * INOPB + 1;
52: if (fp->s_isize >= fp->s_fsize)
53: return 0;
54: if ((fp->s_tfree < fp->s_nfree)
55: || (fp->s_tfree >= fp->s_fsize - fp->s_isize + 1))
56: return 0;
57: if ((fp->s_tinode < fp->s_ninode) || (fp->s_tinode >= maxinode-1 ))
58: return 0;
59: for (dp = &fp->s_free[0]; dp < &fp->s_free[fp->s_nfree]; dp += 1)
60: if ((*dp < fp->s_isize) || (*dp >= fp->s_fsize))
61: return 0;
62: for (ip = &fp->s_inode[0]; ip < &fp->s_inode[fp->s_ninode]; ip += 1)
63: if ((*ip < 1) || (*ip > maxinode))
64: return 0;
65: return 1;
66: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.