diff options
Diffstat (limited to 'sbin/fsck_ifs')
-rw-r--r-- | sbin/fsck_ifs/Makefile | 9 | ||||
-rw-r--r-- | sbin/fsck_ifs/fsck.h | 5 | ||||
-rw-r--r-- | sbin/fsck_ifs/main.c | 79 | ||||
-rw-r--r-- | sbin/fsck_ifs/preen.c | 42 | ||||
-rw-r--r-- | sbin/fsck_ifs/utilities.c | 53 |
5 files changed, 95 insertions, 93 deletions
diff --git a/sbin/fsck_ifs/Makefile b/sbin/fsck_ifs/Makefile index 3155b1a..da0e9f8 100644 --- a/sbin/fsck_ifs/Makefile +++ b/sbin/fsck_ifs/Makefile @@ -1,9 +1,12 @@ +# $FreeBSD$ # @(#)Makefile 8.2 (Berkeley) 4/27/95 -PROG= fsck -MAN8= fsck.8 +PROG= fsck_ffs +LINKS+= ${BINDIR}/fsck_ffs ${BINDIR}/fsck_ufs +LINKS+= ${BINDIR}/fsck_ffs ${BINDIR}/fsck_4.2bsd +MAN8= fsck_ffs.8 SRCS= dir.c inode.c main.c pass1.c pass1b.c pass2.c pass3.c pass4.c \ - pass5.c preen.c setup.c utilities.c ffs_subr.c ffs_tables.c + pass5.c setup.c utilities.c ffs_subr.c ffs_tables.c CFLAGS+=-W .PATH: ${.CURDIR}/../../sys/ufs/ffs diff --git a/sbin/fsck_ifs/fsck.h b/sbin/fsck_ifs/fsck.h index f0280fe..a0be2a4 100644 --- a/sbin/fsck_ifs/fsck.h +++ b/sbin/fsck_ifs/fsck.h @@ -205,7 +205,9 @@ char preen; /* just fix normal inconsistencies */ char rerun; /* rerun fsck. Only used in non-preen mode */ int returntosingle; /* 1 => return to single user mode on exit */ char resolved; /* cleared if unresolved changes => not clean */ +int markclean; /* mark file system clean when done */ char havesb; /* superblock has been read */ +char skipclean; /* skip clean file systems if preening */ int fsmodified; /* 1 => write done to file system */ int fsreadfd; /* file descriptor for reading file system */ int fswritefd; /* file descriptor for writing file system */ @@ -252,9 +254,6 @@ void cacheino __P((struct dinode *dp, ino_t inumber)); void catch __P((int)); void catchquit __P((int)); int changeino __P((ino_t dir, char *name, ino_t newnum)); -int checkfstab __P((int preen, int maxrun, - int (*docheck)(struct fstab *), - int (*chkit)(char *, char *, long, int))); int chkrange __P((ufs_daddr_t blk, int cnt)); void ckfini __P((int markclean)); int ckinode __P((struct dinode *dp, struct inodesc *)); diff --git a/sbin/fsck_ifs/main.c b/sbin/fsck_ifs/main.c index 6463990..1e8a5b4 100644 --- a/sbin/fsck_ifs/main.c +++ b/sbin/fsck_ifs/main.c @@ -62,6 +62,9 @@ static const char rcsid[] = #include "fsck.h" +int returntosingle; + +static void usage __P((void)); static int argtoi __P((int flag, char *req, char *str, int base)); static int docheck __P((struct fstab *fsp)); static int checkfilesys __P((char *filesys, char *mntpt, long auxdata, @@ -75,22 +78,22 @@ main(argc, argv) char *argv[]; { int ch; - int ret, maxrun = 0; struct rlimit rlimit; + int ret = 0; sync(); - while ((ch = getopt(argc, argv, "dfpnNyYb:c:l:m:")) != -1) { + skipclean = 1; + markclean = 1; + while ((ch = getopt(argc, argv, "b:c:dfm:npy")) != -1) { switch (ch) { - case 'p': - preen++; - break; - case 'b': + skipclean = 0; bflag = argtoi('b', "number", optarg, 10); printf("Alternate super block location: %d\n", bflag); break; case 'c': + skipclean = 0; cvtlevel = argtoi('c', "conversion level", optarg, 10); break; @@ -99,11 +102,7 @@ main(argc, argv) break; case 'f': - fflag++; - break; - - case 'l': - maxrun = argtoi('l', "number", optarg, 10); + skipclean = 0; break; case 'm': @@ -114,23 +113,29 @@ main(argc, argv) break; case 'n': - case 'N': nflag++; yflag = 0; break; + case 'p': + preen++; + break; + case 'y': - case 'Y': yflag++; nflag = 0; break; default: - errx(EEXIT, "%c option?", ch); + usage(); } } argc -= optind; argv += optind; + + if (!argc) + usage(); + if (signal(SIGINT, SIG_IGN) != SIG_IGN) (void)signal(SIGINT, catch); if (preen) @@ -143,21 +148,11 @@ main(argc, argv) rlimit.rlim_cur = rlimit.rlim_max; (void)setrlimit(RLIMIT_DATA, &rlimit); } - if (argc) { - while (argc-- > 0) { - char *path = blockcheck(*argv); - - if (path == NULL) - pfatal("Can't check %s\n", *argv); - else - (void)checkfilesys(path, 0, 0L, 0); - ++argv; - } - exit(0); - } - ret = checkfstab(preen, maxrun, docheck, checkfilesys); + while (argc-- > 0) + (void)checkfilesys(blockcheck(*argv++), 0, 0L, 0); + if (returntosingle) - exit(2); + ret = 2; exit(ret); } @@ -177,22 +172,6 @@ argtoi(flag, req, str, base) } /* - * Determine whether a filesystem should be checked. - */ -static int -docheck(fsp) - register struct fstab *fsp; -{ - - if (strcmp(fsp->fs_vfstype, "ufs") || - (strcmp(fsp->fs_type, FSTAB_RW) && - strcmp(fsp->fs_type, FSTAB_RO)) || - fsp->fs_passno == 0) - return (0); - return (1); -} - -/* * Check the specified filesystem. */ /* ARGSUSED */ @@ -415,3 +394,15 @@ getmntpt(name) } return (NULL); } + +static void +usage() +{ + extern char *__progname; + + (void) fprintf(stderr, + "Usage: %s [-dfnpy] [-B be|le] [-b block] [-c level] [-m mode] " + "filesystem ...\n", + __progname); + exit(1); +} diff --git a/sbin/fsck_ifs/preen.c b/sbin/fsck_ifs/preen.c index e43aada..4ad426f 100644 --- a/sbin/fsck_ifs/preen.c +++ b/sbin/fsck_ifs/preen.c @@ -288,45 +288,3 @@ startdisk(dk, checkit) return (0); } -char * -blockcheck(origname) - char *origname; -{ - struct stat stslash, stblock, stchar; - char *newname, *raw; - struct fstab *fsinfo; - int retried = 0, len; - - newname = origname; -retry: - if (stat(newname, &stblock) < 0) { - printf("Can't stat %s: %s\n", newname, strerror(errno)); - return (origname); - } - switch(stblock.st_mode & S_IFMT) { - case S_IFCHR: - case S_IFBLK: - return(newname); - case S_IFDIR: - if (retried) - break; - - len = strlen(origname) - 1; - if (len > 0 && origname[len] == '/') - /* remove trailing slash */ - origname[len] = '\0'; - if ((fsinfo = getfsfile(origname)) == NULL) { - printf("Can't resolve %s to character special device", - origname); - return (0); - } - newname = fsinfo->fs_spec; - retried++; - goto retry; - } - /* - * Not a block or character device, just return name and - * let the user decide whether to use it. - */ - return (origname); -} diff --git a/sbin/fsck_ifs/utilities.c b/sbin/fsck_ifs/utilities.c index 0ccd9bb..0e4bde5 100644 --- a/sbin/fsck_ifs/utilities.c +++ b/sbin/fsck_ifs/utilities.c @@ -40,13 +40,21 @@ static const char rcsid[] = #endif /* not lint */ #include <sys/param.h> +#include <sys/types.h> +#include <sys/stat.h> #include <ufs/ufs/dinode.h> #include <ufs/ufs/dir.h> #include <ufs/ffs/fs.h> #include <err.h> +#include <errno.h> #include <string.h> +#include <ctype.h> +#include <fstab.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> #include "fsck.h" @@ -561,7 +569,7 @@ dofix(idesc, msg) if (idesc->id_type == DATA) direrror(idesc->id_number, msg); else - pwarn("%s", msg); + pwarn(msg); if (preen) { printf(" (SALVAGED)\n"); idesc->id_fix = FIX; @@ -681,3 +689,46 @@ panic(fmt, va_alist) va_end(ap); exit(EEXIT); } + +char * +blockcheck(origname) + char *origname; +{ + struct stat stslash, stblock, stchar; + char *newname, *raw; + struct fstab *fsinfo; + int retried = 0, len; + + newname = origname; +retry: + if (stat(newname, &stblock) < 0) { + printf("Can't stat %s: %s\n", newname, strerror(errno)); + return (origname); + } + switch(stblock.st_mode & S_IFMT) { + case S_IFCHR: + case S_IFBLK: + return(newname); + case S_IFDIR: + if (retried) + break; + + len = strlen(origname) - 1; + if (len > 0 && origname[len] == '/') + /* remove trailing slash */ + origname[len] = '\0'; + if ((fsinfo = getfsfile(origname)) == NULL) { + printf("Can't resolve %s to character special device", + origname); + return (0); + } + newname = fsinfo->fs_spec; + retried++; + goto retry; + } + /* + * Not a block or character device, just return name and + * let the user decide whether to use it. + */ + return (origname); +} |