122055Sdist /* 261492Sbostic * Copyright (c) 1980, 1986, 1993 361492Sbostic * The Regents of the University of California. All rights reserved. 439976Smckusick * 542702Sbostic * %sccs.include.redist.c% 622055Sdist */ 722055Sdist 816269Smckusick #ifndef lint 9*69319Smckusick static char sccsid[] = "@(#)utilities.c 8.5 (Berkeley) 05/09/95"; 1039976Smckusick #endif /* not lint */ 1116269Smckusick 1216269Smckusick #include <sys/param.h> 1353703Smckusick #include <sys/time.h> 1468908Smckusick 1551532Sbostic #include <ufs/ufs/dinode.h> 1651532Sbostic #include <ufs/ufs/dir.h> 1751532Sbostic #include <ufs/ffs/fs.h> 1868908Smckusick 1968908Smckusick #include <ctype.h> 2068908Smckusick #include <err.h> 2144934Smckusick #include <string.h> 2268908Smckusick 2316269Smckusick #include "fsck.h" 2416269Smckusick 2534225Smckusick long diskreads, totalreads; /* Disk cache statistics */ 2616269Smckusick 2768908Smckusick static void rwerror __P((char *mesg, ufs_daddr_t blk)); 2868908Smckusick 2968908Smckusick int 3016269Smckusick ftypeok(dp) 3139973Smckusick struct dinode *dp; 3216269Smckusick { 3316269Smckusick switch (dp->di_mode & IFMT) { 3416269Smckusick 3516269Smckusick case IFDIR: 3616269Smckusick case IFREG: 3716269Smckusick case IFBLK: 3816269Smckusick case IFCHR: 3916269Smckusick case IFLNK: 4016269Smckusick case IFSOCK: 4142943Smckusick case IFIFO: 4216269Smckusick return (1); 4316269Smckusick 4416269Smckusick default: 4516269Smckusick if (debug) 4616269Smckusick printf("bad file type 0%o\n", dp->di_mode); 4716269Smckusick return (0); 4816269Smckusick } 4916269Smckusick } 5016269Smckusick 5168908Smckusick int 5239975Smckusick reply(question) 5339975Smckusick char *question; 5416269Smckusick { 5539975Smckusick int persevere; 5639975Smckusick char c; 5716269Smckusick 5816269Smckusick if (preen) 5916269Smckusick pfatal("INTERNAL ERROR: GOT TO reply()"); 6039975Smckusick persevere = !strcmp(question, "CONTINUE"); 6139975Smckusick printf("\n"); 6239975Smckusick if (!persevere && (nflag || fswritefd < 0)) { 6339975Smckusick printf("%s? no\n\n", question); 6416269Smckusick return (0); 6516269Smckusick } 6639975Smckusick if (yflag || (persevere && nflag)) { 6739975Smckusick printf("%s? yes\n\n", question); 6816269Smckusick return (1); 6916269Smckusick } 7039975Smckusick do { 7139975Smckusick printf("%s? [yn] ", question); 7239975Smckusick (void) fflush(stdout); 7339975Smckusick c = getc(stdin); 7439975Smckusick while (c != '\n' && getc(stdin) != '\n') 7539975Smckusick if (feof(stdin)) 7639975Smckusick return (0); 7739975Smckusick } while (c != 'y' && c != 'Y' && c != 'n' && c != 'N'); 7816269Smckusick printf("\n"); 7939975Smckusick if (c == 'y' || c == 'Y') 8016269Smckusick return (1); 8139975Smckusick return (0); 8216269Smckusick } 8316269Smckusick 8434225Smckusick /* 8534225Smckusick * Malloc buffers and set up cache. 8634225Smckusick */ 8768908Smckusick void 8834225Smckusick bufinit() 8934225Smckusick { 9039973Smckusick register struct bufarea *bp; 9134225Smckusick long bufcnt, i; 9234225Smckusick char *bufp; 9334225Smckusick 9440649Smckusick pbp = pdirbp = (struct bufarea *)0; 9539973Smckusick bufp = malloc((unsigned int)sblock.fs_bsize); 9634225Smckusick if (bufp == 0) 9768908Smckusick errx(EEXIT, "cannot allocate buffer pool"); 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; 11068908Smckusick errx(EEXIT, "cannot allocate buffer pool"); 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) 12768548Smckusick ufs_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) 13968908Smckusick errx(EEXIT, "deadlocked buffer pool"); 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 15444934Smckusick void 15516269Smckusick getblk(bp, blk, size) 15639973Smckusick register struct bufarea *bp; 15768548Smckusick ufs_daddr_t blk; 15816269Smckusick long size; 15916269Smckusick { 16068548Smckusick ufs_daddr_t dblk; 16116269Smckusick 16234671Smckusick dblk = fsbtodb(&sblock, blk); 16344934Smckusick if (bp->b_bno != dblk) { 16444934Smckusick flush(fswritefd, bp); 16544934Smckusick diskreads++; 16644934Smckusick bp->b_errs = bread(fsreadfd, bp->b_un.b_buf, dblk, size); 16744934Smckusick bp->b_bno = dblk; 16844934Smckusick bp->b_size = size; 16944934Smckusick } 17016269Smckusick } 17116269Smckusick 17268908Smckusick void 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 19868908Smckusick static void 19939973Smckusick rwerror(mesg, blk) 20039973Smckusick char *mesg; 20168548Smckusick ufs_daddr_t blk; 20216269Smckusick { 20316269Smckusick 20416269Smckusick if (preen == 0) 20516269Smckusick printf("\n"); 20639973Smckusick pfatal("CANNOT %s: BLK %ld", mesg, blk); 20716269Smckusick if (reply("CONTINUE") == 0) 20868908Smckusick exit(EEXIT); 20916269Smckusick } 21016269Smckusick 21168908Smckusick void 212*69319Smckusick ckfini(markclean) 213*69319Smckusick int markclean; 21416269Smckusick { 21539973Smckusick register struct bufarea *bp, *nbp; 21634482Smckusick int cnt = 0; 21716269Smckusick 21856809Smckusick if (fswritefd < 0) { 21956809Smckusick (void)close(fsreadfd); 22056809Smckusick return; 22156809Smckusick } 22239973Smckusick flush(fswritefd, &sblk); 22330859Skarels if (havesb && sblk.b_bno != SBOFF / dev_bsize && 22430518Smckusick !preen && reply("UPDATE STANDARD SUPERBLOCK")) { 22530556Smckusick sblk.b_bno = SBOFF / dev_bsize; 22616269Smckusick sbdirty(); 22739973Smckusick flush(fswritefd, &sblk); 22816269Smckusick } 22939973Smckusick flush(fswritefd, &cgblk); 23038342Smckusick free(cgblk.b_un.b_buf); 23156809Smckusick for (bp = bufhead.b_prev; bp && bp != &bufhead; bp = nbp) { 23234482Smckusick cnt++; 23339973Smckusick flush(fswritefd, bp); 23438342Smckusick nbp = bp->b_prev; 23538342Smckusick free(bp->b_un.b_buf); 23638342Smckusick free((char *)bp); 23734482Smckusick } 23834482Smckusick if (bufhead.b_size != cnt) 23968908Smckusick errx(EEXIT, "Panic: lost %d buffers", bufhead.b_size - cnt); 24040649Smckusick pbp = pdirbp = (struct bufarea *)0; 241*69319Smckusick if (markclean && sblock.fs_clean == 0) { 242*69319Smckusick if (debug) 243*69319Smckusick pwarn("MARKING FILE SYSTEM CLEAN\n"); 244*69319Smckusick sblock.fs_clean = 1; 245*69319Smckusick sbdirty(); 246*69319Smckusick flush(fswritefd, &sblk); 247*69319Smckusick } 24834225Smckusick if (debug) 24944934Smckusick printf("cache missed %ld of %ld (%d%%)\n", diskreads, 25044934Smckusick totalreads, (int)(diskreads * 100 / totalreads)); 25139973Smckusick (void)close(fsreadfd); 25239973Smckusick (void)close(fswritefd); 25316269Smckusick } 25416269Smckusick 25568908Smckusick int 25639973Smckusick bread(fd, buf, blk, size) 25739973Smckusick int fd; 25816269Smckusick char *buf; 25968548Smckusick ufs_daddr_t blk; 26016269Smckusick long size; 26116269Smckusick { 26221540Smckusick char *cp; 26321540Smckusick int i, errs; 26460638Smckusick off_t offset; 26521540Smckusick 26660638Smckusick offset = blk; 26760638Smckusick offset *= dev_bsize; 26860638Smckusick if (lseek(fd, offset, 0) < 0) 26939973Smckusick rwerror("SEEK", blk); 27039973Smckusick else if (read(fd, buf, (int)size) == size) 27121540Smckusick return (0); 27239973Smckusick rwerror("READ", blk); 27360638Smckusick if (lseek(fd, offset, 0) < 0) 27439973Smckusick rwerror("SEEK", blk); 27521540Smckusick errs = 0; 27668992Sbostic memset(buf, 0, (size_t)size); 27730609Skarels printf("THE FOLLOWING DISK SECTORS COULD NOT BE READ:"); 27830609Skarels for (cp = buf, i = 0; i < size; i += secsize, cp += secsize) { 27944999Smckusick if (read(fd, cp, (int)secsize) != secsize) { 28060638Smckusick (void)lseek(fd, offset + i + secsize, 0); 28130859Skarels if (secsize != dev_bsize && dev_bsize != 1) 28244934Smckusick printf(" %ld (%ld),", 28330609Skarels (blk * dev_bsize + i) / secsize, 28430609Skarels blk + i / dev_bsize); 28530609Skarels else 28644934Smckusick printf(" %ld,", blk + i / dev_bsize); 28721540Smckusick errs++; 28821540Smckusick } 28921540Smckusick } 29021758Smckusick printf("\n"); 29121540Smckusick return (errs); 29216269Smckusick } 29316269Smckusick 29468908Smckusick void 29539973Smckusick bwrite(fd, buf, blk, size) 29639973Smckusick int fd; 29716269Smckusick char *buf; 29868548Smckusick ufs_daddr_t blk; 29916269Smckusick long size; 30016269Smckusick { 30121758Smckusick int i; 30221758Smckusick char *cp; 30360638Smckusick off_t offset; 30416269Smckusick 30539973Smckusick if (fd < 0) 30621758Smckusick return; 30760638Smckusick offset = blk; 30860638Smckusick offset *= dev_bsize; 30960638Smckusick if (lseek(fd, offset, 0) < 0) 31039973Smckusick rwerror("SEEK", blk); 31139973Smckusick else if (write(fd, buf, (int)size) == size) { 31239973Smckusick fsmodified = 1; 31321758Smckusick return; 31416269Smckusick } 31539973Smckusick rwerror("WRITE", blk); 31660638Smckusick if (lseek(fd, offset, 0) < 0) 31739973Smckusick rwerror("SEEK", blk); 31830609Skarels printf("THE FOLLOWING SECTORS COULD NOT BE WRITTEN:"); 31930518Smckusick for (cp = buf, i = 0; i < size; i += dev_bsize, cp += dev_bsize) 32044999Smckusick if (write(fd, cp, (int)dev_bsize) != dev_bsize) { 32160638Smckusick (void)lseek(fd, offset + i + dev_bsize, 0); 32244934Smckusick printf(" %ld,", blk + i / dev_bsize); 32330395Smckusick } 32421758Smckusick printf("\n"); 32521758Smckusick return; 32616269Smckusick } 32716269Smckusick 32817944Smckusick /* 32917944Smckusick * allocate a data block with the specified number of fragments 33017944Smckusick */ 33168908Smckusick ufs_daddr_t 33217944Smckusick allocblk(frags) 33339973Smckusick long frags; 33417944Smckusick { 33517944Smckusick register int i, j, k; 33617944Smckusick 33717944Smckusick if (frags <= 0 || frags > sblock.fs_frag) 33817944Smckusick return (0); 33939973Smckusick for (i = 0; i < maxfsblock - sblock.fs_frag; i += sblock.fs_frag) { 34017944Smckusick for (j = 0; j <= sblock.fs_frag - frags; j++) { 34139973Smckusick if (testbmap(i + j)) 34217944Smckusick continue; 34317944Smckusick for (k = 1; k < frags; k++) 34439973Smckusick if (testbmap(i + j + k)) 34517944Smckusick break; 34617944Smckusick if (k < frags) { 34717944Smckusick j += k; 34817944Smckusick continue; 34917944Smckusick } 35017944Smckusick for (k = 0; k < frags; k++) 35117944Smckusick setbmap(i + j + k); 35217944Smckusick n_blks += frags; 35317944Smckusick return (i + j); 35417944Smckusick } 35517944Smckusick } 35617944Smckusick return (0); 35717944Smckusick } 35817944Smckusick 35917944Smckusick /* 36017944Smckusick * Free a previously allocated block 36117944Smckusick */ 36268908Smckusick void 36317944Smckusick freeblk(blkno, frags) 36468548Smckusick ufs_daddr_t blkno; 36539973Smckusick long frags; 36617944Smckusick { 36717944Smckusick struct inodesc idesc; 36817944Smckusick 36917944Smckusick idesc.id_blkno = blkno; 37017944Smckusick idesc.id_numfrags = frags; 37144934Smckusick (void)pass4check(&idesc); 37217944Smckusick } 37317944Smckusick 37417991Smckusick /* 37517991Smckusick * Find a pathname 37617991Smckusick */ 37768908Smckusick void 37817991Smckusick getpathname(namebuf, curdir, ino) 37917991Smckusick char *namebuf; 38017991Smckusick ino_t curdir, ino; 38117991Smckusick { 38217991Smckusick int len; 38317991Smckusick register char *cp; 38417991Smckusick struct inodesc idesc; 38544999Smckusick static int busy = 0; 38617991Smckusick extern int findname(); 38717991Smckusick 38854600Smckusick if (curdir == ino && ino == ROOTINO) { 38954600Smckusick (void)strcpy(namebuf, "/"); 39054600Smckusick return; 39154600Smckusick } 39244999Smckusick if (busy || 39344999Smckusick (statemap[curdir] != DSTATE && statemap[curdir] != DFOUND)) { 39444934Smckusick (void)strcpy(namebuf, "?"); 39517991Smckusick return; 39617991Smckusick } 39744999Smckusick busy = 1; 39868992Sbostic memset(&idesc, 0, sizeof(struct inodesc)); 39917991Smckusick idesc.id_type = DATA; 40044999Smckusick idesc.id_fix = IGNORE; 40140646Smckusick cp = &namebuf[MAXPATHLEN - 1]; 40230354Smckusick *cp = '\0'; 40317991Smckusick if (curdir != ino) { 40417991Smckusick idesc.id_parent = curdir; 40517991Smckusick goto namelookup; 40617991Smckusick } 40717991Smckusick while (ino != ROOTINO) { 40817991Smckusick idesc.id_number = ino; 40917991Smckusick idesc.id_func = findino; 41017991Smckusick idesc.id_name = ".."; 41140019Smckusick if ((ckinode(ginode(ino), &idesc) & FOUND) == 0) 41217991Smckusick break; 41317991Smckusick namelookup: 41417991Smckusick idesc.id_number = idesc.id_parent; 41517991Smckusick idesc.id_parent = ino; 41617991Smckusick idesc.id_func = findname; 41717991Smckusick idesc.id_name = namebuf; 41840019Smckusick if ((ckinode(ginode(idesc.id_number), &idesc)&FOUND) == 0) 41917991Smckusick break; 42017991Smckusick len = strlen(namebuf); 42117991Smckusick cp -= len; 42268992Sbostic memmove(cp, namebuf, (size_t)len); 42350572Smckusick *--cp = '/'; 42417991Smckusick if (cp < &namebuf[MAXNAMLEN]) 42517991Smckusick break; 42617991Smckusick ino = idesc.id_number; 42717991Smckusick } 42844999Smckusick busy = 0; 42950572Smckusick if (ino != ROOTINO) 43050572Smckusick *--cp = '?'; 43168992Sbostic memmove(namebuf, cp, (size_t)(&namebuf[MAXPATHLEN] - cp)); 43217991Smckusick } 43317991Smckusick 43439165Sbostic void 43568908Smckusick catch(sig) 43668908Smckusick int sig; 43716269Smckusick { 43854600Smckusick if (!doinglevel2) 439*69319Smckusick ckfini(0); 44016269Smckusick exit(12); 44116269Smckusick } 44216269Smckusick 44316269Smckusick /* 44424680Skarels * When preening, allow a single quit to signal 44524680Skarels * a special exit after filesystem checks complete 44624680Skarels * so that reboot sequence may be interrupted. 44724680Skarels */ 44839165Sbostic void 44968908Smckusick catchquit(sig) 45068908Smckusick int sig; 45124680Skarels { 45224680Skarels extern returntosingle; 45324680Skarels 45424680Skarels printf("returning to single-user after filesystem check\n"); 45524680Skarels returntosingle = 1; 45624680Skarels (void)signal(SIGQUIT, SIG_DFL); 45724680Skarels } 45824680Skarels 45924680Skarels /* 46024680Skarels * Ignore a single quit signal; wait and flush just in case. 46124680Skarels * Used by child processes in preen. 46224680Skarels */ 46339165Sbostic void 46468908Smckusick voidquit(sig) 46568908Smckusick int sig; 46624680Skarels { 46724680Skarels 46824680Skarels sleep(1); 46924680Skarels (void)signal(SIGQUIT, SIG_IGN); 47024680Skarels (void)signal(SIGQUIT, SIG_DFL); 47124680Skarels } 47224680Skarels 47324680Skarels /* 47416269Smckusick * determine whether an inode should be fixed. 47516269Smckusick */ 47668908Smckusick int 47717931Smckusick dofix(idesc, msg) 47816269Smckusick register struct inodesc *idesc; 47917931Smckusick char *msg; 48016269Smckusick { 48116269Smckusick 48216269Smckusick switch (idesc->id_fix) { 48316269Smckusick 48416269Smckusick case DONTKNOW: 48517931Smckusick if (idesc->id_type == DATA) 48639973Smckusick direrror(idesc->id_number, msg); 48717931Smckusick else 48817931Smckusick pwarn(msg); 48917931Smckusick if (preen) { 49017931Smckusick printf(" (SALVAGED)\n"); 49117931Smckusick idesc->id_fix = FIX; 49217931Smckusick return (ALTERED); 49317931Smckusick } 49416269Smckusick if (reply("SALVAGE") == 0) { 49516269Smckusick idesc->id_fix = NOFIX; 49616269Smckusick return (0); 49716269Smckusick } 49816269Smckusick idesc->id_fix = FIX; 49916269Smckusick return (ALTERED); 50016269Smckusick 50116269Smckusick case FIX: 50216269Smckusick return (ALTERED); 50316269Smckusick 50416269Smckusick case NOFIX: 50544999Smckusick case IGNORE: 50616269Smckusick return (0); 50716269Smckusick 50816269Smckusick default: 50968908Smckusick errx(EEXIT, "UNKNOWN INODESC FIX MODE %d", idesc->id_fix); 51016269Smckusick } 51116269Smckusick /* NOTREACHED */ 51268908Smckusick return (0); 51316269Smckusick } 51416269Smckusick 51568908Smckusick #if __STDC__ 51668908Smckusick #include <stdarg.h> 51768908Smckusick #else 51868908Smckusick #include <varargs.h> 51968908Smckusick #endif 52016269Smckusick 52116269Smckusick /* 52239973Smckusick * An unexpected inconsistency occured. 52339973Smckusick * Die if preening, otherwise just print message and continue. 52416269Smckusick */ 52568908Smckusick void 52668908Smckusick #if __STDC__ 52768908Smckusick pfatal(const char *fmt, ...) 52868908Smckusick #else 52968908Smckusick pfatal(fmt, va_alist) 53068908Smckusick char *fmt; 53168908Smckusick va_dcl 53268908Smckusick #endif 53316269Smckusick { 53468908Smckusick va_list ap; 53568908Smckusick #if __STDC__ 53668908Smckusick va_start(ap, fmt); 53768908Smckusick #else 53868908Smckusick va_start(ap); 53968908Smckusick #endif 54068908Smckusick if (!preen) { 54168908Smckusick (void)vfprintf(stderr, fmt, ap); 54268908Smckusick va_end(ap); 54368908Smckusick return; 54416269Smckusick } 54568908Smckusick (void)fprintf(stderr, "%s: ", cdevname); 54668908Smckusick (void)vfprintf(stderr, fmt, ap); 54768908Smckusick (void)fprintf(stderr, 54868908Smckusick "\n%s: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.\n", 54968908Smckusick cdevname); 55068908Smckusick exit(EEXIT); 55116269Smckusick } 55216269Smckusick 55316269Smckusick /* 55439973Smckusick * Pwarn just prints a message when not preening, 55516269Smckusick * or a warning (preceded by filename) when preening. 55616269Smckusick */ 55768908Smckusick void 55868908Smckusick #if __STDC__ 55968908Smckusick pwarn(const char *fmt, ...) 56068908Smckusick #else 56168908Smckusick pwarn(fmt, va_alist) 56268908Smckusick char *fmt; 56368908Smckusick va_dcl 56468908Smckusick #endif 56516269Smckusick { 56668908Smckusick va_list ap; 56768908Smckusick #if __STDC__ 56868908Smckusick va_start(ap, fmt); 56968908Smckusick #else 57068908Smckusick va_start(ap); 57168908Smckusick #endif 57216269Smckusick if (preen) 57368908Smckusick (void)fprintf(stderr, "%s: ", cdevname); 57468908Smckusick (void)vfprintf(stderr, fmt, ap); 57568908Smckusick va_end(ap); 57616269Smckusick } 57716269Smckusick 57816269Smckusick /* 57916269Smckusick * Stub for routines from kernel. 58016269Smckusick */ 58168908Smckusick void 58268908Smckusick #if __STDC__ 58368908Smckusick panic(const char *fmt, ...) 58468908Smckusick #else 58568908Smckusick panic(fmt, va_alist) 58668908Smckusick char *fmt; 58768908Smckusick va_dcl 58868908Smckusick #endif 58916269Smckusick { 59068908Smckusick va_list ap; 59168908Smckusick #if __STDC__ 59268908Smckusick va_start(ap, fmt); 59368908Smckusick #else 59468908Smckusick va_start(ap); 59568908Smckusick #endif 59617931Smckusick pfatal("INTERNAL INCONSISTENCY:"); 59768908Smckusick (void)vfprintf(stderr, fmt, ap); 59868908Smckusick va_end(ap); 59968908Smckusick exit(EEXIT); 60016269Smckusick } 601