151144Sbostic /*- 251144Sbostic * Copyright (c) 1991 The Regents of the University of California. 351144Sbostic * All rights reserved. 451144Sbostic * 551144Sbostic * %sccs.include.redist.c% 651144Sbostic */ 751144Sbostic 851144Sbostic #ifndef lint 951144Sbostic char copyright[] = 1051144Sbostic "@(#) Copyright (c) 1991 The Regents of the University of California.\n\ 1151144Sbostic All rights reserved.\n"; 1251144Sbostic #endif /* not lint */ 1351144Sbostic 1451144Sbostic #ifndef lint 15*51862Sbostic static char sccsid[] = "@(#)dumplfs.c 5.3 (Berkeley) 12/06/91"; 1651144Sbostic #endif /* not lint */ 1751144Sbostic 1851144Sbostic #include <sys/param.h> 1951144Sbostic #include <sys/mount.h> 2051144Sbostic #include <sys/file.h> 21*51862Sbostic 22*51862Sbostic #include <ufs/ufs/dinode.h> 23*51862Sbostic #include <ufs/lfs/lfs.h> 24*51862Sbostic 2551144Sbostic #include <time.h> 2651144Sbostic #include <fstab.h> 2751144Sbostic #include <errno.h> 2851144Sbostic #include <unistd.h> 2951144Sbostic #include <stdlib.h> 3051144Sbostic #include <stdio.h> 3151144Sbostic #include <string.h> 3251144Sbostic #include "extern.h" 3351144Sbostic 3451861Sbostic static void addseg __P((char *)); 35*51862Sbostic static void dump_cleaner_info __P((struct lfs *, void *)); 3651144Sbostic static void dump_dinode __P((struct dinode *)); 37*51862Sbostic static void dump_ifile __P((int, struct lfs *, int)); 3851144Sbostic static int dump_ipage_ifile __P((int, IFILE *, int)); 39*51862Sbostic static int dump_ipage_segusage __P((struct lfs *, int, IFILE *, int)); 40*51862Sbostic static void dump_segment __P((int, int, daddr_t, struct lfs *, int)); 41*51862Sbostic static int dump_sum __P((struct lfs *, SEGSUM *, int, daddr_t)); 42*51862Sbostic static void dump_super __P((struct lfs *)); 4351144Sbostic static void usage __P((void)); 4451144Sbostic 4551861Sbostic typedef struct seglist SEGLIST; 4651861Sbostic struct seglist { 4751861Sbostic SEGLIST *next; 4851861Sbostic int num; 4951861Sbostic }; 5051861Sbostic SEGLIST *seglist; 5151861Sbostic 5251861Sbostic int daddr_shift; 5351144Sbostic char *special; 5451144Sbostic 5551144Sbostic /* Segment Usage formats */ 5651144Sbostic #define print_suheader \ 5751144Sbostic (void)printf("segnum\tstatus\tnbytes\t\tlastmod\n") 5851144Sbostic #define print_suentry(i, sp) \ 5951144Sbostic (void)printf("%d\t%s\t%d\t%s", \ 6051144Sbostic i, (((sp)->su_flags) ? "DIRTY" : "CLEAN"), \ 6151144Sbostic (sp)->su_nbytes, ctime((time_t *)&(sp)->su_lastmod)) 6251144Sbostic 6351144Sbostic /* Ifile formats */ 6451144Sbostic #define print_iheader \ 6551144Sbostic (void)printf("inum\tstatus\tversion\tdaddr\t\tatime\tfreeptr\n") 6651144Sbostic #define print_ientry(i, ip) \ 6751144Sbostic if (ip->if_daddr == LFS_UNUSED_DADDR) \ 6851144Sbostic (void)printf("%d\tFREE\t%d\t \t\t \t%d\n", \ 6951144Sbostic i, ip->if_version, ip->if_nextfree); \ 7051144Sbostic else \ 7151144Sbostic (void)printf("%d\tINUSE\t%d\t%8X \t%s\n", \ 7251144Sbostic i, ip->if_version, ip->if_daddr, \ 7351144Sbostic ctime((time_t *)&ip->if_st_atime)) 7451144Sbostic int 75*51862Sbostic main(argc, argv) 7651144Sbostic int argc; 7751144Sbostic char *argv[]; 7851144Sbostic { 79*51862Sbostic struct lfs lfs_sb1, lfs_sb2, *lfs_master; 8051861Sbostic daddr_t seg_addr; 8151861Sbostic int ch, do_allsb, do_ientries, fd, segnum; 8251144Sbostic 8351144Sbostic do_allsb = 0; 8451144Sbostic do_ientries = 0; 8551861Sbostic while ((ch = getopt(argc, argv, "ais:")) != EOF) 8651144Sbostic switch(ch) { 8751861Sbostic case 'a': /* Dump all superblocks */ 8851861Sbostic do_allsb = 1; 8951861Sbostic break; 9051144Sbostic case 'i': /* Dump ifile entries */ 9151144Sbostic do_ientries = 1; 9251144Sbostic break; 9351861Sbostic case 's': /* Dump out these segments */ 9451861Sbostic addseg(optarg); 9551144Sbostic break; 9651144Sbostic default: 9751144Sbostic usage(); 9851144Sbostic } 9951144Sbostic argc -= optind; 10051144Sbostic argv += optind; 10151144Sbostic 10251144Sbostic if (argc != 1) 10351144Sbostic usage(); 10451144Sbostic 10551144Sbostic special = argv[0]; 10651144Sbostic if ((fd = open(special, O_RDONLY, 0)) < 0) 10751144Sbostic err("%s: %s", special, strerror(errno)); 10851144Sbostic 10951144Sbostic /* Read the first superblock */ 110*51862Sbostic get(fd, LFS_LABELPAD, &lfs_sb1, sizeof(struct lfs)); 11151144Sbostic daddr_shift = lfs_sb1.lfs_bshift - lfs_sb1.lfs_fsbtodb; 11251144Sbostic 11351144Sbostic /* 11451144Sbostic * Read the second superblock and figure out which check point is 11551144Sbostic * most up to date. 11651144Sbostic */ 117*51862Sbostic get(fd, 118*51862Sbostic lfs_sb1.lfs_sboffs[1] << daddr_shift, &lfs_sb2, sizeof(struct lfs)); 11951861Sbostic 12051144Sbostic lfs_master = &lfs_sb1; 12151144Sbostic if (lfs_sb1.lfs_tstamp < lfs_sb2.lfs_tstamp) 12251144Sbostic lfs_master = &lfs_sb2; 12351144Sbostic 12451144Sbostic (void)printf("Master Superblock:\n"); 12551144Sbostic dump_super(lfs_master); 12651144Sbostic 12751144Sbostic dump_ifile(fd, lfs_master, do_ientries); 12851144Sbostic 12951861Sbostic if (seglist != NULL) 13051861Sbostic for (; seglist != NULL; seglist = seglist->next) { 13151861Sbostic seg_addr = lfs_master->lfs_sboffs[0] + seglist->num * 13251861Sbostic (lfs_master->lfs_ssize << lfs_master->lfs_fsbtodb); 13351861Sbostic dump_segment(fd, 13451861Sbostic seglist->num, seg_addr, lfs_master, do_allsb); 13551861Sbostic } 13651861Sbostic else 13751861Sbostic for (segnum = 0, seg_addr = lfs_master->lfs_sboffs[0]; 13851861Sbostic segnum < lfs_master->lfs_nseg; segnum++, seg_addr += 13951861Sbostic lfs_master->lfs_ssize << lfs_master->lfs_fsbtodb) 14051861Sbostic dump_segment(fd, 14151861Sbostic segnum, seg_addr, lfs_master, do_allsb); 14251861Sbostic 14351144Sbostic (void)close(fd); 14451144Sbostic exit(0); 14551144Sbostic } 14651144Sbostic 14751144Sbostic /* 14851144Sbostic * We are reading all the blocks of an inode and dumping out the ifile table. 149*51862Sbostic * This code could be tighter, but this is a first pass at getting the stuff 15051144Sbostic * printed out rather than making this code incredibly efficient. 15151144Sbostic */ 15251144Sbostic static void 15351144Sbostic dump_ifile(fd, lfsp, do_ientries) 15451144Sbostic int fd; 155*51862Sbostic struct lfs *lfsp; 15651144Sbostic int do_ientries; 15751144Sbostic { 15851144Sbostic IFILE *ipage; 15951144Sbostic struct dinode *dip, *dpage; 160*51862Sbostic daddr_t addr, *addrp, *dindir, *iaddrp, *indir; 161*51862Sbostic int block_limit, i, inum, j, nblocks, nsupb, psize; 16251144Sbostic 16351144Sbostic psize = lfsp->lfs_bsize; 16451144Sbostic addr = lfsp->lfs_idaddr; 16551144Sbostic 16651144Sbostic if (!(dip = dpage = malloc(psize))) 16751144Sbostic err("%s", strerror(errno)); 16851144Sbostic get(fd, addr << daddr_shift, dip, psize); 16951144Sbostic 17051144Sbostic for (i = 0; i < lfsp->lfs_inopb; i++, dip++) 17151144Sbostic if (dip->di_inum == LFS_IFILE_INUM) 17251144Sbostic break; 17351144Sbostic 17451144Sbostic if (i >= lfsp->lfs_inopb) 17551144Sbostic err("unable to locate ifile inode"); 17651144Sbostic 17751144Sbostic (void)printf("\nIFILE inode\n"); 17851144Sbostic dump_dinode(dip); 17951861Sbostic 18051144Sbostic (void)printf("\nIFILE contents\n"); 18151144Sbostic print_suheader; 18251144Sbostic nblocks = dip->di_size >> lfsp->lfs_bshift; 18351144Sbostic block_limit = MIN(nblocks, NDADDR); 18451144Sbostic 18551144Sbostic /* Get the direct block */ 18651144Sbostic if ((ipage = malloc(psize)) == NULL) 18751144Sbostic err("%s", strerror(errno)); 18851144Sbostic for (inum = 0, addrp = dip->di_db, i = 0; i < block_limit; 18951144Sbostic i++, addrp++) { 19051144Sbostic get(fd, *addrp << daddr_shift, ipage, psize); 191*51862Sbostic if (i < lfsp->lfs_cleansz) { 192*51862Sbostic dump_cleaner_info(lfsp, ipage); 193*51862Sbostic continue; 194*51862Sbostic } else 195*51862Sbostic i -= lfsp->lfs_cleansz; 19651144Sbostic 19751144Sbostic if (i < lfsp->lfs_segtabsz) { 198*51862Sbostic inum = dump_ipage_segusage(lfsp, inum, ipage, 199*51862Sbostic lfsp->lfs_sepb); 20051144Sbostic if (!inum) 20151144Sbostic if(!do_ientries) 202*51862Sbostic goto e1; 20351144Sbostic else 20451144Sbostic print_iheader; 20551144Sbostic } else 20651144Sbostic inum = dump_ipage_ifile(inum, ipage, lfsp->lfs_ifpb); 207*51862Sbostic 20851144Sbostic } 20951144Sbostic 21051144Sbostic if (nblocks <= NDADDR) 21151144Sbostic goto e0; 21251144Sbostic 21351144Sbostic /* Dump out blocks off of single indirect block */ 21451144Sbostic if (!(indir = malloc(psize))) 21551144Sbostic err("%s", strerror(errno)); 21651144Sbostic get(fd, dip->di_ib[0] << daddr_shift, indir, psize); 21751144Sbostic block_limit = MIN(i + lfsp->lfs_nindir, nblocks); 21851144Sbostic for (addrp = indir; i < block_limit; i++, addrp++) { 21951144Sbostic if (*addrp == LFS_UNUSED_DADDR) 22051144Sbostic break; 22151144Sbostic get(fd, *addrp << daddr_shift,ipage, psize); 222*51862Sbostic if (i < lfsp->lfs_cleansz) { 223*51862Sbostic dump_cleaner_info(lfsp, ipage); 224*51862Sbostic continue; 225*51862Sbostic } else 226*51862Sbostic i -= lfsp->lfs_cleansz; 227*51862Sbostic 22851144Sbostic if (i < lfsp->lfs_segtabsz) { 229*51862Sbostic inum = dump_ipage_segusage(lfsp, inum, ipage, 230*51862Sbostic lfsp->lfs_sepb); 23151144Sbostic if (!inum) 23251144Sbostic if(!do_ientries) 23351144Sbostic goto e1; 23451144Sbostic else 23551144Sbostic print_iheader; 23651144Sbostic } else 23751144Sbostic inum = dump_ipage_ifile(inum, ipage, lfsp->lfs_ifpb); 23851144Sbostic } 23951144Sbostic 24051144Sbostic if (nblocks <= lfsp->lfs_nindir * lfsp->lfs_ifpb) 24151144Sbostic goto e1; 24251861Sbostic 24351144Sbostic /* Get the double indirect block */ 24451144Sbostic if (!(dindir = malloc(psize))) 24551144Sbostic err("%s", strerror(errno)); 24651144Sbostic get(fd, dip->di_ib[1] << daddr_shift, dindir, psize); 24751144Sbostic for (iaddrp = dindir, j = 0; j < lfsp->lfs_nindir; j++, iaddrp++) { 24851144Sbostic if (*iaddrp == LFS_UNUSED_DADDR) 24951144Sbostic break; 25051144Sbostic get(fd, *iaddrp << daddr_shift, indir, psize); 25151144Sbostic block_limit = MIN(i + lfsp->lfs_nindir, nblocks); 25251144Sbostic for (addrp = indir; i < block_limit; i++, addrp++) { 25351144Sbostic if (*addrp == LFS_UNUSED_DADDR) 25451144Sbostic break; 25551144Sbostic get(fd, *addrp << daddr_shift, ipage, psize); 256*51862Sbostic if (i < lfsp->lfs_cleansz) { 257*51862Sbostic dump_cleaner_info(lfsp, ipage); 258*51862Sbostic continue; 259*51862Sbostic } else 260*51862Sbostic i -= lfsp->lfs_cleansz; 261*51862Sbostic 26251144Sbostic if (i < lfsp->lfs_segtabsz) { 26351144Sbostic inum = dump_ipage_segusage(lfsp, 264*51862Sbostic inum, ipage, lfsp->lfs_sepb); 26551144Sbostic if (!inum) 26651144Sbostic if(!do_ientries) 26751144Sbostic goto e2; 26851144Sbostic else 26951144Sbostic print_iheader; 27051144Sbostic } else 27151144Sbostic inum = dump_ipage_ifile(inum, 27251144Sbostic ipage, lfsp->lfs_ifpb); 27351144Sbostic } 27451144Sbostic } 27551144Sbostic e2: free(dindir); 27651144Sbostic e1: free(indir); 27751144Sbostic e0: free(dpage); 27851144Sbostic free(ipage); 27951144Sbostic } 28051144Sbostic 28151144Sbostic static int 28251144Sbostic dump_ipage_ifile(i, pp, tot) 28351144Sbostic int i; 28451144Sbostic IFILE *pp; 28551144Sbostic int tot; 28651144Sbostic { 28751144Sbostic IFILE *ip; 28851144Sbostic int cnt, max; 28951144Sbostic 29051144Sbostic max = i + tot; 29151144Sbostic 29251144Sbostic for (ip = pp, cnt = i; cnt < max; cnt++, ip++) 29351144Sbostic print_ientry(cnt, ip); 29451144Sbostic return (max); 29551144Sbostic } 29651144Sbostic 29751144Sbostic static int 29851144Sbostic dump_ipage_segusage(lfsp, i, pp, tot) 299*51862Sbostic struct lfs *lfsp; 30051144Sbostic int i; 30151144Sbostic IFILE *pp; 30251144Sbostic int tot; 30351144Sbostic { 30451861Sbostic SEGUSE *sp; 30551144Sbostic int cnt, max; 30651144Sbostic 30751144Sbostic max = i + tot; 30851861Sbostic for (sp = (SEGUSE *)pp, cnt = i; 30951144Sbostic cnt < lfsp->lfs_nseg && cnt < max; cnt++, sp++) 31051144Sbostic print_suentry(cnt, sp); 31151144Sbostic if (max >= lfsp->lfs_nseg) 31251144Sbostic return (0); 31351144Sbostic else 31451144Sbostic return (max); 31551144Sbostic } 31651144Sbostic 31751144Sbostic static void 31851144Sbostic dump_dinode(dip) 31951144Sbostic struct dinode *dip; 32051144Sbostic { 32151144Sbostic int i; 32251144Sbostic 32351144Sbostic (void)printf("%s%d\t%s%d\t%s%d\t%s%d\t%s%d\n", 32451144Sbostic "mode ", dip->di_mode, 32551144Sbostic "nlink ", dip->di_nlink, 32651144Sbostic "uid ", dip->di_uid, 32751144Sbostic "gid ", dip->di_gid, 32851144Sbostic "size ", dip->di_size); 32951144Sbostic (void)printf("%s%s%s%s%s%s", 33051144Sbostic "atime ", ctime(&dip->di_atime), 33151144Sbostic "mtime ", ctime(&dip->di_mtime), 33251144Sbostic "ctime ", ctime(&dip->di_ctime)); 33351144Sbostic (void)printf("inum %d\n", dip->di_inum); 33451144Sbostic (void)printf("Direct Addresses\n"); 33551144Sbostic for (i = 0; i < NDADDR; i++) { 33651144Sbostic (void)printf("\t%X", dip->di_db[i]); 33751144Sbostic if ((i % 6) == 5) 33851144Sbostic (void)printf("\n"); 33951144Sbostic } 34051144Sbostic for (i = 0; i < NIADDR; i++) 34151144Sbostic (void)printf("\t%X", dip->di_ib[i]); 34251144Sbostic (void)printf("\n"); 34351144Sbostic } 34451144Sbostic 34551144Sbostic static int 346*51862Sbostic dump_sum(lfsp, sp, segnum, addr) 347*51862Sbostic struct lfs *lfsp; 34851144Sbostic SEGSUM *sp; 34951861Sbostic int segnum; 35051861Sbostic daddr_t addr; 35151144Sbostic { 35251144Sbostic FINFO *fp; 35351861Sbostic long *dp; 354*51862Sbostic int i, j; 35551861Sbostic int ck; 356*51862Sbostic int numblocks; 35751144Sbostic 358*51862Sbostic if (sp->ss_sumsum != (ck = cksum(&sp->ss_datasum, 359*51862Sbostic LFS_SUMMARY_SIZE - sizeof(sp->ss_sumsum)))) 36051861Sbostic (void)printf("dumplfs: %s %d address %lx\n", 36151861Sbostic "corrupt summary block; segment", segnum, addr); 36251861Sbostic 36351144Sbostic (void)printf("Segment Summary Info\n"); 364*51862Sbostic (void)printf("\t%s%X\t%s%d\t%s%d\t%s%X\t%s%X\n", 36551144Sbostic "next ", sp->ss_next, 36651144Sbostic "nfinfo ", sp->ss_nfinfo, 36751144Sbostic "ninos ", sp->ss_ninos, 368*51862Sbostic "sumsum ", sp->ss_sumsum, 369*51862Sbostic "datasum ", sp->ss_datasum ); 37051144Sbostic (void)printf("\tcreate %s", ctime((time_t *)&sp->ss_create)); 37151144Sbostic 372*51862Sbostic numblocks = (sp->ss_ninos + INOPB(lfsp) - 1) / INOPB(lfsp); 373*51862Sbostic 374*51862Sbostic /* Dump out inode disk addresses */ 375*51862Sbostic dp = (daddr_t *)sp; 376*51862Sbostic dp += LFS_SUMMARY_SIZE / sizeof(daddr_t); 377*51862Sbostic printf("\tInode addresses:"); 378*51862Sbostic for (dp--, i = 0; i < numblocks; i += INOPB(lfsp)) 379*51862Sbostic printf("\t%X", *dp--); 380*51862Sbostic 381*51862Sbostic printf("\n"); 38251144Sbostic for (fp = (FINFO *)(sp + 1), i = 0; i < sp->ss_nfinfo; i++) { 383*51862Sbostic numblocks += fp->fi_nblocks; 38451144Sbostic (void)printf("File Info for file: %d version %d nblocks %d\n", 38551144Sbostic fp->fi_ino, fp->fi_version, fp->fi_nblocks); 38651144Sbostic dp = &(fp->fi_blocks[0]); 38751144Sbostic for (j = 0; j < fp->fi_nblocks; j++, dp++) { 38851144Sbostic (void)printf("\t%d", *dp); 38951144Sbostic if ((j % 8) == 7) 39051144Sbostic (void)printf("\n"); 39151144Sbostic } 39251144Sbostic if ((j % 8) != 0) 39351144Sbostic (void)printf("\n"); 39451144Sbostic fp = (FINFO *)dp; 39551144Sbostic } 396*51862Sbostic return (numblocks); 39751144Sbostic } 39851144Sbostic 399*51862Sbostic static void 40051861Sbostic dump_segment(fd, segnum, addr, lfsp, dump_sb) 40151861Sbostic int fd, segnum; 40251144Sbostic daddr_t addr; 403*51862Sbostic struct lfs *lfsp; 40451144Sbostic int dump_sb; 40551144Sbostic { 406*51862Sbostic struct lfs lfs_sb, *sbp; 40751144Sbostic SEGSUM *sump; 40851144Sbostic char sumblock[LFS_SUMMARY_SIZE]; 409*51862Sbostic int did_one, nblocks, sb; 410*51862Sbostic off_t sum_offset, super_off; 41151144Sbostic 41251861Sbostic (void)printf("\nSegment Number %d (Disk Address %X)\n", 41351144Sbostic addr >> (lfsp->lfs_segshift - daddr_shift), addr); 414*51862Sbostic sum_offset = (addr << (lfsp->lfs_bshift - lfsp->lfs_fsbtodb)); 41551861Sbostic 41651144Sbostic sb = 0; 417*51862Sbostic did_one = 0; 41851144Sbostic do { 41951144Sbostic get(fd, sum_offset, sumblock, LFS_SUMMARY_SIZE); 42051144Sbostic sump = (SEGSUM *)sumblock; 421*51862Sbostic if (sump->ss_sumsum != cksum (&sump->ss_datasum, 422*51862Sbostic LFS_SUMMARY_SIZE - sizeof(sump->ss_sumsum))) { 423*51862Sbostic sbp = (struct lfs *)sump; 424*51862Sbostic if (sb = (sbp->lfs_magic == LFS_MAGIC)) { 425*51862Sbostic super_off = sum_offset; 426*51862Sbostic sum_offset += LFS_SBPAD; 427*51862Sbostic } else if (did_one) 428*51862Sbostic break; 429*51862Sbostic else { 430*51862Sbostic printf("Segment at %X corrupt\n", addr); 431*51862Sbostic break; 432*51862Sbostic } 433*51862Sbostic } else { 434*51862Sbostic nblocks = dump_sum(lfsp, sump, segnum, addr); 435*51862Sbostic if (nblocks) 436*51862Sbostic sum_offset += (nblocks << lfsp->lfs_bshift); 437*51862Sbostic else 438*51862Sbostic sum_offset = 0; 439*51862Sbostic did_one = 1; 440*51862Sbostic } 44151144Sbostic } while (sum_offset); 442*51862Sbostic 44351144Sbostic if (dump_sb && sb) { 444*51862Sbostic get(fd, super_off, &lfs_sb, sizeof(struct lfs)); 44551144Sbostic dump_super(&lfs_sb); 44651144Sbostic } 447*51862Sbostic return; 44851144Sbostic } 44951144Sbostic 45051861Sbostic static void 45151144Sbostic dump_super(lfsp) 452*51862Sbostic struct lfs *lfsp; 45351144Sbostic { 45451144Sbostic int i; 45551144Sbostic 45651144Sbostic (void)printf("%s%X\t%s%X\t%s%d\t%s%d\n", 45751144Sbostic "magic ", lfsp->lfs_magic, 45851144Sbostic "version ", lfsp->lfs_version, 45951144Sbostic "size ", lfsp->lfs_size, 46051144Sbostic "ssize ", lfsp->lfs_ssize); 46151144Sbostic (void)printf("%s%d\t%s%d\t%s%d\t%s%d\n", 46251144Sbostic "dsize ", lfsp->lfs_dsize, 46351144Sbostic "bsize ", lfsp->lfs_bsize, 46451144Sbostic "fsize ", lfsp->lfs_fsize, 46551144Sbostic "frag ", lfsp->lfs_frag); 46651144Sbostic 46751144Sbostic (void)printf("%s%d\t%s%d\t%s%d\t%s%d\n", 46851144Sbostic "minfree ", lfsp->lfs_minfree, 46951144Sbostic "inopb ", lfsp->lfs_inopb, 47051144Sbostic "ifpb ", lfsp->lfs_ifpb, 47151144Sbostic "nindir ", lfsp->lfs_nindir); 47251144Sbostic 473*51862Sbostic (void)printf("%s%d\t%s%d\t%s%d\t%s%d\n", 47451144Sbostic "nseg ", lfsp->lfs_nseg, 47551144Sbostic "nspf ", lfsp->lfs_nspf, 476*51862Sbostic "cleansz ", lfsp->lfs_cleansz, 47751144Sbostic "segtabsz ", lfsp->lfs_segtabsz); 47851144Sbostic 47951144Sbostic (void)printf("%s%X\t%s%d\t%s%X\t%s%d\n", 48051144Sbostic "segmask ", lfsp->lfs_segmask, 48151144Sbostic "segshift ", lfsp->lfs_segshift, 48251144Sbostic "bmask ", lfsp->lfs_bmask, 48351144Sbostic "bshift ", lfsp->lfs_bshift); 48451144Sbostic 48551144Sbostic (void)printf("%s%X\t%s%d\t%s%X\t%s%d\n", 48651144Sbostic "ffmask ", lfsp->lfs_ffmask, 48751144Sbostic "ffshift ", lfsp->lfs_ffshift, 48851144Sbostic "fbmask ", lfsp->lfs_fbmask, 48951144Sbostic "fbshift ", lfsp->lfs_fbshift); 49051144Sbostic 49151861Sbostic (void)printf("%s%d\t%s%X\n", 49251144Sbostic "fsbtodb ", lfsp->lfs_fsbtodb, 49351144Sbostic "cksum ", lfsp->lfs_cksum); 49451144Sbostic 49551144Sbostic (void)printf("Superblock disk addresses:"); 49651144Sbostic for (i = 0; i < LFS_MAXNUMSB; i++) 49751144Sbostic (void)printf(" %X", lfsp->lfs_sboffs[i]); 49851144Sbostic (void)printf("\n"); 49951144Sbostic 50051144Sbostic (void)printf("Checkpoint Info\n"); 50151861Sbostic (void)printf("%s%d\t%s%X\t%s%d\n", 50251144Sbostic "free ", lfsp->lfs_free, 50351144Sbostic "idaddr ", lfsp->lfs_idaddr, 50451861Sbostic "ifile ", lfsp->lfs_ifile); 505*51862Sbostic (void)printf("%s%X\t%s%d\t%s%X\t%s%X\t%s%X\t%s%X\n", 50651861Sbostic "bfree ", lfsp->lfs_bfree, 50751861Sbostic "nfiles ", lfsp->lfs_nfiles, 50851861Sbostic "lastseg ", lfsp->lfs_lastseg, 509*51862Sbostic "nextseg ", lfsp->lfs_nextseg, 510*51862Sbostic "curseg ", lfsp->lfs_curseg, 511*51862Sbostic "offset ", lfsp->lfs_offset); 51251144Sbostic (void)printf("tstamp %s", ctime((time_t *)&lfsp->lfs_tstamp)); 51351144Sbostic } 51451144Sbostic 51551144Sbostic static void 51651861Sbostic addseg(arg) 51751861Sbostic char *arg; 51851861Sbostic { 51951861Sbostic SEGLIST *p; 52051861Sbostic 52151861Sbostic if ((p = malloc(sizeof(SEGLIST))) == NULL) 52251861Sbostic err("%s", strerror(errno)); 52351861Sbostic p->next = seglist; 52451861Sbostic p->num = atoi(arg); 52551861Sbostic seglist = p; 52651861Sbostic } 52751861Sbostic 52851861Sbostic static void 529*51862Sbostic dump_cleaner_info(lfsp, ipage) 530*51862Sbostic struct lfs *lfsp; 531*51862Sbostic void *ipage; 532*51862Sbostic { 533*51862Sbostic return; 534*51862Sbostic } 535*51862Sbostic 536*51862Sbostic static void 53751144Sbostic usage() 53851144Sbostic { 53951861Sbostic (void)fprintf(stderr, "usage: dumplfs [-ai] [-s segnum] file\n"); 54051144Sbostic exit(1); 54151144Sbostic } 542