|
|
DataMuseum.dkPresents historical artifacts from the history of: Commodore CBM-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Commodore CBM-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 2980 (0xba4)
Types: TextFile
Notes: UNIX file
Names: »check.bak«
└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
└─⟦2d53db1df⟧ UNIX Filesystem
└─⟦this⟧ »frankh/src/fsck/check.bak«
/*
* check -- check all of the normally-used filesystems
* or those specified by calling `icheck' and `dcheck'.
* If `-s' is specified, also try to correct any
* problems encountered in any of these filesystems.
*/
/*
return '-2' (254) if an internal error occurred; '-1' (255) if
there are unfixed errors; '0' if no errors were found; and '1'
if errors were found, but fixed (system should then be rebooted).
*/
#include <stdio.h>
#include <check.h>
#include <access.h>
char icheck[] = "/bin/icheck";
char dcheck[] = "/bin/dcheck";
char cklist[] = "checklist";
char fixopt[] = "-s";
int sflag;
long lseek();
main(argc, argv)
char *argv[];
{
register estat = 0;
register char **fsp;
int i;
printf("argc = %d\n", argc);
for (i = 0; i < 3; ++i)
printf("argv[%d] = %s\n", i, argv[i]);
if (argc>1 && *argv[1]=='-') {
if (argv[1][1]=='s' && argv[1][2]=='\0')
sflag = 1;
else
usage();
argv++;
argc--;
}
if (argc == 1 && access(cklist, AREAD) == 0)
rlist(argv);
else
usage();
if (argc > 1)
fsp = &argv[1];
else
usage();
while (*fsp != NULL)
estat |= check(*fsp++);
exit(estat);
}
/*
* Do check for a single filesystem.
*/
check(fs)
char *fs;
{
register int ierror, derror;
register int bad = 0;
if (ierror = run(icheck, fs, NULL))
bad |= 1;
if (derror = run(dcheck, fs, NULL))
bad |= 1;
if (sflag) {
if ((ierror & ~IC_FIX) == 0) {
if (derror & ~DC_FIX)
return(-1);
if (derror & DC_FIX) {
if (derror = run(dcheck, fixopt, fs, NULL))
return(-1);
ierror = IC_MISS; /*force fixup icheck*/
}
if (ierror & IC_FIX)
if (ierror = run(icheck, fixopt, fs, NULL))
return(-1);
} else
return(-1);
}
return (bad);
}
/*
* Do a command -- either icheck or dcheck normally.
*/
/* VARARGS */
run(command, args)
char *command;
{
register int pid;
int status;
if ((pid = fork()) < 0) {
fprintf(stderr, "check: try again\n");
exit(-2);
}
if (pid) {
wait(&status);
if ((status&0377) != 0)
return(-2);
return ((status>>8)&0377);
} else {
execv(command, &command);
fprintf(stderr, "check: someone moved %s\n", command);
exit(-2);
}
/* NOTREACHED */
}
rlist(strng)
register char **strng;
{
char *tmp, *tmp1, *t1;
register int i, fd, cnt, tp, tt;
tmp = " ";
tmp1 = tmp;
t1 = " ";
printf("rlist: here!");
printf("strng[0] = %s\n", strng[0]);
printf("file: %s\n", cklist);
if ((fd = open(cklist, 0)) == EOF) {
printf("can't open: %s\n", cklist);
exit(-2);
}
printf("fd = %d\n", fd);
cnt = 1;
for (i = 0; i < 60; ++i) {
if ((tp = read(fd, t1, 1)) != 1) {
printf("tmp1 = %s\n", tmp1);
printf("EOF\n");
exit(-2);
}
tmp = t1;
tt = t1;
printf("t1 = %s %x\n", t1, tt);
if (tmp == "\n") {
printf("newline\n");
tmp = "\0";
strng[cnt] = tmp1;
cnt += 1;
tmp = tmp1;
}
*tmp++;
}
}
usage()
{
fprintf(stderr, "Usage: check [-s] filesystem [ ... ]\n");
exit(-2);
}