⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dumplfs.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
}static intdump_ipage_ifile(i, pp, tot)	int i;	IFILE *pp;	int tot;{	IFILE *ip;	int cnt, max;	max = i + tot;	for (ip = pp, cnt = i; cnt < max; cnt++, ip++)		print_ientry(cnt, ip);	return (max);}static intdump_ipage_segusage(lfsp, i, pp, tot)	struct lfs *lfsp;	int i;	IFILE *pp;	int tot;{	SEGUSE *sp;	int cnt, max;	max = i + tot;	for (sp = (SEGUSE *)pp, cnt = i;	     cnt < lfsp->lfs_nseg && cnt < max; cnt++, sp++)		print_suentry(cnt, sp);	if (max >= lfsp->lfs_nseg)		return (0);	else		return (max);}static voiddump_dinode(dip)	struct dinode *dip;{	int i;	(void)printf("%s%d\t%s%d\t%s%d\t%s%d\t%s%d\n",		"mode  ", dip->di_mode,		"nlink ", dip->di_nlink,		"uid   ", dip->di_uid,		"gid   ", dip->di_gid,		"size  ", dip->di_size);	(void)printf("%s%s%s%s%s%s",		"atime ", ctime(&dip->di_atime.ts_sec),		"mtime ", ctime(&dip->di_mtime.ts_sec),		"ctime ", ctime(&dip->di_ctime.ts_sec));	(void)printf("inum  %d\n", dip->di_inumber);	(void)printf("Direct Addresses\n");	for (i = 0; i < NDADDR; i++) {		(void)printf("\t0x%X", dip->di_db[i]);		if ((i % 6) == 5)			(void)printf("\n");	}	for (i = 0; i < NIADDR; i++)		(void)printf("\t0x%X", dip->di_ib[i]);	(void)printf("\n");}static intdump_sum(fd, lfsp, sp, segnum, addr)	struct lfs *lfsp;	SEGSUM *sp;	int fd, segnum;	daddr_t addr;{	FINFO *fp;	long *dp;	int i, j;	int ck;	int numblocks;	struct dinode *inop;	if (sp->ss_sumsum != (ck = cksum(&sp->ss_datasum, 	    LFS_SUMMARY_SIZE - sizeof(sp->ss_sumsum)))) {		(void)printf("dumplfs: %s %d address 0x%lx\n",		    "corrupt summary block; segment", segnum, addr);		return(0);	}	(void)printf("Segment Summary Info at 0x%lx\n", addr);	(void)printf("    %s0x%X\t%s%d\t%s%d\n    %s0x%X\t%s0x%X",		"next     ", sp->ss_next,		"nfinfo   ", sp->ss_nfinfo,		"ninos    ", sp->ss_ninos,		"sumsum   ", sp->ss_sumsum,		"datasum  ", sp->ss_datasum );	(void)printf("\tcreate   %s", ctime((time_t *)&sp->ss_create));	numblocks = (sp->ss_ninos + INOPB(lfsp) - 1) / INOPB(lfsp);	/* Dump out inode disk addresses */	dp = (daddr_t *)sp;	dp += LFS_SUMMARY_SIZE / sizeof(daddr_t);	inop = malloc(1 << lfsp->lfs_bshift);	printf("    Inode addresses:");	for (dp--, i = 0; i < sp->ss_ninos; dp--) {		printf("\t0x%X {", *dp);		get(fd, *dp << (lfsp->lfs_bshift - lfsp->lfs_fsbtodb), inop, 		    (1 << lfsp->lfs_bshift));		for (j = 0; i < sp->ss_ninos && j < INOPB(lfsp); j++, i++) {			if (j > 0) 				(void)printf(", ");			(void)printf("%d", inop[j].di_inumber);		}		(void)printf("}");		if (((i/INOPB(lfsp)) % 4) == 3)			(void)printf("\n");	}	free(inop);	printf("\n");	for (fp = (FINFO *)(sp + 1), i = 0; i < sp->ss_nfinfo; i++) {		numblocks += fp->fi_nblocks;		(void)printf("    FINFO for inode: %d version %d nblocks %d\n",		    fp->fi_ino, fp->fi_version, fp->fi_nblocks);		dp = &(fp->fi_blocks[0]);		for (j = 0; j < fp->fi_nblocks; j++, dp++) {			(void)printf("\t%d", *dp);			if ((j % 8) == 7)				(void)printf("\n");		}		if ((j % 8) != 0)			(void)printf("\n");		fp = (FINFO *)dp;	}	return (numblocks);}static voiddump_segment(fd, segnum, addr, lfsp, dump_sb)	int fd, segnum;	daddr_t addr;	struct lfs *lfsp;	int dump_sb;{	struct lfs lfs_sb, *sbp;	SEGSUM *sump;	char sumblock[LFS_SUMMARY_SIZE];	int did_one, nblocks, sb;	off_t sum_offset, super_off;	(void)printf("\nSEGMENT %d (Disk Address 0x%X)\n",	    addr >> (lfsp->lfs_segshift - daddr_shift), addr);	sum_offset = (addr << (lfsp->lfs_bshift - lfsp->lfs_fsbtodb));	sb = 0;	did_one = 0;	do {		get(fd, sum_offset, sumblock, LFS_SUMMARY_SIZE);		sump = (SEGSUM *)sumblock;		if (sump->ss_sumsum != cksum (&sump->ss_datasum, 			LFS_SUMMARY_SIZE - sizeof(sump->ss_sumsum))) {			sbp = (struct lfs *)sump;			if (sb = (sbp->lfs_magic == LFS_MAGIC)) {				super_off = sum_offset;				sum_offset += LFS_SBPAD;			} else if (did_one)				break;			else {				printf("Segment at 0x%X corrupt\n", addr);				break;			}		} else {			nblocks = dump_sum(fd, lfsp, sump, segnum, sum_offset >>			     (lfsp->lfs_bshift - lfsp->lfs_fsbtodb));			if (nblocks)				sum_offset += LFS_SUMMARY_SIZE + 					(nblocks << lfsp->lfs_bshift);			else				sum_offset = 0;			did_one = 1;		}	} while (sum_offset);	if (dump_sb && sb)  {		get(fd, super_off, &lfs_sb, sizeof(struct lfs));		dump_super(&lfs_sb);	}	return;}static voiddump_super(lfsp)	struct lfs *lfsp;{	int i;	(void)printf("%s0x%X\t%s0x%X\t%s%d\t%s%d\n",		"magic    ", lfsp->lfs_magic,		"version  ", lfsp->lfs_version,		"size     ", lfsp->lfs_size,		"ssize    ", lfsp->lfs_ssize);	(void)printf("%s%d\t\t%s%d\t%s%d\t%s%d\n",		"dsize    ", lfsp->lfs_dsize,		"bsize    ", lfsp->lfs_bsize,		"fsize    ", lfsp->lfs_fsize,		"frag     ", lfsp->lfs_frag);	(void)printf("%s%d\t\t%s%d\t%s%d\t%s%d\n",		"minfree  ", lfsp->lfs_minfree,		"inopb    ", lfsp->lfs_inopb,		"ifpb     ", lfsp->lfs_ifpb,		"nindir   ", lfsp->lfs_nindir);	(void)printf("%s%d\t\t%s%d\t%s%d\t%s%d\n",		"nseg     ", lfsp->lfs_nseg,		"nspf     ", lfsp->lfs_nspf,		"cleansz  ", lfsp->lfs_cleansz,		"segtabsz ", lfsp->lfs_segtabsz);	(void)printf("%s0x%X\t%s%d\t%s0x%X\t%s%d\n",		"segmask  ", lfsp->lfs_segmask,		"segshift ", lfsp->lfs_segshift,		"bmask    ", lfsp->lfs_bmask,		"bshift   ", lfsp->lfs_bshift);	(void)printf("%s0x%X\t\t%s%d\t%s0x%X\t%s%d\n",		"ffmask   ", lfsp->lfs_ffmask,		"ffshift  ", lfsp->lfs_ffshift,		"fbmask   ", lfsp->lfs_fbmask,		"fbshift  ", lfsp->lfs_fbshift);	(void)printf("%s%d\t%s%d\t%s0x%X\t%s0x%qx\n",		"sushift  ", lfsp->lfs_sushift,		"fsbtodb  ", lfsp->lfs_fsbtodb,		"cksum    ", lfsp->lfs_cksum,		"maxfilesize  ", lfsp->lfs_maxfilesize);	(void)printf("Superblock disk addresses:\t");	for (i = 0; i < LFS_MAXNUMSB; i++) {		(void)printf(" 0x%X", lfsp->lfs_sboffs[i]);		if ( i == (LFS_MAXNUMSB >> 1))			(void)printf("\n\t\t\t\t");	}	(void)printf("\n");	(void)printf("Checkpoint Info\n");	(void)printf("%s%d\t%s0x%X\t%s%d\n",		"free     ", lfsp->lfs_free,		"idaddr   ", lfsp->lfs_idaddr,		"ifile    ", lfsp->lfs_ifile);	(void)printf("%s%d\t%s%d\t%s%d\n",		"bfree    ", lfsp->lfs_bfree,		"avail    ", lfsp->lfs_avail,		"uinodes  ", lfsp->lfs_uinodes);	(void)printf("%s%d\t%s0x%X\t%s0x%X\n%s0x%X\t%s0x%X\t",		"nfiles   ", lfsp->lfs_nfiles,		"lastseg  ", lfsp->lfs_lastseg,		"nextseg  ", lfsp->lfs_nextseg,		"curseg   ", lfsp->lfs_curseg,		"offset   ", lfsp->lfs_offset);	(void)printf("tstamp   %s", ctime((time_t *)&lfsp->lfs_tstamp));	(void)printf("\nIn-Memory Information\n");	(void)printf("%s%d\t%s0x%X\t%s%d%s%d\t%s%d\n",		"seglock  ", lfsp->lfs_seglock,		"iocount  ", lfsp->lfs_iocount,		"writer   ", lfsp->lfs_writer,		"dirops   ", lfsp->lfs_dirops,		"doifile  ", lfsp->lfs_doifile);	(void)printf("%s%d\t%s%d\t%s0x%X\t%s%d\n",		"nactive  ", lfsp->lfs_nactive,		"fmod     ", lfsp->lfs_fmod,		"clean    ", lfsp->lfs_clean,		"ronly    ", lfsp->lfs_ronly);}static voidaddseg(arg)	char *arg;{	SEGLIST *p;	if ((p = malloc(sizeof(SEGLIST))) == NULL)		err("%s", strerror(errno));	p->next = seglist;	p->num = atoi(arg);	seglist = p;}static voiddump_cleaner_info(lfsp, ipage)	struct lfs *lfsp;	void *ipage;{	CLEANERINFO *cip;	cip = (CLEANERINFO *)ipage;	(void)printf("segments clean\t%d\tsegments dirty\t%d\n\n",	    cip->clean, cip->dirty);}static voidusage(){	(void)fprintf(stderr, "usage: dumplfs [-ai] [-s segnum] file\n");	exit(1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -