xref: /csrg-svn/sbin/fsck/utilities.c (revision 39976)
122055Sdist /*
2*39976Smckusick  * Copyright (c) 1980, 1986 The Regents of the University of California.
3*39976Smckusick  * All rights reserved.
4*39976Smckusick  *
5*39976Smckusick  * Redistribution and use in source and binary forms are permitted
6*39976Smckusick  * provided that the above copyright notice and this paragraph are
7*39976Smckusick  * duplicated in all such forms and that any documentation,
8*39976Smckusick  * advertising materials, and other materials related to such
9*39976Smckusick  * distribution and use acknowledge that the software was developed
10*39976Smckusick  * by the University of California, Berkeley.  The name of the
11*39976Smckusick  * University may not be used to endorse or promote products derived
12*39976Smckusick  * from this software without specific prior written permission.
13*39976Smckusick  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14*39976Smckusick  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15*39976Smckusick  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
1622055Sdist  */
1722055Sdist 
1816269Smckusick #ifndef lint
19*39976Smckusick static char sccsid[] = "@(#)utilities.c	5.21 (Berkeley) 02/01/90";
20*39976Smckusick #endif /* not lint */
2116269Smckusick 
2216269Smckusick #include <sys/param.h>
2339383Smckusick #include <ufs/dinode.h>
2438337Smckusick #include <ufs/fs.h>
2538337Smckusick #include <ufs/dir.h>
2639165Sbostic #include <stdio.h>
2739165Sbostic #include <ctype.h>
2816269Smckusick #include "fsck.h"
2916269Smckusick 
3034225Smckusick long	diskreads, totalreads;	/* Disk cache statistics */
3116269Smckusick long	lseek();
3238377Smckusick char	*malloc();
3316269Smckusick 
3416269Smckusick ftypeok(dp)
3539973Smckusick 	struct dinode *dp;
3616269Smckusick {
3716269Smckusick 	switch (dp->di_mode & IFMT) {
3816269Smckusick 
3916269Smckusick 	case IFDIR:
4016269Smckusick 	case IFREG:
4116269Smckusick 	case IFBLK:
4216269Smckusick 	case IFCHR:
4316269Smckusick 	case IFLNK:
4416269Smckusick 	case IFSOCK:
4516269Smckusick 		return (1);
4616269Smckusick 
4716269Smckusick 	default:
4816269Smckusick 		if (debug)
4916269Smckusick 			printf("bad file type 0%o\n", dp->di_mode);
5016269Smckusick 		return (0);
5116269Smckusick 	}
5216269Smckusick }
5316269Smckusick 
5439975Smckusick reply(question)
5539975Smckusick 	char *question;
5616269Smckusick {
5739975Smckusick 	int persevere;
5839975Smckusick 	char c;
5916269Smckusick 
6016269Smckusick 	if (preen)
6116269Smckusick 		pfatal("INTERNAL ERROR: GOT TO reply()");
6239975Smckusick 	persevere = !strcmp(question, "CONTINUE");
6339975Smckusick 	printf("\n");
6439975Smckusick 	if (!persevere && (nflag || fswritefd < 0)) {
6539975Smckusick 		printf("%s? no\n\n", question);
6616269Smckusick 		return (0);
6716269Smckusick 	}
6839975Smckusick 	if (yflag || (persevere && nflag)) {
6939975Smckusick 		printf("%s? yes\n\n", question);
7016269Smckusick 		return (1);
7116269Smckusick 	}
7239975Smckusick 	do	{
7339975Smckusick 		printf("%s? [yn] ", question);
7439975Smckusick 		(void) fflush(stdout);
7539975Smckusick 		c = getc(stdin);
7639975Smckusick 		while (c != '\n' && getc(stdin) != '\n')
7739975Smckusick 			if (feof(stdin))
7839975Smckusick 				return (0);
7939975Smckusick 	} while (c != 'y' && c != 'Y' && c != 'n' && c != 'N');
8016269Smckusick 	printf("\n");
8139975Smckusick 	if (c == 'y' || c == 'Y')
8216269Smckusick 		return (1);
8339975Smckusick 	return (0);
8416269Smckusick }
8516269Smckusick 
8634225Smckusick /*
8734225Smckusick  * Malloc buffers and set up cache.
8834225Smckusick  */
8934225Smckusick bufinit()
9034225Smckusick {
9139973Smckusick 	register struct bufarea *bp;
9234225Smckusick 	long bufcnt, i;
9334225Smckusick 	char *bufp;
9434225Smckusick 
9539973Smckusick 	bufp = malloc((unsigned int)sblock.fs_bsize);
9634225Smckusick 	if (bufp == 0)
9734225Smckusick 		errexit("cannot allocate buffer pool\n");
9834225Smckusick 	cgblk.b_un.b_buf = bufp;
9934225Smckusick 	initbarea(&cgblk);
10034225Smckusick 	bufhead.b_next = bufhead.b_prev = &bufhead;
10134225Smckusick 	bufcnt = MAXBUFSPACE / sblock.fs_bsize;
10234225Smckusick 	if (bufcnt < MINBUFS)
10334225Smckusick 		bufcnt = MINBUFS;
10434225Smckusick 	for (i = 0; i < bufcnt; i++) {
10539973Smckusick 		bp = (struct bufarea *)malloc(sizeof(struct bufarea));
10639973Smckusick 		bufp = malloc((unsigned int)sblock.fs_bsize);
10738377Smckusick 		if (bp == NULL || bufp == NULL) {
10834225Smckusick 			if (i >= MINBUFS)
10934225Smckusick 				break;
11034225Smckusick 			errexit("cannot allocate buffer pool\n");
11134225Smckusick 		}
11234225Smckusick 		bp->b_un.b_buf = bufp;
11334225Smckusick 		bp->b_prev = &bufhead;
11434225Smckusick 		bp->b_next = bufhead.b_next;
11534225Smckusick 		bufhead.b_next->b_prev = bp;
11634225Smckusick 		bufhead.b_next = bp;
11734225Smckusick 		initbarea(bp);
11834225Smckusick 	}
11934482Smckusick 	bufhead.b_size = i;	/* save number of buffers */
12034225Smckusick }
12134225Smckusick 
12234225Smckusick /*
12334225Smckusick  * Manage a cache of directory blocks.
12434225Smckusick  */
12539973Smckusick struct bufarea *
12634225Smckusick getdatablk(blkno, size)
12734225Smckusick 	daddr_t blkno;
12834225Smckusick 	long size;
12934225Smckusick {
13039973Smckusick 	register struct bufarea *bp;
13134225Smckusick 
13234225Smckusick 	for (bp = bufhead.b_next; bp != &bufhead; bp = bp->b_next)
13334671Smckusick 		if (bp->b_bno == fsbtodb(&sblock, blkno))
13434225Smckusick 			goto foundit;
13534225Smckusick 	for (bp = bufhead.b_prev; bp != &bufhead; bp = bp->b_prev)
13634225Smckusick 		if ((bp->b_flags & B_INUSE) == 0)
13734225Smckusick 			break;
13834225Smckusick 	if (bp == &bufhead)
13934225Smckusick 		errexit("deadlocked buffer pool\n");
14034225Smckusick 	getblk(bp, blkno, size);
14134225Smckusick 	/* fall through */
14234225Smckusick foundit:
14334225Smckusick 	totalreads++;
14434225Smckusick 	bp->b_prev->b_next = bp->b_next;
14534225Smckusick 	bp->b_next->b_prev = bp->b_prev;
14634225Smckusick 	bp->b_prev = &bufhead;
14734225Smckusick 	bp->b_next = bufhead.b_next;
14834225Smckusick 	bufhead.b_next->b_prev = bp;
14934225Smckusick 	bufhead.b_next = bp;
15034225Smckusick 	bp->b_flags |= B_INUSE;
15134225Smckusick 	return (bp);
15234225Smckusick }
15334225Smckusick 
15439973Smckusick struct bufarea *
15516269Smckusick getblk(bp, blk, size)
15639973Smckusick 	register struct bufarea *bp;
15716269Smckusick 	daddr_t blk;
15816269Smckusick 	long size;
15916269Smckusick {
16016269Smckusick 	daddr_t dblk;
16116269Smckusick 
16234671Smckusick 	dblk = fsbtodb(&sblock, blk);
16334671Smckusick 	if (bp->b_bno == dblk)
16416269Smckusick 		return (bp);
16539973Smckusick 	flush(fswritefd, bp);
16634225Smckusick 	diskreads++;
16739973Smckusick 	bp->b_errs = bread(fsreadfd, bp->b_un.b_buf, dblk, size);
16834671Smckusick 	bp->b_bno = dblk;
16921540Smckusick 	bp->b_size = size;
17021540Smckusick 	return (bp);
17116269Smckusick }
17216269Smckusick 
17339973Smckusick flush(fd, bp)
17439973Smckusick 	int fd;
17539973Smckusick 	register struct bufarea *bp;
17616269Smckusick {
17717931Smckusick 	register int i, j;
17816269Smckusick 
17917931Smckusick 	if (!bp->b_dirty)
18017931Smckusick 		return;
18121540Smckusick 	if (bp->b_errs != 0)
18230609Skarels 		pfatal("WRITING %sZERO'ED BLOCK %d TO DISK\n",
18330609Skarels 		    (bp->b_errs == bp->b_size / dev_bsize) ? "" : "PARTIALLY ",
18430609Skarels 		    bp->b_bno);
18516269Smckusick 	bp->b_dirty = 0;
18621540Smckusick 	bp->b_errs = 0;
18739973Smckusick 	bwrite(fd, bp->b_un.b_buf, bp->b_bno, (long)bp->b_size);
18817931Smckusick 	if (bp != &sblk)
18917931Smckusick 		return;
19017931Smckusick 	for (i = 0, j = 0; i < sblock.fs_cssize; i += sblock.fs_bsize, j++) {
19139973Smckusick 		bwrite(fswritefd, (char *)sblock.fs_csp[j],
19217931Smckusick 		    fsbtodb(&sblock, sblock.fs_csaddr + j * sblock.fs_frag),
19317931Smckusick 		    sblock.fs_cssize - i < sblock.fs_bsize ?
19417931Smckusick 		    sblock.fs_cssize - i : sblock.fs_bsize);
19517931Smckusick 	}
19616269Smckusick }
19716269Smckusick 
19839973Smckusick rwerror(mesg, blk)
19939973Smckusick 	char *mesg;
20016269Smckusick 	daddr_t blk;
20116269Smckusick {
20216269Smckusick 
20316269Smckusick 	if (preen == 0)
20416269Smckusick 		printf("\n");
20539973Smckusick 	pfatal("CANNOT %s: BLK %ld", mesg, blk);
20616269Smckusick 	if (reply("CONTINUE") == 0)
20716269Smckusick 		errexit("Program terminated\n");
20816269Smckusick }
20916269Smckusick 
21016269Smckusick ckfini()
21116269Smckusick {
21239973Smckusick 	register struct bufarea *bp, *nbp;
21334482Smckusick 	int cnt = 0;
21416269Smckusick 
21539973Smckusick 	flush(fswritefd, &sblk);
21630859Skarels 	if (havesb && sblk.b_bno != SBOFF / dev_bsize &&
21730518Smckusick 	    !preen && reply("UPDATE STANDARD SUPERBLOCK")) {
21830556Smckusick 		sblk.b_bno = SBOFF / dev_bsize;
21916269Smckusick 		sbdirty();
22039973Smckusick 		flush(fswritefd, &sblk);
22116269Smckusick 	}
22239973Smckusick 	flush(fswritefd, &cgblk);
22338342Smckusick 	free(cgblk.b_un.b_buf);
22438342Smckusick 	for (bp = bufhead.b_prev; bp != &bufhead; bp = nbp) {
22534482Smckusick 		cnt++;
22639973Smckusick 		flush(fswritefd, bp);
22738342Smckusick 		nbp = bp->b_prev;
22838342Smckusick 		free(bp->b_un.b_buf);
22938342Smckusick 		free((char *)bp);
23034482Smckusick 	}
23134482Smckusick 	if (bufhead.b_size != cnt)
23234482Smckusick 		errexit("Panic: lost %d buffers\n", bufhead.b_size - cnt);
23334225Smckusick 	if (debug)
23434482Smckusick 		printf("cache missed %d of %d (%d%%)\n", diskreads,
23534482Smckusick 		    totalreads, diskreads * 100 / totalreads);
23639973Smckusick 	(void)close(fsreadfd);
23739973Smckusick 	(void)close(fswritefd);
23816269Smckusick }
23916269Smckusick 
24039973Smckusick bread(fd, buf, blk, size)
24139973Smckusick 	int fd;
24216269Smckusick 	char *buf;
24316269Smckusick 	daddr_t blk;
24416269Smckusick 	long size;
24516269Smckusick {
24621540Smckusick 	char *cp;
24721540Smckusick 	int i, errs;
24821540Smckusick 
24939973Smckusick 	if (lseek(fd, blk * dev_bsize, 0) < 0)
25039973Smckusick 		rwerror("SEEK", blk);
25139973Smckusick 	else if (read(fd, buf, (int)size) == size)
25221540Smckusick 		return (0);
25339973Smckusick 	rwerror("READ", blk);
25439973Smckusick 	if (lseek(fd, blk * dev_bsize, 0) < 0)
25539973Smckusick 		rwerror("SEEK", blk);
25621540Smckusick 	errs = 0;
25739973Smckusick 	bzero(buf, (int)size);
25830609Skarels 	printf("THE FOLLOWING DISK SECTORS COULD NOT BE READ:");
25930609Skarels 	for (cp = buf, i = 0; i < size; i += secsize, cp += secsize) {
26039973Smckusick 		if (read(fd, cp, (int)secsize) < 0) {
26139973Smckusick 			lseek(fd, blk * dev_bsize + i + secsize, 0);
26230859Skarels 			if (secsize != dev_bsize && dev_bsize != 1)
26330609Skarels 				printf(" %d (%d),",
26430609Skarels 				    (blk * dev_bsize + i) / secsize,
26530609Skarels 				    blk + i / dev_bsize);
26630609Skarels 			else
26730609Skarels 				printf(" %d,", blk + i / dev_bsize);
26821540Smckusick 			errs++;
26921540Smckusick 		}
27021540Smckusick 	}
27121758Smckusick 	printf("\n");
27221540Smckusick 	return (errs);
27316269Smckusick }
27416269Smckusick 
27539973Smckusick bwrite(fd, buf, blk, size)
27639973Smckusick 	int fd;
27716269Smckusick 	char *buf;
27816269Smckusick 	daddr_t blk;
27916269Smckusick 	long size;
28016269Smckusick {
28121758Smckusick 	int i;
28221758Smckusick 	char *cp;
28316269Smckusick 
28439973Smckusick 	if (fd < 0)
28521758Smckusick 		return;
28639973Smckusick 	if (lseek(fd, blk * dev_bsize, 0) < 0)
28739973Smckusick 		rwerror("SEEK", blk);
28839973Smckusick 	else if (write(fd, buf, (int)size) == size) {
28939973Smckusick 		fsmodified = 1;
29021758Smckusick 		return;
29116269Smckusick 	}
29239973Smckusick 	rwerror("WRITE", blk);
29339973Smckusick 	if (lseek(fd, blk * dev_bsize, 0) < 0)
29439973Smckusick 		rwerror("SEEK", blk);
29530609Skarels 	printf("THE FOLLOWING SECTORS COULD NOT BE WRITTEN:");
29630518Smckusick 	for (cp = buf, i = 0; i < size; i += dev_bsize, cp += dev_bsize)
29739973Smckusick 		if (write(fd, cp, (int)dev_bsize) < 0) {
29839973Smckusick 			lseek(fd, blk * dev_bsize + i + dev_bsize, 0);
29930518Smckusick 			printf(" %d,", blk + i / dev_bsize);
30030395Smckusick 		}
30121758Smckusick 	printf("\n");
30221758Smckusick 	return;
30316269Smckusick }
30416269Smckusick 
30517944Smckusick /*
30617944Smckusick  * allocate a data block with the specified number of fragments
30717944Smckusick  */
30817944Smckusick allocblk(frags)
30939973Smckusick 	long frags;
31017944Smckusick {
31117944Smckusick 	register int i, j, k;
31217944Smckusick 
31317944Smckusick 	if (frags <= 0 || frags > sblock.fs_frag)
31417944Smckusick 		return (0);
31539973Smckusick 	for (i = 0; i < maxfsblock - sblock.fs_frag; i += sblock.fs_frag) {
31617944Smckusick 		for (j = 0; j <= sblock.fs_frag - frags; j++) {
31739973Smckusick 			if (testbmap(i + j))
31817944Smckusick 				continue;
31917944Smckusick 			for (k = 1; k < frags; k++)
32039973Smckusick 				if (testbmap(i + j + k))
32117944Smckusick 					break;
32217944Smckusick 			if (k < frags) {
32317944Smckusick 				j += k;
32417944Smckusick 				continue;
32517944Smckusick 			}
32617944Smckusick 			for (k = 0; k < frags; k++)
32717944Smckusick 				setbmap(i + j + k);
32817944Smckusick 			n_blks += frags;
32917944Smckusick 			return (i + j);
33017944Smckusick 		}
33117944Smckusick 	}
33217944Smckusick 	return (0);
33317944Smckusick }
33417944Smckusick 
33517944Smckusick /*
33617944Smckusick  * Free a previously allocated block
33717944Smckusick  */
33817944Smckusick freeblk(blkno, frags)
33917944Smckusick 	daddr_t blkno;
34039973Smckusick 	long frags;
34117944Smckusick {
34217944Smckusick 	struct inodesc idesc;
34317944Smckusick 
34417944Smckusick 	idesc.id_blkno = blkno;
34517944Smckusick 	idesc.id_numfrags = frags;
34617944Smckusick 	pass4check(&idesc);
34717944Smckusick }
34817944Smckusick 
34917991Smckusick /*
35017991Smckusick  * Find a pathname
35117991Smckusick  */
35217991Smckusick getpathname(namebuf, curdir, ino)
35317991Smckusick 	char *namebuf;
35417991Smckusick 	ino_t curdir, ino;
35517991Smckusick {
35617991Smckusick 	int len;
35717991Smckusick 	register char *cp;
35817991Smckusick 	struct inodesc idesc;
35917991Smckusick 	extern int findname();
36017991Smckusick 
36117991Smckusick 	if (statemap[ino] != DSTATE && statemap[ino] != DFOUND) {
36217991Smckusick 		strcpy(namebuf, "?");
36317991Smckusick 		return;
36417991Smckusick 	}
36539973Smckusick 	bzero((char *)&idesc, sizeof(struct inodesc));
36617991Smckusick 	idesc.id_type = DATA;
36717991Smckusick 	cp = &namebuf[BUFSIZ - 1];
36830354Smckusick 	*cp = '\0';
36917991Smckusick 	if (curdir != ino) {
37017991Smckusick 		idesc.id_parent = curdir;
37117991Smckusick 		goto namelookup;
37217991Smckusick 	}
37317991Smckusick 	while (ino != ROOTINO) {
37417991Smckusick 		idesc.id_number = ino;
37517991Smckusick 		idesc.id_func = findino;
37617991Smckusick 		idesc.id_name = "..";
37730354Smckusick 		if ((ckinode(ginode(ino), &idesc) & FOUND) == 0)
37817991Smckusick 			break;
37917991Smckusick 	namelookup:
38017991Smckusick 		idesc.id_number = idesc.id_parent;
38117991Smckusick 		idesc.id_parent = ino;
38217991Smckusick 		idesc.id_func = findname;
38317991Smckusick 		idesc.id_name = namebuf;
38430354Smckusick 		if ((ckinode(ginode(idesc.id_number), &idesc) & FOUND) == 0)
38517991Smckusick 			break;
38617991Smckusick 		len = strlen(namebuf);
38717991Smckusick 		cp -= len;
38817991Smckusick 		if (cp < &namebuf[MAXNAMLEN])
38917991Smckusick 			break;
39017991Smckusick 		bcopy(namebuf, cp, len);
39117991Smckusick 		*--cp = '/';
39217991Smckusick 		ino = idesc.id_number;
39317991Smckusick 	}
39417991Smckusick 	if (ino != ROOTINO) {
39517991Smckusick 		strcpy(namebuf, "?");
39617991Smckusick 		return;
39717991Smckusick 	}
39817991Smckusick 	bcopy(cp, namebuf, &namebuf[BUFSIZ] - cp);
39917991Smckusick }
40017991Smckusick 
40139165Sbostic void
40216269Smckusick catch()
40316269Smckusick {
40416269Smckusick 	ckfini();
40516269Smckusick 	exit(12);
40616269Smckusick }
40716269Smckusick 
40816269Smckusick /*
40924680Skarels  * When preening, allow a single quit to signal
41024680Skarels  * a special exit after filesystem checks complete
41124680Skarels  * so that reboot sequence may be interrupted.
41224680Skarels  */
41339165Sbostic void
41424680Skarels catchquit()
41524680Skarels {
41624680Skarels 	extern returntosingle;
41724680Skarels 
41824680Skarels 	printf("returning to single-user after filesystem check\n");
41924680Skarels 	returntosingle = 1;
42024680Skarels 	(void)signal(SIGQUIT, SIG_DFL);
42124680Skarels }
42224680Skarels 
42324680Skarels /*
42424680Skarels  * Ignore a single quit signal; wait and flush just in case.
42524680Skarels  * Used by child processes in preen.
42624680Skarels  */
42739165Sbostic void
42824680Skarels voidquit()
42924680Skarels {
43024680Skarels 
43124680Skarels 	sleep(1);
43224680Skarels 	(void)signal(SIGQUIT, SIG_IGN);
43324680Skarels 	(void)signal(SIGQUIT, SIG_DFL);
43424680Skarels }
43524680Skarels 
43624680Skarels /*
43716269Smckusick  * determine whether an inode should be fixed.
43816269Smckusick  */
43917931Smckusick dofix(idesc, msg)
44016269Smckusick 	register struct inodesc *idesc;
44117931Smckusick 	char *msg;
44216269Smckusick {
44316269Smckusick 
44416269Smckusick 	switch (idesc->id_fix) {
44516269Smckusick 
44616269Smckusick 	case DONTKNOW:
44717931Smckusick 		if (idesc->id_type == DATA)
44839973Smckusick 			direrror(idesc->id_number, msg);
44917931Smckusick 		else
45017931Smckusick 			pwarn(msg);
45117931Smckusick 		if (preen) {
45217931Smckusick 			printf(" (SALVAGED)\n");
45317931Smckusick 			idesc->id_fix = FIX;
45417931Smckusick 			return (ALTERED);
45517931Smckusick 		}
45616269Smckusick 		if (reply("SALVAGE") == 0) {
45716269Smckusick 			idesc->id_fix = NOFIX;
45816269Smckusick 			return (0);
45916269Smckusick 		}
46016269Smckusick 		idesc->id_fix = FIX;
46116269Smckusick 		return (ALTERED);
46216269Smckusick 
46316269Smckusick 	case FIX:
46416269Smckusick 		return (ALTERED);
46516269Smckusick 
46616269Smckusick 	case NOFIX:
46716269Smckusick 		return (0);
46816269Smckusick 
46916269Smckusick 	default:
47016269Smckusick 		errexit("UNKNOWN INODESC FIX MODE %d\n", idesc->id_fix);
47116269Smckusick 	}
47216269Smckusick 	/* NOTREACHED */
47316269Smckusick }
47416269Smckusick 
47516269Smckusick /* VARARGS1 */
47617931Smckusick errexit(s1, s2, s3, s4)
47716269Smckusick 	char *s1;
47816269Smckusick {
47916269Smckusick 	printf(s1, s2, s3, s4);
48016269Smckusick 	exit(8);
48116269Smckusick }
48216269Smckusick 
48316269Smckusick /*
48439973Smckusick  * An unexpected inconsistency occured.
48539973Smckusick  * Die if preening, otherwise just print message and continue.
48616269Smckusick  */
48716269Smckusick /* VARARGS1 */
48816269Smckusick pfatal(s, a1, a2, a3)
48916269Smckusick 	char *s;
49016269Smckusick {
49116269Smckusick 
49216269Smckusick 	if (preen) {
49316269Smckusick 		printf("%s: ", devname);
49416269Smckusick 		printf(s, a1, a2, a3);
49516269Smckusick 		printf("\n");
49617931Smckusick 		printf("%s: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.\n",
49717931Smckusick 			devname);
49817931Smckusick 		exit(8);
49916269Smckusick 	}
50016269Smckusick 	printf(s, a1, a2, a3);
50116269Smckusick }
50216269Smckusick 
50316269Smckusick /*
50439973Smckusick  * Pwarn just prints a message when not preening,
50516269Smckusick  * or a warning (preceded by filename) when preening.
50616269Smckusick  */
50716269Smckusick /* VARARGS1 */
50816269Smckusick pwarn(s, a1, a2, a3, a4, a5, a6)
50916269Smckusick 	char *s;
51016269Smckusick {
51116269Smckusick 
51216269Smckusick 	if (preen)
51316269Smckusick 		printf("%s: ", devname);
51416269Smckusick 	printf(s, a1, a2, a3, a4, a5, a6);
51516269Smckusick }
51616269Smckusick 
51716269Smckusick #ifndef lint
51816269Smckusick /*
51916269Smckusick  * Stub for routines from kernel.
52016269Smckusick  */
52116269Smckusick panic(s)
52216269Smckusick 	char *s;
52316269Smckusick {
52416269Smckusick 
52517931Smckusick 	pfatal("INTERNAL INCONSISTENCY:");
52617931Smckusick 	errexit(s);
52716269Smckusick }
52816269Smckusick #endif
529