|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980, 1986 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted provided ! 6: * that: (1) source distributions retain this entire copyright notice and ! 7: * comment, and (2) distributions including binaries display the following ! 8: * acknowledgement: ``This product includes software developed by the ! 9: * University of California, Berkeley and its contributors'' in the ! 10: * documentation or other materials provided with the distribution and in ! 11: * all advertising materials mentioning features or use of this software. ! 12: * Neither the name of the University nor the names of its contributors may ! 13: * be used to endorse or promote products derived from this software without ! 14: * specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: char copyright[] = ! 22: "@(#) Copyright (c) 1980, 1986 The Regents of the University of California.\n\ ! 23: All rights reserved.\n"; ! 24: #endif /* not lint */ ! 25: ! 26: #ifndef lint ! 27: static char sccsid[] = "@(#)main.c 5.26 (Berkeley) 7/20/90"; ! 28: #endif /* not lint */ ! 29: ! 30: #include <sys/param.h> ! 31: #include <ufs/dinode.h> ! 32: #include <ufs/fs.h> ! 33: #include <fstab.h> ! 34: #include <stdlib.h> ! 35: #include <string.h> ! 36: #include <ctype.h> ! 37: #include <stdio.h> ! 38: #include "fsck.h" ! 39: ! 40: void catch(), catchquit(), voidquit(); ! 41: int returntosingle; ! 42: ! 43: main(argc, argv) ! 44: int argc; ! 45: char *argv[]; ! 46: { ! 47: int ch; ! 48: int ret, maxrun = 0; ! 49: extern int docheck(), checkfilesys(); ! 50: extern char *optarg; ! 51: extern int optind; ! 52: ! 53: sync(); ! 54: while ((ch = getopt(argc, argv, "cdpnNyYb:l:m:")) != EOF) { ! 55: switch (ch) { ! 56: case 'p': ! 57: preen++; ! 58: break; ! 59: ! 60: case 'b': ! 61: bflag = argtoi('b', "number", optarg, 10); ! 62: printf("Alternate super block location: %d\n", bflag); ! 63: break; ! 64: ! 65: case 'c': ! 66: cvtflag++; ! 67: break; ! 68: ! 69: case 'd': ! 70: debug++; ! 71: break; ! 72: ! 73: case 'l': ! 74: maxrun = argtoi('l', "number", optarg, 10); ! 75: break; ! 76: ! 77: case 'm': ! 78: lfmode = argtoi('m', "mode", optarg, 8); ! 79: if (lfmode &~ 07777) ! 80: errexit("bad mode to -m: %o\n", lfmode); ! 81: printf("** lost+found creation mode %o\n", lfmode); ! 82: break; ! 83: ! 84: case 'n': ! 85: case 'N': ! 86: nflag++; ! 87: yflag = 0; ! 88: break; ! 89: ! 90: case 'y': ! 91: case 'Y': ! 92: yflag++; ! 93: nflag = 0; ! 94: break; ! 95: ! 96: default: ! 97: errexit("%c option?\n", ch); ! 98: } ! 99: } ! 100: argc -= optind; ! 101: argv += optind; ! 102: if (signal(SIGINT, SIG_IGN) != SIG_IGN) ! 103: (void)signal(SIGINT, catch); ! 104: if (preen) ! 105: (void)signal(SIGQUIT, catchquit); ! 106: if (argc) { ! 107: while (argc-- > 0) ! 108: (void)checkfilesys(*argv++, (char *)0, 0L); ! 109: exit(0); ! 110: } ! 111: ret = checkfstab(preen, maxrun, docheck, checkfilesys); ! 112: if (returntosingle) ! 113: exit(2); ! 114: exit(ret); ! 115: } ! 116: ! 117: argtoi(flag, req, str, base) ! 118: int flag; ! 119: char *req, *str; ! 120: int base; ! 121: { ! 122: char *cp; ! 123: int ret; ! 124: ! 125: ret = (int)strtol(str, &cp, base); ! 126: if (cp == str || *cp) ! 127: errexit("-%c flag requires a %s\n", flag, req); ! 128: return (ret); ! 129: } ! 130: ! 131: /* ! 132: * Determine whether a filesystem should be checked. ! 133: */ ! 134: docheck(fsp) ! 135: register struct fstab *fsp; ! 136: { ! 137: ! 138: if (strcmp(fsp->fs_vfstype, "ufs") || ! 139: (strcmp(fsp->fs_type, FSTAB_RW) && ! 140: strcmp(fsp->fs_type, FSTAB_RO)) || ! 141: fsp->fs_passno == 0) ! 142: return (0); ! 143: return (1); ! 144: } ! 145: ! 146: /* ! 147: * Check the specified filesystem. ! 148: */ ! 149: /* ARGSUSED */ ! 150: checkfilesys(filesys, mntpt, auxdata) ! 151: char *filesys, *mntpt; ! 152: long auxdata; ! 153: { ! 154: daddr_t n_ffree, n_bfree; ! 155: struct dups *dp; ! 156: struct zlncnt *zlnp; ! 157: ! 158: (void)signal(SIGQUIT, voidquit); ! 159: devname = filesys; ! 160: if (debug && preen) ! 161: pwarn("starting\n"); ! 162: if (setup(filesys) == 0) { ! 163: if (preen) ! 164: pfatal("CAN'T CHECK FILE SYSTEM."); ! 165: return (0); ! 166: } ! 167: /* ! 168: * 1: scan inodes tallying blocks used ! 169: */ ! 170: if (preen == 0) { ! 171: printf("** Last Mounted on %s\n", sblock.fs_fsmnt); ! 172: if (hotroot) ! 173: printf("** Root file system\n"); ! 174: printf("** Phase 1 - Check Blocks and Sizes\n"); ! 175: } ! 176: pass1(); ! 177: ! 178: /* ! 179: * 1b: locate first references to duplicates, if any ! 180: */ ! 181: if (duplist) { ! 182: if (preen) ! 183: pfatal("INTERNAL ERROR: dups with -p"); ! 184: printf("** Phase 1b - Rescan For More DUPS\n"); ! 185: pass1b(); ! 186: } ! 187: ! 188: /* ! 189: * 2: traverse directories from root to mark all connected directories ! 190: */ ! 191: if (preen == 0) ! 192: printf("** Phase 2 - Check Pathnames\n"); ! 193: pass2(); ! 194: ! 195: /* ! 196: * 3: scan inodes looking for disconnected directories ! 197: */ ! 198: if (preen == 0) ! 199: printf("** Phase 3 - Check Connectivity\n"); ! 200: pass3(); ! 201: ! 202: /* ! 203: * 4: scan inodes looking for disconnected files; check reference counts ! 204: */ ! 205: if (preen == 0) ! 206: printf("** Phase 4 - Check Reference Counts\n"); ! 207: pass4(); ! 208: ! 209: /* ! 210: * 5: check and repair resource counts in cylinder groups ! 211: */ ! 212: if (preen == 0) ! 213: printf("** Phase 5 - Check Cyl groups\n"); ! 214: pass5(); ! 215: ! 216: /* ! 217: * print out summary statistics ! 218: */ ! 219: n_ffree = sblock.fs_cstotal.cs_nffree; ! 220: n_bfree = sblock.fs_cstotal.cs_nbfree; ! 221: pwarn("%ld files, %ld used, %ld free ", ! 222: n_files, n_blks, n_ffree + sblock.fs_frag * n_bfree); ! 223: printf("(%ld frags, %ld blocks, %.1f%% fragmentation)\n", ! 224: n_ffree, n_bfree, (float)(n_ffree * 100) / sblock.fs_dsize); ! 225: if (debug && ! 226: (n_files -= maxino - ROOTINO - sblock.fs_cstotal.cs_nifree)) ! 227: printf("%ld files missing\n", n_files); ! 228: if (debug) { ! 229: n_blks += sblock.fs_ncg * ! 230: (cgdmin(&sblock, 0) - cgsblock(&sblock, 0)); ! 231: n_blks += cgsblock(&sblock, 0) - cgbase(&sblock, 0); ! 232: n_blks += howmany(sblock.fs_cssize, sblock.fs_fsize); ! 233: if (n_blks -= maxfsblock - (n_ffree + sblock.fs_frag * n_bfree)) ! 234: printf("%ld blocks missing\n", n_blks); ! 235: if (duplist != NULL) { ! 236: printf("The following duplicate blocks remain:"); ! 237: for (dp = duplist; dp; dp = dp->next) ! 238: printf(" %ld,", dp->dup); ! 239: printf("\n"); ! 240: } ! 241: if (zlnhead != NULL) { ! 242: printf("The following zero link count inodes remain:"); ! 243: for (zlnp = zlnhead; zlnp; zlnp = zlnp->next) ! 244: printf(" %lu,", zlnp->zlncnt); ! 245: printf("\n"); ! 246: } ! 247: } ! 248: zlnhead = (struct zlncnt *)0; ! 249: duplist = (struct dups *)0; ! 250: inocleanup(); ! 251: if (fsmodified) { ! 252: (void)time(&sblock.fs_time); ! 253: sbdirty(); ! 254: } ! 255: ckfini(); ! 256: free(blockmap); ! 257: free(statemap); ! 258: free((char *)lncntp); ! 259: if (!fsmodified) ! 260: return (0); ! 261: if (!preen) { ! 262: printf("\n***** FILE SYSTEM WAS MODIFIED *****\n"); ! 263: if (hotroot) ! 264: printf("\n***** REBOOT UNIX *****\n"); ! 265: } ! 266: if (hotroot) { ! 267: sync(); ! 268: return (4); ! 269: } ! 270: return (0); ! 271: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.