* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
"@(#) Copyright (c) 1980 Regents of the University of California.\n\
static char sccsid
[] = "@(#)main.c 5.10 (Berkeley) %G%";
char *rawname(), *unrawname(), *blockcheck();
int catch(), catchquit(), voidquit();
int pid
, passno
, anygtr
, sumstatus
;
int pid
; /* pid of child doing the check */
struct worklist
*next
; /* next in list */
char name
[MAXMNTLEN
];/* name of file system */
} *listhead
= 0, *freelist
= 0, *badlist
= 0;
register struct worklist
*wp
, *pwp
;
while (--argc
> 0 && **++argv
== '-') {
if (argv
[0][1] != '\0') {
printf("Alternate super block location: %d\n", bflag
);
if (!isdigit(argv
[1][0]))
errexit("-m flag requires a mode\n");
sscanf(*++argv
, "%o", &lfmode
);
errexit("bad mode to -m: %o\n", lfmode
);
printf("** lost+found creation mode %o\n", lfmode
);
case 'n': /* default no answer flag */
case 'y': /* default yes answer flag */
errexit("%c option?\n", **argv
);
if (signal(SIGINT
, SIG_IGN
) != SIG_IGN
)
(void)signal(SIGINT
, catch);
(void)signal(SIGQUIT
, catchquit
);
errexit("Can't open checklist file: %s\n", FSTAB
);
while ((fsp
= getfsent()) != 0) {
if (strcmp(fsp
->fs_type
, FSTAB_RW
) &&
strcmp(fsp
->fs_type
, FSTAB_RO
) &&
strcmp(fsp
->fs_type
, FSTAB_RQ
))
passno
== 1 && fsp
->fs_passno
== passno
) {
name
= blockcheck(fsp
->fs_spec
);
} else if (fsp
->fs_passno
> passno
) {
} else if (fsp
->fs_passno
== passno
) {
name
= blockcheck(fsp
->fs_spec
);
pwarn("BAD DISK NAME %s\n",
(void)signal(SIGQUIT
, voidquit
);
wp
= (struct worklist
*) malloc
(sizeof(struct worklist
));
sprintf(wp
->name
, "%s (%s)", name
,
while ((pid
= wait(&status
)) != -1) {
sumstatus
|= status
.w_retcode
;
for (wp
= listhead
; wp
; pwp
= wp
, wp
= wp
->next
)
printf("Unknown pid %d\n", pid
);
printf("%s: EXITED WITH SIGNAL %d\n",
wp
->name
, status
.w_termsig
);
if (status
.w_retcode
!= 0) {
printf("THE FOLLOWING FILE SYSTEM%s HAD AN %s\n\t",
badlist
->next
? "S" : "", "UNEXPECTED INCONSISTENCY:");
for (wp
= badlist
; wp
; wp
= wp
->next
)
printf("%s%s", wp
->name
, wp
->next
? ", " : "\n");
daddr_t n_ffree
, n_bfree
;
if (setup(filesys
) == 0) {
pfatal("CAN'T CHECK FILE SYSTEM.");
* 1: scan inodes tallying blocks used
printf("** Last Mounted on %s\n", sblock
.fs_fsmnt
);
printf("** Root file system\n");
printf("** Phase 1 - Check Blocks and Sizes\n");
* 1b: locate first references to duplicates, if any
pfatal("INTERNAL ERROR: dups with -p");
printf("** Phase 1b - Rescan For More DUPS\n");
* 2: traverse directories from root to mark all connected directories
printf("** Phase 2 - Check Pathnames\n");
* 3: scan inodes looking for disconnected directories
printf("** Phase 3 - Check Connectivity\n");
* 4: scan inodes looking for disconnected files; check reference counts
printf("** Phase 4 - Check Reference Counts\n");
* 5: check and repair resource counts in cylinder groups
printf("** Phase 5 - Check Cyl groups\n");
* print out summary statistics
n_ffree
= sblock
.fs_cstotal
.cs_nffree
;
n_bfree
= sblock
.fs_cstotal
.cs_nbfree
;
pwarn("%d files, %d used, %d free ",
n_files
, n_blks
, n_ffree
+ sblock
.fs_frag
* n_bfree
);
printf("(%d frags, %d blocks, %.1f%% fragmentation)\n",
n_ffree
, n_bfree
, (float)(n_ffree
* 100) / sblock
.fs_dsize
);
if (debug
&& (n_files
-= imax
- ROOTINO
- sblock
.fs_cstotal
.cs_nifree
))
printf("%d files missing\n", n_files
);
n_blks
+= sblock
.fs_ncg
*
(cgdmin(&sblock
, 0) - cgsblock(&sblock
, 0));
n_blks
+= cgsblock(&sblock
, 0) - cgbase(&sblock
, 0);
n_blks
+= howmany(sblock
.fs_cssize
, sblock
.fs_fsize
);
if (n_blks
-= fmax
- (n_ffree
+ sblock
.fs_frag
* n_bfree
))
printf("%d blocks missing\n", n_blks
);
printf("The following duplicate blocks remain:");
for (dp
= duplist
; dp
; dp
= dp
->next
)
printf("The following zero link count inodes remain:");
for (zlnp
= zlnhead
; zlnp
; zlnp
= zlnp
->next
)
printf(" %d,", zlnp
->zlncnt
);
zlnhead
= (struct zlncnt
*)0;
duplist
= (struct dups
*)0;
(void)time(&sblock
.fs_time
);
printf("\n***** FILE SYSTEM WAS MODIFIED *****\n");
printf("\n***** REBOOT UNIX *****\n");
struct stat stslash
, stblock
, stchar
;
if (stat("/", &stslash
) < 0){
printf("Can't stat root\n");
if (stat(name
, &stblock
) < 0){
printf("Can't stat %s\n", name
);
if ((stblock
.st_mode
& S_IFMT
) == S_IFBLK
) {
if (stslash
.st_dev
== stblock
.st_rdev
) {
if (stat(raw
, &stchar
) < 0){
printf("Can't stat %s\n", raw
);
if ((stchar
.st_mode
& S_IFMT
) == S_IFCHR
)
printf("%s is not a character device\n", raw
);
} else if ((stblock
.st_mode
& S_IFMT
) == S_IFCHR
) {
printf("Can't make sense out of name %s\n", name
);
printf("Can't make sense out of name %s\n", name
);
char *dp
= rindex(cp
, '/');
if ((stb
.st_mode
&S_IFMT
) != S_IFCHR
)
(void)strcpy(dp
+1, dp
+2);
char *dp
= rindex(cp
, '/');
(void)strcpy(rawbuf
, cp
);
(void)strcat(rawbuf
, "/r");
(void)strcat(rawbuf
, dp
+1);