|
|
1.1 ! root 1: /* ! 2: * check -- check all of the normally-used filesystems ! 3: * or those specified by calling `icheck' and `dcheck'. ! 4: * If `-s' is specified, also try to correct any ! 5: * problems encountered in any of these filesystems. ! 6: */ ! 7: ! 8: /* ! 9: ! 10: return '-2' (254) if an internal error occurred; '-1' (255) if ! 11: there are unfixed errors; '0' if no errors were found; and '1' ! 12: if errors were found, but fixed (system should then be rebooted). ! 13: ! 14: */ ! 15: ! 16: #include <stdio.h> ! 17: #include "check.h" ! 18: ! 19: char icheck[] = "/bin/icheck"; ! 20: char dcheck[] = "/bin/dcheck"; ! 21: char fixopt[] = "-s"; ! 22: ! 23: int sflag; ! 24: ! 25: main(argc, argv) ! 26: char *argv[]; ! 27: { ! 28: register estat = 0; ! 29: register char **fsp; ! 30: ! 31: if (argc>1 && *argv[1]=='-') { ! 32: if (argv[1][1]=='s' && argv[1][2]=='\0') ! 33: sflag = 1; ! 34: else ! 35: usage(); ! 36: argv++; ! 37: argc--; ! 38: } ! 39: if (argc > 1) ! 40: fsp = &argv[1]; ! 41: else ! 42: usage(); ! 43: while (*fsp != NULL) ! 44: estat |= check(*fsp++); ! 45: exit(estat); ! 46: } ! 47: ! 48: /* ! 49: * Do check for a single filesystem. ! 50: */ ! 51: check(fs) ! 52: char *fs; ! 53: { ! 54: register int ierror, derror; ! 55: register int bad = 0; ! 56: ! 57: if (ierror = run(icheck, fs, NULL)) ! 58: bad |= 1; ! 59: if (derror = run(dcheck, fs, NULL)) ! 60: bad |= 1; ! 61: if (sflag) { ! 62: if ((ierror & ~IC_FIX) == 0) { ! 63: if (derror & ~DC_FIX) ! 64: return(-1); ! 65: if (derror & DC_FIX) { ! 66: if (derror = run(dcheck, fixopt, fs, NULL)) ! 67: return(-1); ! 68: ierror = IC_MISS; /*force fixup icheck*/ ! 69: } ! 70: if (ierror & IC_FIX) ! 71: if (ierror = run(icheck, fixopt, fs, NULL)) ! 72: return(-1); ! 73: } else ! 74: return(-1); ! 75: } ! 76: return (bad); ! 77: } ! 78: ! 79: /* ! 80: * Do a command -- either icheck or dcheck normally. ! 81: */ ! 82: /* VARARGS */ ! 83: run(command, args) ! 84: char *command; ! 85: { ! 86: register int pid; ! 87: int status; ! 88: ! 89: if ((pid = fork()) < 0) { ! 90: fprintf(stderr, "check: try again\n"); ! 91: exit(-2); ! 92: } ! 93: if (pid) { ! 94: wait(&status); ! 95: if ((status&0377) != 0) ! 96: return(-2); ! 97: return ((status>>8)&0377); ! 98: } else { ! 99: execv(command, &command); ! 100: fprintf(stderr, "check: someone moved %s\n", command); ! 101: exit(-2); ! 102: } ! 103: /* NOTREACHED */ ! 104: } ! 105: ! 106: usage() ! 107: { ! 108: fprintf(stderr, "Usage: check [-s] filesystem [ ... ]\n"); ! 109: exit(-2); ! 110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.