summaryrefslogtreecommitdiffstats
path: root/sbin/fsck/utilities.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/fsck/utilities.c')
-rw-r--r--sbin/fsck/utilities.c178
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
OpenPOWER on IntegriCloud