diff options
Diffstat (limited to 'sbin/fsck/utilities.c')
-rw-r--r-- | sbin/fsck/utilities.c | 178 |
1 files changed, 120 insertions, 58 deletions
diff --git a/sbin/fsck/utilities.c b/sbin/fsck/utilities.c index 64a4cac..a5c56da 100644 --- a/sbin/fsck/utilities.c +++ b/sbin/fsck/utilities.c @@ -32,22 +32,27 @@ */ #ifndef lint -static char sccsid[] = "@(#)utilities.c 8.1 (Berkeley) 6/5/93"; +static char sccsid[] = "@(#)utilities.c 8.6 (Berkeley) 5/19/95"; #endif /* not lint */ #include <sys/param.h> #include <sys/time.h> + #include <ufs/ufs/dinode.h> #include <ufs/ufs/dir.h> #include <ufs/ffs/fs.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> + #include <ctype.h> +#include <err.h> +#include <string.h> + #include "fsck.h" long diskreads, totalreads; /* Disk cache statistics */ +static void rwerror __P((char *mesg, ufs_daddr_t blk)); + +int ftypeok(dp) struct dinode *dp; { @@ -69,6 +74,7 @@ ftypeok(dp) } } +int reply(question) char *question; { @@ -104,6 +110,7 @@ reply(question) /* * Malloc buffers and set up cache. */ +void bufinit() { register struct bufarea *bp; @@ -113,7 +120,7 @@ bufinit() pbp = pdirbp = (struct bufarea *)0; bufp = malloc((unsigned int)sblock.fs_bsize); if (bufp == 0) - errexit("cannot allocate buffer pool\n"); + errx(EEXIT, "cannot allocate buffer pool"); cgblk.b_un.b_buf = bufp; initbarea(&cgblk); bufhead.b_next = bufhead.b_prev = &bufhead; @@ -126,7 +133,7 @@ bufinit() if (bp == NULL || bufp == NULL) { if (i >= MINBUFS) break; - errexit("cannot allocate buffer pool\n"); + errx(EEXIT, "cannot allocate buffer pool"); } bp->b_un.b_buf = bufp; bp->b_prev = &bufhead; @@ -143,7 +150,7 @@ bufinit() */ struct bufarea * getdatablk(blkno, size) - daddr_t blkno; + ufs_daddr_t blkno; long size; { register struct bufarea *bp; @@ -155,7 +162,7 @@ getdatablk(blkno, size) if ((bp->b_flags & B_INUSE) == 0) break; if (bp == &bufhead) - errexit("deadlocked buffer pool\n"); + errx(EEXIT, "deadlocked buffer pool"); getblk(bp, blkno, size); /* fall through */ foundit: @@ -173,10 +180,10 @@ foundit: void getblk(bp, blk, size) register struct bufarea *bp; - daddr_t blk; + ufs_daddr_t blk; long size; { - daddr_t dblk; + ufs_daddr_t dblk; dblk = fsbtodb(&sblock, blk); if (bp->b_bno != dblk) { @@ -188,6 +195,7 @@ getblk(bp, blk, size) } } +void flush(fd, bp) int fd; register struct bufarea *bp; @@ -213,22 +221,25 @@ flush(fd, bp) } } +static void rwerror(mesg, blk) char *mesg; - daddr_t blk; + ufs_daddr_t blk; { if (preen == 0) printf("\n"); pfatal("CANNOT %s: BLK %ld", mesg, blk); if (reply("CONTINUE") == 0) - errexit("Program terminated\n"); + exit(EEXIT); } -ckfini() +void +ckfini(markclean) + int markclean; { register struct bufarea *bp, *nbp; - int cnt = 0; + int ofsmodified, cnt = 0; if (fswritefd < 0) { (void)close(fsreadfd); @@ -251,8 +262,17 @@ ckfini() free((char *)bp); } if (bufhead.b_size != cnt) - errexit("Panic: lost %d buffers\n", bufhead.b_size - cnt); + errx(EEXIT, "Panic: lost %d buffers", bufhead.b_size - cnt); pbp = pdirbp = (struct bufarea *)0; + if (markclean && sblock.fs_clean == 0) { + sblock.fs_clean = 1; + sbdirty(); + ofsmodified = fsmodified; + flush(fswritefd, &sblk); + fsmodified = ofsmodified; + if (!preen) + printf("\n***** FILE SYSTEM MARKED CLEAN *****\n"); + } if (debug) printf("cache missed %ld of %ld (%d%%)\n", diskreads, totalreads, (int)(diskreads * 100 / totalreads)); @@ -260,10 +280,11 @@ ckfini() (void)close(fswritefd); } +int bread(fd, buf, blk, size) int fd; char *buf; - daddr_t blk; + ufs_daddr_t blk; long size; { char *cp; @@ -280,7 +301,7 @@ bread(fd, buf, blk, size) if (lseek(fd, offset, 0) < 0) rwerror("SEEK", blk); errs = 0; - bzero(buf, (size_t)size); + memset(buf, 0, (size_t)size); printf("THE FOLLOWING DISK SECTORS COULD NOT BE READ:"); for (cp = buf, i = 0; i < size; i += secsize, cp += secsize) { if (read(fd, cp, (int)secsize) != secsize) { @@ -298,10 +319,11 @@ bread(fd, buf, blk, size) return (errs); } +void bwrite(fd, buf, blk, size) int fd; char *buf; - daddr_t blk; + ufs_daddr_t blk; long size; { int i; @@ -334,6 +356,7 @@ bwrite(fd, buf, blk, size) /* * allocate a data block with the specified number of fragments */ +ufs_daddr_t allocblk(frags) long frags; { @@ -364,8 +387,9 @@ allocblk(frags) /* * Free a previously allocated block */ +void freeblk(blkno, frags) - daddr_t blkno; + ufs_daddr_t blkno; long frags; { struct inodesc idesc; @@ -378,6 +402,7 @@ freeblk(blkno, frags) /* * Find a pathname */ +void getpathname(namebuf, curdir, ino) char *namebuf; ino_t curdir, ino; @@ -398,7 +423,7 @@ getpathname(namebuf, curdir, ino) return; } busy = 1; - bzero((char *)&idesc, sizeof(struct inodesc)); + memset(&idesc, 0, sizeof(struct inodesc)); idesc.id_type = DATA; idesc.id_fix = IGNORE; cp = &namebuf[MAXPATHLEN - 1]; @@ -422,7 +447,7 @@ getpathname(namebuf, curdir, ino) break; len = strlen(namebuf); cp -= len; - bcopy(namebuf, cp, (size_t)len); + memmove(cp, namebuf, (size_t)len); *--cp = '/'; if (cp < &namebuf[MAXNAMLEN]) break; @@ -431,14 +456,15 @@ getpathname(namebuf, curdir, ino) busy = 0; if (ino != ROOTINO) *--cp = '?'; - bcopy(cp, namebuf, (size_t)(&namebuf[MAXPATHLEN] - cp)); + memmove(namebuf, cp, (size_t)(&namebuf[MAXPATHLEN] - cp)); } void -catch() +catch(sig) + int sig; { if (!doinglevel2) - ckfini(); + ckfini(0); exit(12); } @@ -448,7 +474,8 @@ catch() * so that reboot sequence may be interrupted. */ void -catchquit() +catchquit(sig) + int sig; { extern returntosingle; @@ -462,7 +489,8 @@ catchquit() * Used by child processes in preen. */ void -voidquit() +voidquit(sig) + int sig; { sleep(1); @@ -473,6 +501,7 @@ voidquit() /* * determine whether an inode should be fixed. */ +int dofix(idesc, msg) register struct inodesc *idesc; char *msg; @@ -505,62 +534,95 @@ dofix(idesc, msg) return (0); default: - errexit("UNKNOWN INODESC FIX MODE %d\n", idesc->id_fix); + errx(EEXIT, "UNKNOWN INODESC FIX MODE %d", idesc->id_fix); } /* NOTREACHED */ + return (0); } -/* VARARGS1 */ -errexit(s1, s2, s3, s4) - char *s1; -{ - printf(s1, s2, s3, s4); - exit(8); -} +#if __STDC__ +#include <stdarg.h> +#else +#include <varargs.h> +#endif /* * An unexpected inconsistency occured. * Die if preening, otherwise just print message and continue. */ -/* VARARGS1 */ -pfatal(s, a1, a2, a3) - char *s; +void +#if __STDC__ +pfatal(const char *fmt, ...) +#else +pfatal(fmt, va_alist) + char *fmt; + va_dcl +#endif { - - if (preen) { - printf("%s: ", cdevname); - printf(s, a1, a2, a3); - printf("\n"); - printf("%s: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.\n", - cdevname); - exit(8); + va_list ap; +#if __STDC__ + va_start(ap, fmt); +#else + va_start(ap); +#endif + if (!preen) { + (void)vfprintf(stderr, fmt, ap); + va_end(ap); + return; } - printf(s, a1, a2, a3); + (void)fprintf(stderr, "%s: ", cdevname); + (void)vfprintf(stderr, fmt, ap); + (void)fprintf(stderr, + "\n%s: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.\n", + cdevname); + exit(EEXIT); } /* * Pwarn just prints a message when not preening, * or a warning (preceded by filename) when preening. */ -/* VARARGS1 */ -pwarn(s, a1, a2, a3, a4, a5, a6) - char *s; +void +#if __STDC__ +pwarn(const char *fmt, ...) +#else +pwarn(fmt, va_alist) + char *fmt; + va_dcl +#endif { - + va_list ap; +#if __STDC__ + va_start(ap, fmt); +#else + va_start(ap); +#endif if (preen) - printf("%s: ", cdevname); - printf(s, a1, a2, a3, a4, a5, a6); + (void)fprintf(stderr, "%s: ", cdevname); + (void)vfprintf(stderr, fmt, ap); + va_end(ap); } -#ifndef lint /* * Stub for routines from kernel. */ -panic(s) - char *s; +void +#if __STDC__ +panic(const char *fmt, ...) +#else +panic(fmt, va_alist) + char *fmt; + va_dcl +#endif { - + va_list ap; +#if __STDC__ + va_start(ap, fmt); +#else + va_start(ap); +#endif pfatal("INTERNAL INCONSISTENCY:"); - errexit(s); + (void)vfprintf(stderr, fmt, ap); + va_end(ap); + exit(EEXIT); } -#endif |