* 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.5 (Berkeley) %G%";
char *rawname(), *unrawname(), *blockcheck();
int catch(), catchquit(), voidquit();
int pid
, passno
, anygtr
, sumstatus
;
while (--argc
> 0 && **++argv
== '-') {
if (argv
[0][1] != '\0') {
printf("Alternate super block location: %d\n", bflag
);
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
);
name
= blockcheck(*argv
++);
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
) {
(void)signal(SIGQUIT
, voidquit
);
name
= blockcheck(fsp
->fs_spec
);
while (wait(&status
) != -1)
sumstatus
|= status
.w_retcode
;
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 (stat(raw
, &stchar
) < 0){
printf("Can't stat %s\n", raw
);
if ((stchar
.st_mode
& S_IFMT
) == S_IFCHR
) {
if (stslash
.st_dev
== stblock
.st_rdev
) {
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);