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