* Copyright (c) 1980, 1986 The Regents of the University of California.
* %sccs.include.redist.c%
"@(#) Copyright (c) 1980, 1986 The Regents of the University of California.\n\
static char sccsid
[] = "@(#)main.c 5.30 (Berkeley) %G%";
#include <ufs/ufs/dinode.h>
void catch(), catchquit(), voidquit();
extern int docheck(), checkfilesys();
while ((ch
= getopt(argc
, argv
, "cdpnNyYb:l:m:")) != EOF
) {
bflag
= argtoi('b', "number", optarg
, 10);
printf("Alternate super block location: %d\n", bflag
);
maxrun
= argtoi('l', "number", optarg
, 10);
lfmode
= argtoi('m', "mode", optarg
, 8);
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
);
(void)checkfilesys(*argv
++, (char *)0, 0L, 0);
ret
= checkfstab(preen
, maxrun
, docheck
, checkfilesys
);
argtoi(flag
, req
, str
, base
)
ret
= (int)strtol(str
, &cp
, base
);
errexit("-%c flag requires a %s\n", flag
, req
);
* 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
, child
)
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("%ld files, %ld used, %ld free ",
n_files
, n_blks
, n_ffree
+ sblock
.fs_frag
* n_bfree
);
printf("(%ld frags, %ld blocks, %d.%d%% fragmentation)\n",
n_ffree
, n_bfree
, (n_ffree
* 100) / sblock
.fs_dsize
,
((n_ffree
* 1000 + sblock
.fs_dsize
/ 2) / sblock
.fs_dsize
) % 10);
(n_files
-= maxino
- ROOTINO
- sblock
.fs_cstotal
.cs_nifree
))
printf("%ld 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("%ld blocks missing\n", n_blks
);
printf("The following duplicate blocks remain:");
for (dp
= duplist
; dp
; dp
= dp
->next
)
printf(" %ld,", dp
->dup
);
printf("The following zero link count inodes remain:");
for (zlnp
= zlnhead
; zlnp
; zlnp
= zlnp
->next
)
printf(" %lu,", zlnp
->zlncnt
);
zlnhead
= (struct zlncnt
*)0;
duplist
= (struct dups
*)0;
muldup
= (struct dups
*)0;
(void)time(&sblock
.fs_time
);
printf("\n***** FILE SYSTEM WAS MODIFIED *****\n");
printf("\n***** REBOOT UNIX *****\n");