|
|
1.1 ! root 1: /* ! 2: * fsck -- File System Check Program ! 3: * an interactive file system check and repair program. ! 4: * ! 5: * Usage: ! 6: * /etc/fsck [-y] [-n] [-q] [-f] [-{sS}] [-t TMPFILE] [filesystem ...] ! 7: * audit and interactively repair inconsistent conditions for ! 8: * file systems. Options -y and -n indicate an assumed response ! 9: * to all questions asked by fsck. Default is to prompt operator ! 10: * for yes/no response. Option -q is to quiet fsck from printing ! 11: * certain messages, i.e. no size check messages, unreferenced ! 12: * pipes will be silently removed, and counts in the superblock ! 13: * will be automatically fixed and free list salvaged, if necessary. ! 14: * Option -f is for a 'fast' check of the file system, i.e. only ! 15: * check blocks, sizes, superblock counts, and the free list. ! 16: * (-f) does not check pathnames, connectivity, or reference ! 17: * counts. Option -s forces the reconstruction (or salvaging) of ! 18: * both the free inode list and the free block list, even if there ! 19: * are no file system problems. This will reorder the free block ! 20: * list in the best order to limit additional fragmentation (respecting ! 21: * interleaving as well). Note: Option -s will be ignored on mounted ! 22: * file systems. The option -S acts in the same manner as -s except ! 23: * that it will not be ignored on mounted file systems. Beware: -S ! 24: * on mounted file systems should only be used if you intend to reboot ! 25: * NO SYNC immediately afterwards. Option -t sets the temporary file ! 26: * to use for disk caching of necessary tables on filesystems which are ! 27: * too big to do in core. The temporary file defaults to "/dev/rram1", ! 28: * which must be there. ! 29: */ ! 30: ! 31: #include "fsck.h" ! 32: ! 33: int errflag; ! 34: ! 35: int mdaction; /* default action for invocation */ ! 36: int daction; /* default action for file system */ ! 37: int gSflag=FALSE; /* force salvage flag ignored mounted */ ! 38: int gsflag=FALSE; /* force salvage flag ignored mounted */ ! 39: int sflag=FALSE; /* force salvage flag */ ! 40: int qflag=FALSE; /* fsck quiet flag */ ! 41: int fflag=FALSE; /* fsck fast flag */ ! 42: ! 43: char *tmpfile = NULL; /* TMP file for virtual.c */ ! 44: char *checklistfile = "/etc/checklist"; /* default file for list of file */ ! 45: /* systems to fsck. */ ! 46: char *filelist[NFILSYS]; /* list of filesystems */ ! 47: char word[MAXCH]; /* hold single words */ ! 48: char *fsname; /* file system name */ ! 49: ! 50: dev_t rootdev; /* root device number */ ! 51: dev_t fsysrdev; /* file system real device number */ ! 52: int mounted; /* flag for mounted file system */ ! 53: ! 54: int changeflg; /* file system modified flag */ ! 55: ! 56: main(argc, argv) ! 57: char *argv[]; ! 58: { ! 59: int yflag=0, nflag=0; ! 60: int retval; ! 61: ! 62: while (argc>1 && *argv[1]=='-') { ! 63: switch (argv[1][1]) { ! 64: case 'q': ! 65: qflag = TRUE; ! 66: break; ! 67: case 'y': ! 68: yflag = 1; ! 69: break; ! 70: case 'n': ! 71: nflag = 1; ! 72: break; ! 73: case 'f': ! 74: fflag = TRUE; ! 75: break; ! 76: case 'S': ! 77: gSflag = TRUE; ! 78: break; ! 79: case 's': ! 80: gsflag = TRUE; ! 81: break; ! 82: case 't': ! 83: tmpfile = argv[2]; ! 84: argc--; ! 85: argv++; ! 86: break; ! 87: default: ! 88: usage(); ! 89: break; ! 90: } ! 91: ! 92: argc--; ! 93: argv++; ! 94: } ! 95: ! 96: if ( yflag+nflag > 1 ) ! 97: usage(); ! 98: ! 99: mdaction = ( yflag ? YES : ! 100: nflag ? NO : ASK ); ! 101: ! 102: if ( argc > 1 ) ! 103: retval = allfsck(argv+1); ! 104: else { ! 105: getlist(); ! 106: retval = allfsck(filelist); ! 107: } ! 108: exit(retval); ! 109: } ! 110: ! 111: ! 112: /* ! 113: * perform fsck on each of the individual filesystem in list ! 114: */ ! 115: ! 116: allfsck(fsl) ! 117: register char **fsl; ! 118: { ! 119: int fatal(); ! 120: int retval = 0; ! 121: ! 122: sync(); ! 123: statit("/", fatal); ! 124: rootdev = stats.st_dev; ! 125: while (*fsl != NULL) ! 126: retval |= fsck(*fsl++); ! 127: return(retval); ! 128: } ! 129: ! 130: /* ! 131: * get the names of the filesystems from the default file ! 132: * checklistfile (e.g. /etc/checklist) ! 133: */ ! 134: ! 135: getlist() ! 136: { ! 137: int fd; ! 138: int index, size; ! 139: ! 140: if ( (fd = open(checklistfile, 0)) == (-1) ) ! 141: fatal("Can't open checklist file: %s", checklistfile); ! 142: ! 143: index = 0; ! 144: while ( ((size = getword(fd)) != 0) && (index < NFILSYS) ) { ! 145: filelist[index] = malloc( size ); ! 146: strcpy(filelist[index++], word); ! 147: } ! 148: ! 149: if (size != 0) ! 150: fatal("Too many file systems in checklist file: %s", ! 151: checklistfile); ! 152: ! 153: filelist[index] = NULL; ! 154: ! 155: close(fd); ! 156: } ! 157: ! 158: /* ! 159: * read in the next "word" from file with descriptor fd ! 160: * return the length of the word. ! 161: */ ! 162: ! 163: getword(fd) ! 164: int fd; ! 165: { ! 166: int n = 0, num; ! 167: char *cp = word; ! 168: char ch; ! 169: ! 170: while ( ( (num=read(fd, &ch, 1)) == 1 ) && ! 171: ( (ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r') ) ); ! 172: ! 173: if (num != 1) ! 174: return(0); ! 175: ! 176: do { ! 177: *cp++ = ch; ! 178: } while ( (++n < MAXCH) && (read(fd, &ch, 1) == 1) && ! 179: (ch != ' ') && (ch != '\t') && (ch != '\n') && (ch != '\r') ); ! 180: ! 181: *cp = '\0'; ! 182: ! 183: return(n+1); ! 184: } ! 185: ! 186: /* ! 187: * perform fsck on the given filesystem ! 188: */ ! 189: fsck(name) ! 190: char *name; ! 191: { ! 192: int retval = 1; ! 193: int nonfatal(); ! 194: ! 195: fsname = name; /* file system name */ ! 196: errflag = FALSE; ! 197: statit(fsname, nonfatal); ! 198: fsysrdev = stats.st_rdev; ! 199: if ( errflag ) ! 200: return(retval); ! 201: changeflg = FALSE; ! 202: init(); ! 203: if ( sflag = ((gsflag && !mounted) || gSflag) ) ! 204: printf("Switch \"-s\" selected to automatically rebuild free lists\n"); ! 205: if (!sflag && gsflag) ! 206: printf("Ignoring \"-s\" on mounted file system\n"); ! 207: if ( !errflag ) { ! 208: phase1(); /* check blocks and sizes */ ! 209: if ( !fflag ) { ! 210: phase2(); /* check pathnames */ ! 211: phase3(); /* check connectivity */ ! 212: phase4(); /* check reference counts */ ! 213: } ! 214: phase5(); /* check free list */ ! 215: phase6(); /* salvage free list */ ! 216: retval = cleanup(); ! 217: } ! 218: return(retval); ! 219: } ! 220: ! 221: usage() ! 222: { ! 223: printf("\ ! 224: Usage: /etc/fsck [-y] [-n] [-q] [-f] [-{sS}] [-t TMPFILE] [filesystem ...]\n"); ! 225: _exit(1); ! 226: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.