* Copyright (c) 1980, 1986 The Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
"@(#) Copyright (c) 1980, 1986 The Regents of the University of California.\n\
static char sccsid
[] = "@(#)main.c 5.23 (Berkeley) %G%";
void catch(), catchquit(), voidquit();
extern int docheck(), checkfilesys();
while ((ch
= getopt(argc
, argv
, "cdpnNyYb:l:m:")) != EOF
) {
errexit("-b flag requires a number\n");
printf("Alternate super block location: %d\n", bflag
);
errexit("-l flag requires a number\n");
errexit("-m flag requires a mode\n");
sscanf(optarg
, "%o", &lfmode
);
errexit("bad mode to -m: %o\n", lfmode
);
printf("** lost+found creation mode %o\n", lfmode
);
errexit("%c option?\n", ch
);
if (signal(SIGINT
, SIG_IGN
) != SIG_IGN
)
(void)signal(SIGINT
, catch);
(void)signal(SIGQUIT
, catchquit
);
ret
= checkfstab(preen
, maxrun
, docheck
, checkfilesys
);
* Determine whether a filesystem should be checked.
register struct fstab
*fsp
;
if (strcmp(fsp
->fs_vfstype
, "ufs") ||
(strcmp(fsp
->fs_type
, FSTAB_RW
) &&
strcmp(fsp
->fs_type
, FSTAB_RO
)) ||
* Check the specified filesystem.
checkfilesys(filesys
, mntpt
, auxdata
)
daddr_t n_ffree
, n_bfree
;
(void)signal(SIGQUIT
, voidquit
);
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
);
(n_files
-= maxino
- 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
-= maxfsblock
- (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");