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*51861Sbostic static char sccsid[] = "@(#)dumplfs.c 5.2 (Berkeley) 12/06/91"; 1651144Sbostic #endif /* not lint */ 1751144Sbostic 1851144Sbostic #include <sys/param.h> 1951144Sbostic #include <sys/mount.h> 2051144Sbostic #include <sys/file.h> 2151144Sbostic #include <ufs/dinode.h> 2251144Sbostic #include "lfs.h" /* XXX fix this */ 2351144Sbostic #include <time.h> 2451144Sbostic #include <fstab.h> 2551144Sbostic #include <errno.h> 2651144Sbostic #include <unistd.h> 2751144Sbostic #include <stdlib.h> 2851144Sbostic #include <stdio.h> 2951144Sbostic #include <string.h> 3051144Sbostic #include "extern.h" 3151144Sbostic 32*51861Sbostic static void addseg __P((char *)); 3351144Sbostic static void dump_dinode __P((struct dinode *)); 34*51861Sbostic static void dump_ifile __P((int, LFS *, int)); 3551144Sbostic static int dump_ipage_ifile __P((int, IFILE *, int)); 36*51861Sbostic static int dump_ipage_segusage __P((LFS *, int, IFILE *, int)); 37*51861Sbostic static daddr_t dump_segment __P((int, int, daddr_t, LFS *, int)); 38*51861Sbostic static int dump_sum __P((SEGSUM *, int, daddr_t)); 39*51861Sbostic static void dump_super __P((LFS *)); 4051144Sbostic static void usage __P((void)); 4151144Sbostic 42*51861Sbostic typedef struct seglist SEGLIST; 43*51861Sbostic struct seglist { 44*51861Sbostic SEGLIST *next; 45*51861Sbostic int num; 46*51861Sbostic }; 47*51861Sbostic SEGLIST *seglist; 48*51861Sbostic 49*51861Sbostic int daddr_shift; 5051144Sbostic char *special; 5151144Sbostic 5251144Sbostic /* Segment Usage formats */ 5351144Sbostic #define print_suheader \ 5451144Sbostic (void)printf("segnum\tstatus\tnbytes\t\tlastmod\n") 5551144Sbostic #define print_suentry(i, sp) \ 5651144Sbostic (void)printf("%d\t%s\t%d\t%s", \ 5751144Sbostic i, (((sp)->su_flags) ? "DIRTY" : "CLEAN"), \ 5851144Sbostic (sp)->su_nbytes, ctime((time_t *)&(sp)->su_lastmod)) 5951144Sbostic 6051144Sbostic /* Ifile formats */ 6151144Sbostic #define print_iheader \ 6251144Sbostic (void)printf("inum\tstatus\tversion\tdaddr\t\tatime\tfreeptr\n") 6351144Sbostic #define print_ientry(i, ip) \ 6451144Sbostic if (ip->if_daddr == LFS_UNUSED_DADDR) \ 6551144Sbostic (void)printf("%d\tFREE\t%d\t \t\t \t%d\n", \ 6651144Sbostic i, ip->if_version, ip->if_nextfree); \ 6751144Sbostic else \ 6851144Sbostic (void)printf("%d\tINUSE\t%d\t%8X \t%s\n", \ 6951144Sbostic i, ip->if_version, ip->if_daddr, \ 7051144Sbostic ctime((time_t *)&ip->if_st_atime)) 7151144Sbostic int 7251144Sbostic main (argc, argv) 7351144Sbostic int argc; 7451144Sbostic char *argv[]; 7551144Sbostic { 76*51861Sbostic LFS lfs_sb1, lfs_sb2, *lfs_master; 77*51861Sbostic daddr_t seg_addr; 78*51861Sbostic int ch, do_allsb, do_ientries, fd, segnum; 7951144Sbostic 8051144Sbostic do_allsb = 0; 8151144Sbostic do_ientries = 0; 82*51861Sbostic while ((ch = getopt(argc, argv, "ais:")) != EOF) 8351144Sbostic switch(ch) { 84*51861Sbostic case 'a': /* Dump all superblocks */ 85*51861Sbostic do_allsb = 1; 86*51861Sbostic break; 8751144Sbostic case 'i': /* Dump ifile entries */ 8851144Sbostic do_ientries = 1; 8951144Sbostic break; 90*51861Sbostic case 's': /* Dump out these segments */ 91*51861Sbostic addseg(optarg); 9251144Sbostic break; 9351144Sbostic default: 9451144Sbostic usage(); 9551144Sbostic } 9651144Sbostic argc -= optind; 9751144Sbostic argv += optind; 9851144Sbostic 9951144Sbostic if (argc != 1) 10051144Sbostic usage(); 10151144Sbostic 10251144Sbostic special = argv[0]; 10351144Sbostic if ((fd = open(special, O_RDONLY, 0)) < 0) 10451144Sbostic err("%s: %s", special, strerror(errno)); 10551144Sbostic 10651144Sbostic /* Read the first superblock */ 107*51861Sbostic get(fd, LFS_LABELPAD, &lfs_sb1, sizeof(LFS)); 10851144Sbostic daddr_shift = lfs_sb1.lfs_bshift - lfs_sb1.lfs_fsbtodb; 10951144Sbostic 11051144Sbostic /* 11151144Sbostic * Read the second superblock and figure out which check point is 11251144Sbostic * most up to date. 11351144Sbostic */ 114*51861Sbostic get(fd, lfs_sb1.lfs_sboffs[1] << daddr_shift, &lfs_sb2, sizeof(LFS)); 115*51861Sbostic 11651144Sbostic lfs_master = &lfs_sb1; 11751144Sbostic if (lfs_sb1.lfs_tstamp < lfs_sb2.lfs_tstamp) 11851144Sbostic lfs_master = &lfs_sb2; 11951144Sbostic 12051144Sbostic (void)printf("Master Superblock:\n"); 12151144Sbostic dump_super(lfs_master); 12251144Sbostic 12351144Sbostic dump_ifile(fd, lfs_master, do_ientries); 12451144Sbostic 125*51861Sbostic if (seglist != NULL) 126*51861Sbostic for (; seglist != NULL; seglist = seglist->next) { 127*51861Sbostic seg_addr = lfs_master->lfs_sboffs[0] + seglist->num * 128*51861Sbostic (lfs_master->lfs_ssize << lfs_master->lfs_fsbtodb); 129*51861Sbostic dump_segment(fd, 130*51861Sbostic seglist->num, seg_addr, lfs_master, do_allsb); 131*51861Sbostic } 132*51861Sbostic else 133*51861Sbostic for (segnum = 0, seg_addr = lfs_master->lfs_sboffs[0]; 134*51861Sbostic segnum < lfs_master->lfs_nseg; segnum++, seg_addr += 135*51861Sbostic lfs_master->lfs_ssize << lfs_master->lfs_fsbtodb) 136*51861Sbostic dump_segment(fd, 137*51861Sbostic segnum, seg_addr, lfs_master, do_allsb); 138*51861Sbostic 13951144Sbostic (void)close(fd); 14051144Sbostic exit(0); 14151144Sbostic } 14251144Sbostic 14351144Sbostic /* 14451144Sbostic * We are reading all the blocks of an inode and dumping out the ifile table. 14551144Sbostic * This code can be made tigher, but this is a first pass at getting the stuff 14651144Sbostic * printed out rather than making this code incredibly efficient. 14751144Sbostic */ 14851144Sbostic static void 14951144Sbostic dump_ifile(fd, lfsp, do_ientries) 15051144Sbostic int fd; 151*51861Sbostic LFS *lfsp; 15251144Sbostic int do_ientries; 15351144Sbostic { 15451144Sbostic IFILE *ipage; 15551144Sbostic struct dinode *dip, *dpage; 15651144Sbostic daddr_t addr, *addrp, *iaddrp; 15751144Sbostic daddr_t *dindir; 15851144Sbostic daddr_t *indir; 15951144Sbostic int block_limit, nblocks; 16051144Sbostic int i, j, inum, nsupb, psize; 16151144Sbostic 16251144Sbostic psize = lfsp->lfs_bsize; 16351144Sbostic addr = lfsp->lfs_idaddr; 164*51861Sbostic nsupb = lfsp->lfs_bsize / sizeof(SEGUSE); 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); 179*51861Sbostic 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); 19151144Sbostic 19251144Sbostic if (i < lfsp->lfs_segtabsz) { 19351144Sbostic inum = dump_ipage_segusage(lfsp, inum, ipage, nsupb); 19451144Sbostic if (!inum) 19551144Sbostic if(!do_ientries) 19651144Sbostic goto e0; 19751144Sbostic else 19851144Sbostic print_iheader; 19951144Sbostic } else 20051144Sbostic inum = dump_ipage_ifile(inum, ipage, lfsp->lfs_ifpb); 20151144Sbostic } 20251144Sbostic 20351144Sbostic if (nblocks <= NDADDR) 20451144Sbostic goto e0; 20551144Sbostic 20651144Sbostic /* Dump out blocks off of single indirect block */ 20751144Sbostic if (!(indir = malloc(psize))) 20851144Sbostic err("%s", strerror(errno)); 20951144Sbostic get(fd, dip->di_ib[0] << daddr_shift, indir, psize); 21051144Sbostic block_limit = MIN(i + lfsp->lfs_nindir, nblocks); 21151144Sbostic for (addrp = indir; i < block_limit; i++, addrp++) { 21251144Sbostic if (*addrp == LFS_UNUSED_DADDR) 21351144Sbostic break; 21451144Sbostic get(fd, *addrp << daddr_shift,ipage, psize); 21551144Sbostic if (i < lfsp->lfs_segtabsz) { 21651144Sbostic inum = dump_ipage_segusage(lfsp, inum, ipage, nsupb); 21751144Sbostic if (!inum) 21851144Sbostic if(!do_ientries) 21951144Sbostic goto e1; 22051144Sbostic else 22151144Sbostic print_iheader; 22251144Sbostic } else 22351144Sbostic inum = dump_ipage_ifile(inum, ipage, lfsp->lfs_ifpb); 22451144Sbostic } 22551144Sbostic 22651144Sbostic if (nblocks <= lfsp->lfs_nindir * lfsp->lfs_ifpb) 22751144Sbostic goto e1; 228*51861Sbostic 22951144Sbostic /* Get the double indirect block */ 23051144Sbostic if (!(dindir = malloc(psize))) 23151144Sbostic err("%s", strerror(errno)); 23251144Sbostic get(fd, dip->di_ib[1] << daddr_shift, dindir, psize); 23351144Sbostic for (iaddrp = dindir, j = 0; j < lfsp->lfs_nindir; j++, iaddrp++) { 23451144Sbostic if (*iaddrp == LFS_UNUSED_DADDR) 23551144Sbostic break; 23651144Sbostic get(fd, *iaddrp << daddr_shift, indir, psize); 23751144Sbostic block_limit = MIN(i + lfsp->lfs_nindir, nblocks); 23851144Sbostic for (addrp = indir; i < block_limit; i++, addrp++) { 23951144Sbostic if (*addrp == LFS_UNUSED_DADDR) 24051144Sbostic break; 24151144Sbostic get(fd, *addrp << daddr_shift, ipage, psize); 24251144Sbostic if (i < lfsp->lfs_segtabsz) { 24351144Sbostic inum = dump_ipage_segusage(lfsp, 24451144Sbostic inum, ipage, nsupb); 24551144Sbostic if (!inum) 24651144Sbostic if(!do_ientries) 24751144Sbostic goto e2; 24851144Sbostic else 24951144Sbostic print_iheader; 25051144Sbostic } else 25151144Sbostic inum = dump_ipage_ifile(inum, 25251144Sbostic ipage, lfsp->lfs_ifpb); 25351144Sbostic } 25451144Sbostic } 25551144Sbostic e2: free(dindir); 25651144Sbostic e1: free(indir); 25751144Sbostic e0: free(dpage); 25851144Sbostic free(ipage); 25951144Sbostic } 26051144Sbostic 26151144Sbostic static int 26251144Sbostic dump_ipage_ifile(i, pp, tot) 26351144Sbostic int i; 26451144Sbostic IFILE *pp; 26551144Sbostic int tot; 26651144Sbostic { 26751144Sbostic IFILE *ip; 26851144Sbostic int cnt, max; 26951144Sbostic 27051144Sbostic max = i + tot; 27151144Sbostic 27251144Sbostic for (ip = pp, cnt = i; cnt < max; cnt++, ip++) 27351144Sbostic print_ientry(cnt, ip); 27451144Sbostic return (max); 27551144Sbostic } 27651144Sbostic 27751144Sbostic static int 27851144Sbostic dump_ipage_segusage(lfsp, i, pp, tot) 279*51861Sbostic LFS *lfsp; 28051144Sbostic int i; 28151144Sbostic IFILE *pp; 28251144Sbostic int tot; 28351144Sbostic { 284*51861Sbostic SEGUSE *sp; 28551144Sbostic int cnt, max; 28651144Sbostic 28751144Sbostic max = i + tot; 288*51861Sbostic for (sp = (SEGUSE *)pp, cnt = i; 28951144Sbostic cnt < lfsp->lfs_nseg && cnt < max; cnt++, sp++) 29051144Sbostic print_suentry(cnt, sp); 29151144Sbostic if (max >= lfsp->lfs_nseg) 29251144Sbostic return (0); 29351144Sbostic else 29451144Sbostic return (max); 29551144Sbostic } 29651144Sbostic 29751144Sbostic static void 29851144Sbostic dump_dinode(dip) 29951144Sbostic struct dinode *dip; 30051144Sbostic { 30151144Sbostic int i; 30251144Sbostic 30351144Sbostic (void)printf("%s%d\t%s%d\t%s%d\t%s%d\t%s%d\n", 30451144Sbostic "mode ", dip->di_mode, 30551144Sbostic "nlink ", dip->di_nlink, 30651144Sbostic "uid ", dip->di_uid, 30751144Sbostic "gid ", dip->di_gid, 30851144Sbostic "size ", dip->di_size); 30951144Sbostic (void)printf("%s%s%s%s%s%s", 31051144Sbostic "atime ", ctime(&dip->di_atime), 31151144Sbostic "mtime ", ctime(&dip->di_mtime), 31251144Sbostic "ctime ", ctime(&dip->di_ctime)); 31351144Sbostic (void)printf("inum %d\n", dip->di_inum); 31451144Sbostic (void)printf("Direct Addresses\n"); 31551144Sbostic for (i = 0; i < NDADDR; i++) { 31651144Sbostic (void)printf("\t%X", dip->di_db[i]); 31751144Sbostic if ((i % 6) == 5) 31851144Sbostic (void)printf("\n"); 31951144Sbostic } 32051144Sbostic for (i = 0; i < NIADDR; i++) 32151144Sbostic (void)printf("\t%X", dip->di_ib[i]); 32251144Sbostic (void)printf("\n"); 32351144Sbostic } 32451144Sbostic 32551144Sbostic static int 326*51861Sbostic dump_sum(sp, segnum, addr) 32751144Sbostic SEGSUM *sp; 328*51861Sbostic int segnum; 329*51861Sbostic daddr_t addr; 33051144Sbostic { 33151144Sbostic FINFO *fp; 332*51861Sbostic long *dp; 33351144Sbostic int i, j, sb; 334*51861Sbostic int ck; 33551144Sbostic 336*51861Sbostic if (sp->ss_cksum != (ck = cksum(&sp->ss_next, 337*51861Sbostic LFS_SUMMARY_SIZE - sizeof(sp->ss_cksum)))) 338*51861Sbostic (void)printf("dumplfs: %s %d address %lx\n", 339*51861Sbostic "corrupt summary block; segment", segnum, addr); 340*51861Sbostic 34151144Sbostic (void)printf("Segment Summary Info\n"); 34251144Sbostic (void)printf("\t%s%X \t%s%X \t%s%X \n", 34351144Sbostic "next ", sp->ss_next, 34451144Sbostic "prev ", sp->ss_prev, 34551144Sbostic "nextsum ", sp->ss_nextsum ); 34651144Sbostic (void)printf("\t%s%d\t%s%d\t%s%X\n", 34751144Sbostic "nfinfo ", sp->ss_nfinfo, 34851144Sbostic "ninos ", sp->ss_ninos, 34951144Sbostic "cksum ", sp->ss_cksum ); 35051144Sbostic (void)printf("\tcreate %s", ctime((time_t *)&sp->ss_create)); 35151144Sbostic 35251144Sbostic sb = 0; 35351144Sbostic for (fp = (FINFO *)(sp + 1), i = 0; i < sp->ss_nfinfo; i++) { 35451144Sbostic if (fp->fi_ino == LFS_UNUSED_INUM) 35551144Sbostic sb = 1; 35651144Sbostic (void)printf("File Info for file: %d version %d nblocks %d\n", 35751144Sbostic fp->fi_ino, fp->fi_version, fp->fi_nblocks); 35851144Sbostic dp = &(fp->fi_blocks[0]); 35951144Sbostic for (j = 0; j < fp->fi_nblocks; j++, dp++) { 36051144Sbostic (void)printf("\t%d", *dp); 36151144Sbostic if ((j % 8) == 7) 36251144Sbostic (void)printf("\n"); 36351144Sbostic } 36451144Sbostic if ((j % 8) != 0) 36551144Sbostic (void)printf("\n"); 36651144Sbostic fp = (FINFO *)dp; 36751144Sbostic } 368*51861Sbostic return (sb); 36951144Sbostic } 37051144Sbostic 37151144Sbostic static daddr_t 372*51861Sbostic dump_segment(fd, segnum, addr, lfsp, dump_sb) 373*51861Sbostic int fd, segnum; 37451144Sbostic daddr_t addr; 375*51861Sbostic LFS *lfsp; 37651144Sbostic int dump_sb; 37751144Sbostic { 378*51861Sbostic LFS lfs_sb; 37951144Sbostic SEGSUM *sump; 38051144Sbostic char sumblock[LFS_SUMMARY_SIZE]; 38151144Sbostic int sum_offset; 38251144Sbostic int sb; 38351144Sbostic 384*51861Sbostic (void)printf("\nSegment Number %d (Disk Address %X)\n", 38551144Sbostic addr >> (lfsp->lfs_segshift - daddr_shift), addr); 38651144Sbostic sum_offset = (addr << (lfsp->lfs_bshift - lfsp->lfs_fsbtodb)) + 38751144Sbostic (lfsp->lfs_ssize << lfsp->lfs_bshift) - LFS_SUMMARY_SIZE; 388*51861Sbostic 38951144Sbostic sb = 0; 39051144Sbostic do { 39151144Sbostic get(fd, sum_offset, sumblock, LFS_SUMMARY_SIZE); 39251144Sbostic sump = (SEGSUM *)sumblock; 393*51861Sbostic sb = sb || dump_sum(sump, segnum, addr); 394*51861Sbostic sum_offset = (sump->ss_nextsum == -1 ? 0 : 39551144Sbostic sump->ss_nextsum << daddr_shift); 39651144Sbostic } while (sum_offset); 39751144Sbostic if (dump_sb && sb) { 398*51861Sbostic get(fd, addr << daddr_shift, &lfs_sb, sizeof(LFS)); 39951144Sbostic dump_super(&lfs_sb); 40051144Sbostic } 40151144Sbostic return (sump->ss_prev); 40251144Sbostic } 40351144Sbostic 404*51861Sbostic static void 40551144Sbostic dump_super(lfsp) 406*51861Sbostic LFS *lfsp; 40751144Sbostic { 40851144Sbostic int i; 40951144Sbostic 41051144Sbostic (void)printf("%s%X\t%s%X\t%s%d\t%s%d\n", 41151144Sbostic "magic ", lfsp->lfs_magic, 41251144Sbostic "version ", lfsp->lfs_version, 41351144Sbostic "size ", lfsp->lfs_size, 41451144Sbostic "ssize ", lfsp->lfs_ssize); 41551144Sbostic (void)printf("%s%d\t%s%d\t%s%d\t%s%d\n", 41651144Sbostic "dsize ", lfsp->lfs_dsize, 41751144Sbostic "bsize ", lfsp->lfs_bsize, 41851144Sbostic "fsize ", lfsp->lfs_fsize, 41951144Sbostic "frag ", lfsp->lfs_frag); 42051144Sbostic 42151144Sbostic (void)printf("%s%d\t%s%d\t%s%d\t%s%d\n", 42251144Sbostic "minfree ", lfsp->lfs_minfree, 42351144Sbostic "inopb ", lfsp->lfs_inopb, 42451144Sbostic "ifpb ", lfsp->lfs_ifpb, 42551144Sbostic "nindir ", lfsp->lfs_nindir); 42651144Sbostic 42751144Sbostic (void)printf("%s%d\t%s%d\t%s%d\n", 42851144Sbostic "nseg ", lfsp->lfs_nseg, 42951144Sbostic "nspf ", lfsp->lfs_nspf, 43051144Sbostic "segtabsz ", lfsp->lfs_segtabsz); 43151144Sbostic 43251144Sbostic (void)printf("%s%X\t%s%d\t%s%X\t%s%d\n", 43351144Sbostic "segmask ", lfsp->lfs_segmask, 43451144Sbostic "segshift ", lfsp->lfs_segshift, 43551144Sbostic "bmask ", lfsp->lfs_bmask, 43651144Sbostic "bshift ", lfsp->lfs_bshift); 43751144Sbostic 43851144Sbostic (void)printf("%s%X\t%s%d\t%s%X\t%s%d\n", 43951144Sbostic "ffmask ", lfsp->lfs_ffmask, 44051144Sbostic "ffshift ", lfsp->lfs_ffshift, 44151144Sbostic "fbmask ", lfsp->lfs_fbmask, 44251144Sbostic "fbshift ", lfsp->lfs_fbshift); 44351144Sbostic 444*51861Sbostic (void)printf("%s%d\t%s%X\n", 44551144Sbostic "fsbtodb ", lfsp->lfs_fsbtodb, 44651144Sbostic "cksum ", lfsp->lfs_cksum); 44751144Sbostic 44851144Sbostic (void)printf("Superblock disk addresses:"); 44951144Sbostic for (i = 0; i < LFS_MAXNUMSB; i++) 45051144Sbostic (void)printf(" %X", lfsp->lfs_sboffs[i]); 45151144Sbostic (void)printf("\n"); 45251144Sbostic 45351144Sbostic (void)printf("Checkpoint Info\n"); 454*51861Sbostic (void)printf("%s%d\t%s%X\t%s%d\n", 45551144Sbostic "free ", lfsp->lfs_free, 45651144Sbostic "idaddr ", lfsp->lfs_idaddr, 457*51861Sbostic "ifile ", lfsp->lfs_ifile); 458*51861Sbostic (void)printf("%s%X\t%s%d\t%s%X\t%s%X\n", 459*51861Sbostic "bfree ", lfsp->lfs_bfree, 460*51861Sbostic "nfiles ", lfsp->lfs_nfiles, 461*51861Sbostic "lastseg ", lfsp->lfs_lastseg, 462*51861Sbostic "nextseg ", lfsp->lfs_nextseg); 46351144Sbostic (void)printf("tstamp %s", ctime((time_t *)&lfsp->lfs_tstamp)); 46451144Sbostic } 46551144Sbostic 46651144Sbostic static void 467*51861Sbostic addseg(arg) 468*51861Sbostic char *arg; 469*51861Sbostic { 470*51861Sbostic SEGLIST *p; 471*51861Sbostic 472*51861Sbostic if ((p = malloc(sizeof(SEGLIST))) == NULL) 473*51861Sbostic err("%s", strerror(errno)); 474*51861Sbostic p->next = seglist; 475*51861Sbostic p->num = atoi(arg); 476*51861Sbostic seglist = p; 477*51861Sbostic } 478*51861Sbostic 479*51861Sbostic static void 48051144Sbostic usage() 48151144Sbostic { 482*51861Sbostic (void)fprintf(stderr, "usage: dumplfs [-ai] [-s segnum] file\n"); 48351144Sbostic exit(1); 48451144Sbostic } 485