139bb6d1eSPeter Wemm /* $NetBSD: fsdbutil.c,v 1.2 1995/10/08 23:18:12 thorpej Exp $ */ 239bb6d1eSPeter Wemm 339bb6d1eSPeter Wemm /* 439bb6d1eSPeter Wemm * Copyright (c) 1995 John T. Kohl 539bb6d1eSPeter Wemm * All rights reserved. 639bb6d1eSPeter Wemm * 739bb6d1eSPeter Wemm * Redistribution and use in source and binary forms, with or without 839bb6d1eSPeter Wemm * modification, are permitted provided that the following conditions 939bb6d1eSPeter Wemm * are met: 1039bb6d1eSPeter Wemm * 1. Redistributions of source code must retain the above copyright 1139bb6d1eSPeter Wemm * notice, this list of conditions and the following disclaimer. 1239bb6d1eSPeter Wemm * 2. Redistributions in binary form must reproduce the above copyright 1339bb6d1eSPeter Wemm * notice, this list of conditions and the following disclaimer in the 1439bb6d1eSPeter Wemm * documentation and/or other materials provided with the distribution. 1539bb6d1eSPeter Wemm * 3. The name of the author may not be used to endorse or promote products 1639bb6d1eSPeter Wemm * derived from this software without specific prior written permission. 1739bb6d1eSPeter Wemm * 1839bb6d1eSPeter Wemm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR 1939bb6d1eSPeter Wemm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 2039bb6d1eSPeter Wemm * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2139bb6d1eSPeter Wemm * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 2239bb6d1eSPeter Wemm * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 2339bb6d1eSPeter Wemm * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 2439bb6d1eSPeter Wemm * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2539bb6d1eSPeter Wemm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 2639bb6d1eSPeter Wemm * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 2739bb6d1eSPeter Wemm * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2839bb6d1eSPeter Wemm * POSSIBILITY OF SUCH DAMAGE. 2939bb6d1eSPeter Wemm */ 3039bb6d1eSPeter Wemm 3139bb6d1eSPeter Wemm #ifndef lint 320227048aSPhilippe Charnier static const char rcsid[] = 337f3dea24SPeter Wemm "$FreeBSD$"; 3439bb6d1eSPeter Wemm #endif /* not lint */ 3539bb6d1eSPeter Wemm 369eb8ec95SAlfred Perlstein #include <sys/param.h> 3739bb6d1eSPeter Wemm #include <ctype.h> 380227048aSPhilippe Charnier #include <err.h> 3939bb6d1eSPeter Wemm #include <grp.h> 4039bb6d1eSPeter Wemm #include <pwd.h> 418b5e064dSJohan Karlsson #include <stdint.h> 4239bb6d1eSPeter Wemm #include <string.h> 430227048aSPhilippe Charnier #include <time.h> 448b5e064dSJohan Karlsson #include <timeconv.h> 4539bb6d1eSPeter Wemm 4639bb6d1eSPeter Wemm #include <ufs/ufs/dinode.h> 479eb8ec95SAlfred Perlstein #include <ufs/ffs/fs.h> 4839bb6d1eSPeter Wemm 49280a49ecSJoerg Wunsch #include <sys/ioctl.h> 50280a49ecSJoerg Wunsch 5139bb6d1eSPeter Wemm #include "fsdb.h" 5239bb6d1eSPeter Wemm #include "fsck.h" 5339bb6d1eSPeter Wemm 540638cc1aSWarner Losh static int charsperline(void); 55113db2ddSJeff Roberson static void printindir(ufs2_daddr_t blk, int level, char *bufp); 561c85e6a3SKirk McKusick static void printblocks(ino_t inum, union dinode *dp); 57280a49ecSJoerg Wunsch 5839bb6d1eSPeter Wemm char ** 590638cc1aSWarner Losh crack(char *line, int *argc) 6039bb6d1eSPeter Wemm { 6139bb6d1eSPeter Wemm static char *argv[8]; 6239bb6d1eSPeter Wemm int i; 6339bb6d1eSPeter Wemm char *p, *val; 6439bb6d1eSPeter Wemm for (p = line, i = 0; p != NULL && i < 8; i++) { 6539bb6d1eSPeter Wemm while ((val = strsep(&p, " \t\n")) != NULL && *val == '\0') 6639bb6d1eSPeter Wemm /**/; 6739bb6d1eSPeter Wemm if (val) 6839bb6d1eSPeter Wemm argv[i] = val; 6939bb6d1eSPeter Wemm else 7039bb6d1eSPeter Wemm break; 7139bb6d1eSPeter Wemm } 7239bb6d1eSPeter Wemm *argc = i; 7339bb6d1eSPeter Wemm return argv; 7439bb6d1eSPeter Wemm } 7539bb6d1eSPeter Wemm 768660ce22SBrian Feldman char ** 770638cc1aSWarner Losh recrack(char *line, int *argc, int argc_max) 788660ce22SBrian Feldman { 798660ce22SBrian Feldman static char *argv[8]; 808660ce22SBrian Feldman int i; 818660ce22SBrian Feldman char *p, *val; 828660ce22SBrian Feldman for (p = line, i = 0; p != NULL && i < 8 && i < argc_max - 1; i++) { 838660ce22SBrian Feldman while ((val = strsep(&p, " \t\n")) != NULL && *val == '\0') 848660ce22SBrian Feldman /**/; 858660ce22SBrian Feldman if (val) 868660ce22SBrian Feldman argv[i] = val; 878660ce22SBrian Feldman else 888660ce22SBrian Feldman break; 898660ce22SBrian Feldman } 908660ce22SBrian Feldman argv[i] = argv[i - 1] + strlen(argv[i - 1]) + 1; 918660ce22SBrian Feldman argv[i][strcspn(argv[i], "\n")] = '\0'; 928660ce22SBrian Feldman *argc = i + 1; 938660ce22SBrian Feldman return argv; 948660ce22SBrian Feldman } 958660ce22SBrian Feldman 9639bb6d1eSPeter Wemm int 970638cc1aSWarner Losh argcount(struct cmdtable *cmdp, int argc, char *argv[]) 9839bb6d1eSPeter Wemm { 9939bb6d1eSPeter Wemm if (cmdp->minargc == cmdp->maxargc) 1008660ce22SBrian Feldman warnx("command `%s' takes %u arguments, got %u", cmdp->cmd, 1011bc50849SMaxim Konovalov cmdp->minargc-1, argc-1); 10239bb6d1eSPeter Wemm else 10339bb6d1eSPeter Wemm warnx("command `%s' takes from %u to %u arguments", 10439bb6d1eSPeter Wemm cmdp->cmd, cmdp->minargc-1, cmdp->maxargc-1); 10539bb6d1eSPeter Wemm 10639bb6d1eSPeter Wemm warnx("usage: %s: %s", cmdp->cmd, cmdp->helptxt); 10739bb6d1eSPeter Wemm return 1; 10839bb6d1eSPeter Wemm } 10939bb6d1eSPeter Wemm 11039bb6d1eSPeter Wemm void 1111c85e6a3SKirk McKusick printstat(const char *cp, ino_t inum, union dinode *dp) 11239bb6d1eSPeter Wemm { 11339bb6d1eSPeter Wemm struct group *grp; 11439bb6d1eSPeter Wemm struct passwd *pw; 1151c85e6a3SKirk McKusick ufs2_daddr_t blocks; 1161c85e6a3SKirk McKusick int64_t gen; 11739bb6d1eSPeter Wemm char *p; 118962cf4d3SBruce Evans time_t t; 11939bb6d1eSPeter Wemm 12039bb6d1eSPeter Wemm printf("%s: ", cp); 1211c85e6a3SKirk McKusick switch (DIP(dp, di_mode) & IFMT) { 12239bb6d1eSPeter Wemm case IFDIR: 12339bb6d1eSPeter Wemm puts("directory"); 12439bb6d1eSPeter Wemm break; 12539bb6d1eSPeter Wemm case IFREG: 12639bb6d1eSPeter Wemm puts("regular file"); 12739bb6d1eSPeter Wemm break; 12839bb6d1eSPeter Wemm case IFBLK: 129*9f365aa1SEd Schouten printf("block special (%#jx)", (uintmax_t)DIP(dp, di_rdev)); 13039bb6d1eSPeter Wemm break; 13139bb6d1eSPeter Wemm case IFCHR: 132*9f365aa1SEd Schouten printf("character special (%#jx)", DIP(dp, di_rdev)); 13339bb6d1eSPeter Wemm break; 13439bb6d1eSPeter Wemm case IFLNK: 13539bb6d1eSPeter Wemm fputs("symlink",stdout); 1361c85e6a3SKirk McKusick if (DIP(dp, di_size) > 0 && 1371c85e6a3SKirk McKusick DIP(dp, di_size) < sblock.fs_maxsymlinklen && 1381c85e6a3SKirk McKusick DIP(dp, di_blocks) == 0) { 1391c85e6a3SKirk McKusick if (sblock.fs_magic == FS_UFS1_MAGIC) 1401c85e6a3SKirk McKusick p = (caddr_t)dp->dp1.di_db; 14139bb6d1eSPeter Wemm else 1421c85e6a3SKirk McKusick p = (caddr_t)dp->dp2.di_db; 1431c85e6a3SKirk McKusick printf(" to `%.*s'\n", (int) DIP(dp, di_size), p); 1441c85e6a3SKirk McKusick } else { 14539bb6d1eSPeter Wemm putchar('\n'); 1461c85e6a3SKirk McKusick } 14739bb6d1eSPeter Wemm break; 14839bb6d1eSPeter Wemm case IFSOCK: 14939bb6d1eSPeter Wemm puts("socket"); 15039bb6d1eSPeter Wemm break; 15139bb6d1eSPeter Wemm case IFIFO: 15239bb6d1eSPeter Wemm puts("fifo"); 15339bb6d1eSPeter Wemm break; 15439bb6d1eSPeter Wemm } 1558b5e064dSJohan Karlsson printf("I=%lu MODE=%o SIZE=%ju", (u_long)inum, DIP(dp, di_mode), 1568b5e064dSJohan Karlsson (uintmax_t)DIP(dp, di_size)); 15796dd6360SCeri Davies if (sblock.fs_magic != FS_UFS1_MAGIC) { 15896dd6360SCeri Davies t = _time64_to_time(dp->dp2.di_birthtime); 15996dd6360SCeri Davies p = ctime(&t); 16096dd6360SCeri Davies printf("\n\tBTIME=%15.15s %4.4s [%d nsec]", &p[4], &p[20], 16196dd6360SCeri Davies dp->dp2.di_birthnsec); 16296dd6360SCeri Davies } 1631c85e6a3SKirk McKusick if (sblock.fs_magic == FS_UFS1_MAGIC) 1641c85e6a3SKirk McKusick t = _time32_to_time(dp->dp1.di_mtime); 1651c85e6a3SKirk McKusick else 1661c85e6a3SKirk McKusick t = _time64_to_time(dp->dp2.di_mtime); 167962cf4d3SBruce Evans p = ctime(&t); 16839bb6d1eSPeter Wemm printf("\n\tMTIME=%15.15s %4.4s [%d nsec]", &p[4], &p[20], 1691c85e6a3SKirk McKusick DIP(dp, di_mtimensec)); 1701c85e6a3SKirk McKusick if (sblock.fs_magic == FS_UFS1_MAGIC) 1711c85e6a3SKirk McKusick t = _time32_to_time(dp->dp1.di_ctime); 1721c85e6a3SKirk McKusick else 1731c85e6a3SKirk McKusick t = _time64_to_time(dp->dp2.di_ctime); 174962cf4d3SBruce Evans p = ctime(&t); 17539bb6d1eSPeter Wemm printf("\n\tCTIME=%15.15s %4.4s [%d nsec]", &p[4], &p[20], 1761c85e6a3SKirk McKusick DIP(dp, di_ctimensec)); 1771c85e6a3SKirk McKusick if (sblock.fs_magic == FS_UFS1_MAGIC) 1781c85e6a3SKirk McKusick t = _time32_to_time(dp->dp1.di_atime); 1791c85e6a3SKirk McKusick else 1801c85e6a3SKirk McKusick t = _time64_to_time(dp->dp2.di_atime); 181962cf4d3SBruce Evans p = ctime(&t); 18239bb6d1eSPeter Wemm printf("\n\tATIME=%15.15s %4.4s [%d nsec]\n", &p[4], &p[20], 1831c85e6a3SKirk McKusick DIP(dp, di_atimensec)); 18439bb6d1eSPeter Wemm 1851c85e6a3SKirk McKusick if ((pw = getpwuid(DIP(dp, di_uid)))) 18639bb6d1eSPeter Wemm printf("OWNER=%s ", pw->pw_name); 18739bb6d1eSPeter Wemm else 1881c85e6a3SKirk McKusick printf("OWNUID=%u ", DIP(dp, di_uid)); 1891c85e6a3SKirk McKusick if ((grp = getgrgid(DIP(dp, di_gid)))) 19039bb6d1eSPeter Wemm printf("GRP=%s ", grp->gr_name); 19139bb6d1eSPeter Wemm else 1921c85e6a3SKirk McKusick printf("GID=%u ", DIP(dp, di_gid)); 19339bb6d1eSPeter Wemm 1941c85e6a3SKirk McKusick blocks = DIP(dp, di_blocks); 1951c85e6a3SKirk McKusick gen = DIP(dp, di_gen); 1968b5e064dSJohan Karlsson printf("LINKCNT=%hd FLAGS=%#x BLKCNT=%jx GEN=%jx\n", DIP(dp, di_nlink), 1978b5e064dSJohan Karlsson DIP(dp, di_flags), (intmax_t)blocks, (intmax_t)gen); 19839bb6d1eSPeter Wemm } 19939bb6d1eSPeter Wemm 200280a49ecSJoerg Wunsch 201280a49ecSJoerg Wunsch /* 202280a49ecSJoerg Wunsch * Determine the number of characters in a 203280a49ecSJoerg Wunsch * single line. 204280a49ecSJoerg Wunsch */ 205280a49ecSJoerg Wunsch 206280a49ecSJoerg Wunsch static int 2070638cc1aSWarner Losh charsperline(void) 208280a49ecSJoerg Wunsch { 209280a49ecSJoerg Wunsch int columns; 210280a49ecSJoerg Wunsch char *cp; 211280a49ecSJoerg Wunsch struct winsize ws; 212280a49ecSJoerg Wunsch 213280a49ecSJoerg Wunsch columns = 0; 214280a49ecSJoerg Wunsch if (ioctl(0, TIOCGWINSZ, &ws) != -1) 215280a49ecSJoerg Wunsch columns = ws.ws_col; 216280a49ecSJoerg Wunsch if (columns == 0 && (cp = getenv("COLUMNS"))) 217280a49ecSJoerg Wunsch columns = atoi(cp); 218280a49ecSJoerg Wunsch if (columns == 0) 219280a49ecSJoerg Wunsch columns = 80; /* last resort */ 220280a49ecSJoerg Wunsch return (columns); 221280a49ecSJoerg Wunsch } 222280a49ecSJoerg Wunsch 223280a49ecSJoerg Wunsch 224280a49ecSJoerg Wunsch /* 225280a49ecSJoerg Wunsch * Recursively print a list of indirect blocks. 226280a49ecSJoerg Wunsch */ 227113db2ddSJeff Roberson static void 2281c85e6a3SKirk McKusick printindir(ufs2_daddr_t blk, int level, char *bufp) 229280a49ecSJoerg Wunsch { 230280a49ecSJoerg Wunsch struct bufarea buf, *bp; 2311c85e6a3SKirk McKusick char tempbuf[32]; /* enough to print an ufs2_daddr_t */ 232280a49ecSJoerg Wunsch int i, j, cpl, charssofar; 2331c85e6a3SKirk McKusick ufs2_daddr_t blkno; 234280a49ecSJoerg Wunsch 235113db2ddSJeff Roberson if (blk == 0) 236113db2ddSJeff Roberson return; 237113db2ddSJeff Roberson printf("%jd (%d) =>\n", (intmax_t)blk, level); 238280a49ecSJoerg Wunsch if (level == 0) { 239280a49ecSJoerg Wunsch /* for the final indirect level, don't use the cache */ 240280a49ecSJoerg Wunsch bp = &buf; 241280a49ecSJoerg Wunsch bp->b_un.b_buf = bufp; 242280a49ecSJoerg Wunsch bp->b_prev = bp->b_next = bp; 243280a49ecSJoerg Wunsch initbarea(bp); 244280a49ecSJoerg Wunsch 245280a49ecSJoerg Wunsch getblk(bp, blk, sblock.fs_bsize); 246280a49ecSJoerg Wunsch } else 247280a49ecSJoerg Wunsch bp = getdatablk(blk, sblock.fs_bsize); 248280a49ecSJoerg Wunsch 249280a49ecSJoerg Wunsch cpl = charsperline(); 250280a49ecSJoerg Wunsch for (i = charssofar = 0; i < NINDIR(&sblock); i++) { 2511c85e6a3SKirk McKusick if (sblock.fs_magic == FS_UFS1_MAGIC) 2521c85e6a3SKirk McKusick blkno = bp->b_un.b_indir1[i]; 2531c85e6a3SKirk McKusick else 2541c85e6a3SKirk McKusick blkno = bp->b_un.b_indir2[i]; 255113db2ddSJeff Roberson if (blkno == 0) 256113db2ddSJeff Roberson continue; 2578b5e064dSJohan Karlsson j = sprintf(tempbuf, "%jd", (intmax_t)blkno); 258280a49ecSJoerg Wunsch if (level == 0) { 259280a49ecSJoerg Wunsch charssofar += j; 260280a49ecSJoerg Wunsch if (charssofar >= cpl - 2) { 261280a49ecSJoerg Wunsch putchar('\n'); 262280a49ecSJoerg Wunsch charssofar = j; 263280a49ecSJoerg Wunsch } 264280a49ecSJoerg Wunsch } 265280a49ecSJoerg Wunsch fputs(tempbuf, stdout); 266280a49ecSJoerg Wunsch if (level == 0) { 267280a49ecSJoerg Wunsch printf(", "); 268280a49ecSJoerg Wunsch charssofar += 2; 269280a49ecSJoerg Wunsch } else { 270280a49ecSJoerg Wunsch printf(" =>\n"); 271113db2ddSJeff Roberson printindir(blkno, level - 1, bufp); 272113db2ddSJeff Roberson printf("\n"); 273113db2ddSJeff Roberson charssofar = 0; 274280a49ecSJoerg Wunsch } 275280a49ecSJoerg Wunsch } 276280a49ecSJoerg Wunsch if (level == 0) 277280a49ecSJoerg Wunsch putchar('\n'); 278113db2ddSJeff Roberson return; 279280a49ecSJoerg Wunsch } 280280a49ecSJoerg Wunsch 281280a49ecSJoerg Wunsch 282280a49ecSJoerg Wunsch /* 283280a49ecSJoerg Wunsch * Print the block pointers for one inode. 284280a49ecSJoerg Wunsch */ 285280a49ecSJoerg Wunsch static void 2861c85e6a3SKirk McKusick printblocks(ino_t inum, union dinode *dp) 287280a49ecSJoerg Wunsch { 288280a49ecSJoerg Wunsch char *bufp; 2898b5e064dSJohan Karlsson int i, nfrags; 290280a49ecSJoerg Wunsch long ndb, offset; 2911c85e6a3SKirk McKusick ufs2_daddr_t blkno; 292280a49ecSJoerg Wunsch 293280a49ecSJoerg Wunsch printf("Blocks for inode %d:\n", inum); 294280a49ecSJoerg Wunsch printf("Direct blocks:\n"); 2951c85e6a3SKirk McKusick ndb = howmany(DIP(dp, di_size), sblock.fs_bsize); 296280a49ecSJoerg Wunsch for (i = 0; i < NDADDR; i++) { 2971c85e6a3SKirk McKusick if (DIP(dp, di_db[i]) == 0) { 298280a49ecSJoerg Wunsch putchar('\n'); 299280a49ecSJoerg Wunsch return; 300280a49ecSJoerg Wunsch } 301280a49ecSJoerg Wunsch if (i > 0) 302280a49ecSJoerg Wunsch printf(", "); 3031c85e6a3SKirk McKusick blkno = DIP(dp, di_db[i]); 3048b5e064dSJohan Karlsson printf("%jd", (intmax_t)blkno); 3051c85e6a3SKirk McKusick if (--ndb == 0 && (offset = blkoff(&sblock, DIP(dp, di_size))) != 0) { 306280a49ecSJoerg Wunsch nfrags = numfrags(&sblock, fragroundup(&sblock, offset)); 307280a49ecSJoerg Wunsch printf(" (%d frag%s)", nfrags, nfrags > 1? "s": ""); 308280a49ecSJoerg Wunsch } 309280a49ecSJoerg Wunsch } 310280a49ecSJoerg Wunsch putchar('\n'); 311113db2ddSJeff Roberson if (ndb == 0) 312280a49ecSJoerg Wunsch return; 313280a49ecSJoerg Wunsch 314280a49ecSJoerg Wunsch bufp = malloc((unsigned int)sblock.fs_bsize); 315280a49ecSJoerg Wunsch if (bufp == 0) 316280a49ecSJoerg Wunsch errx(EEXIT, "cannot allocate indirect block buffer"); 317280a49ecSJoerg Wunsch printf("Indirect blocks:\n"); 318280a49ecSJoerg Wunsch for (i = 0; i < NIADDR; i++) 319113db2ddSJeff Roberson printindir(DIP(dp, di_ib[i]), i, bufp); 320280a49ecSJoerg Wunsch free(bufp); 321280a49ecSJoerg Wunsch } 322280a49ecSJoerg Wunsch 323280a49ecSJoerg Wunsch 32439bb6d1eSPeter Wemm int 3250638cc1aSWarner Losh checkactive(void) 32639bb6d1eSPeter Wemm { 32739bb6d1eSPeter Wemm if (!curinode) { 32839bb6d1eSPeter Wemm warnx("no current inode\n"); 32939bb6d1eSPeter Wemm return 0; 33039bb6d1eSPeter Wemm } 33139bb6d1eSPeter Wemm return 1; 33239bb6d1eSPeter Wemm } 33339bb6d1eSPeter Wemm 33439bb6d1eSPeter Wemm int 3350638cc1aSWarner Losh checkactivedir(void) 33639bb6d1eSPeter Wemm { 33739bb6d1eSPeter Wemm if (!curinode) { 33839bb6d1eSPeter Wemm warnx("no current inode\n"); 33939bb6d1eSPeter Wemm return 0; 34039bb6d1eSPeter Wemm } 3411c85e6a3SKirk McKusick if ((DIP(curinode, di_mode) & IFMT) != IFDIR) { 34239bb6d1eSPeter Wemm warnx("inode %d not a directory", curinum); 34339bb6d1eSPeter Wemm return 0; 34439bb6d1eSPeter Wemm } 34539bb6d1eSPeter Wemm return 1; 34639bb6d1eSPeter Wemm } 34739bb6d1eSPeter Wemm 34839bb6d1eSPeter Wemm int 3490638cc1aSWarner Losh printactive(int doblocks) 35039bb6d1eSPeter Wemm { 35139bb6d1eSPeter Wemm if (!checkactive()) 35239bb6d1eSPeter Wemm return 1; 3531c85e6a3SKirk McKusick switch (DIP(curinode, di_mode) & IFMT) { 35439bb6d1eSPeter Wemm case IFDIR: 35539bb6d1eSPeter Wemm case IFREG: 35639bb6d1eSPeter Wemm case IFBLK: 35739bb6d1eSPeter Wemm case IFCHR: 35839bb6d1eSPeter Wemm case IFLNK: 35939bb6d1eSPeter Wemm case IFSOCK: 36039bb6d1eSPeter Wemm case IFIFO: 361280a49ecSJoerg Wunsch if (doblocks) 362280a49ecSJoerg Wunsch printblocks(curinum, curinode); 363280a49ecSJoerg Wunsch else 36439bb6d1eSPeter Wemm printstat("current inode", curinum, curinode); 36539bb6d1eSPeter Wemm break; 36639bb6d1eSPeter Wemm case 0: 36739bb6d1eSPeter Wemm printf("current inode %d: unallocated inode\n", curinum); 36839bb6d1eSPeter Wemm break; 36939bb6d1eSPeter Wemm default: 37039bb6d1eSPeter Wemm printf("current inode %d: screwy itype 0%o (mode 0%o)?\n", 3711c85e6a3SKirk McKusick curinum, DIP(curinode, di_mode) & IFMT, DIP(curinode, di_mode)); 37239bb6d1eSPeter Wemm break; 37339bb6d1eSPeter Wemm } 37439bb6d1eSPeter Wemm return 0; 37539bb6d1eSPeter Wemm } 376