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

📄 fsck_minix.c

📁 为samsung2410 ARM移植的busybox工具包
💻 C
📖 第 1 页 / 共 3 页
字号:
		block = check_zone_nr(inode->i_zone + 7, &changed);		read_block(block, (char *) ind);		blk_chg = 0;		result = check_zone_nr(blknr + ind, &blk_chg);		if (blk_chg)			write_block(block, (char *) ind);		return result;	}	blknr -= 512;	block = check_zone_nr(inode->i_zone + 8, &changed);	read_block(block, (char *) dind);	blk_chg = 0;	result = check_zone_nr(dind + (blknr / 512), &blk_chg);	if (blk_chg)		write_block(block, (char *) dind);	block = result;	read_block(block, (char *) ind);	blk_chg = 0;	result = check_zone_nr(ind + (blknr % 512), &blk_chg);	if (blk_chg)		write_block(block, (char *) ind);	return result;}#ifdef BB_FEATURE_MINIX2static int map_block2(struct minix2_inode *inode, unsigned int blknr){	unsigned int ind[BLOCK_SIZE >> 2];	unsigned int dind[BLOCK_SIZE >> 2];	unsigned int tind[BLOCK_SIZE >> 2];	int blk_chg, block, result;	if (blknr < 7)		return check_zone_nr2(inode->i_zone + blknr, &changed);	blknr -= 7;	if (blknr < 256) {		block = check_zone_nr2(inode->i_zone + 7, &changed);		read_block(block, (char *) ind);		blk_chg = 0;		result = check_zone_nr2(blknr + ind, &blk_chg);		if (blk_chg)			write_block(block, (char *) ind);		return result;	}	blknr -= 256;	if (blknr >= 256 * 256) {		block = check_zone_nr2(inode->i_zone + 8, &changed);		read_block(block, (char *) dind);		blk_chg = 0;		result = check_zone_nr2(dind + blknr / 256, &blk_chg);		if (blk_chg)			write_block(block, (char *) dind);		block = result;		read_block(block, (char *) ind);		blk_chg = 0;		result = check_zone_nr2(ind + blknr % 256, &blk_chg);		if (blk_chg)			write_block(block, (char *) ind);		return result;	}	blknr -= 256 * 256;	block = check_zone_nr2(inode->i_zone + 9, &changed);	read_block(block, (char *) tind);	blk_chg = 0;	result = check_zone_nr2(tind + blknr / (256 * 256), &blk_chg);	if (blk_chg)		write_block(block, (char *) tind);	block = result;	read_block(block, (char *) dind);	blk_chg = 0;	result = check_zone_nr2(dind + (blknr / 256) % 256, &blk_chg);	if (blk_chg)		write_block(block, (char *) dind);	block = result;	read_block(block, (char *) ind);	blk_chg = 0;	result = check_zone_nr2(ind + blknr % 256, &blk_chg);	if (blk_chg)		write_block(block, (char *) ind);	return result;}#endifstatic void write_super_block(void){	/*	 * Set the state of the filesystem based on whether or not there	 * are uncorrected errors.  The filesystem valid flag is	 * unconditionally set if we get this far.	 */	Super.s_state |= MINIX_VALID_FS;	if (errors_uncorrected)		Super.s_state |= MINIX_ERROR_FS;	else		Super.s_state &= ~MINIX_ERROR_FS;	if (BLOCK_SIZE != lseek(IN, BLOCK_SIZE, SEEK_SET))		die("seek failed in write_super_block");	if (BLOCK_SIZE != write(IN, super_block_buffer, BLOCK_SIZE))		die("unable to write super-block");	return;}static void write_tables(void){	write_super_block();	if (IMAPS * BLOCK_SIZE != write(IN, inode_map, IMAPS * BLOCK_SIZE))		die("Unable to write inode map");	if (ZMAPS * BLOCK_SIZE != write(IN, zone_map, ZMAPS * BLOCK_SIZE))		die("Unable to write zone map");	if (INODE_BUFFER_SIZE != write(IN, inode_buffer, INODE_BUFFER_SIZE))		die("Unable to write inodes");}static void get_dirsize(void){	int block;	char blk[BLOCK_SIZE];	int size;#ifdef BB_FEATURE_MINIX2	if (version2)		block = Inode2[ROOT_INO].i_zone[0];	else#endif		block = Inode[ROOT_INO].i_zone[0];	read_block(block, blk);	for (size = 16; size < BLOCK_SIZE; size <<= 1) {		if (strcmp(blk + size + 2, "..") == 0) {			dirsize = size;			namelen = size - 2;			return;		}	}	/* use defaults */}static void read_superblock(void){	if (BLOCK_SIZE != lseek(IN, BLOCK_SIZE, SEEK_SET))		die("seek failed");	if (BLOCK_SIZE != read(IN, super_block_buffer, BLOCK_SIZE))		die("unable to read super block");	if (MAGIC == MINIX_SUPER_MAGIC) {		namelen = 14;		dirsize = 16;		version2 = 0;	} else if (MAGIC == MINIX_SUPER_MAGIC2) {		namelen = 30;		dirsize = 32;		version2 = 0;#ifdef BB_FEATURE_MINIX2	} else if (MAGIC == MINIX2_SUPER_MAGIC) {		namelen = 14;		dirsize = 16;		version2 = 1;	} else if (MAGIC == MINIX2_SUPER_MAGIC2) {		namelen = 30;		dirsize = 32;		version2 = 1;#endif	} else		die("bad magic number in super-block");	if (ZONESIZE != 0 || BLOCK_SIZE != 1024)		die("Only 1k blocks/zones supported");	if (IMAPS * BLOCK_SIZE * 8 < INODES + 1)		die("bad s_imap_blocks field in super-block");	if (ZMAPS * BLOCK_SIZE * 8 < ZONES - FIRSTZONE + 1)		die("bad s_zmap_blocks field in super-block");}static void read_tables(void){	inode_map = xmalloc(IMAPS * BLOCK_SIZE);	zone_map = xmalloc(ZMAPS * BLOCK_SIZE);	memset(inode_map, 0, sizeof(inode_map));	memset(zone_map, 0, sizeof(zone_map));	inode_buffer = xmalloc(INODE_BUFFER_SIZE);	inode_count = xmalloc(INODES + 1);	zone_count = xmalloc(ZONES);	if (IMAPS * BLOCK_SIZE != read(IN, inode_map, IMAPS * BLOCK_SIZE))		die("Unable to read inode map");	if (ZMAPS * BLOCK_SIZE != read(IN, zone_map, ZMAPS * BLOCK_SIZE))		die("Unable to read zone map");	if (INODE_BUFFER_SIZE != read(IN, inode_buffer, INODE_BUFFER_SIZE))		die("Unable to read inodes");	if (NORM_FIRSTZONE != FIRSTZONE) {		printf("Warning: Firstzone != Norm_firstzone\n");		errors_uncorrected = 1;	}	get_dirsize();	if (show) {		printf("%ld inodes\n", INODES);		printf("%ld blocks\n", ZONES);		printf("Firstdatazone=%ld (%ld)\n", FIRSTZONE, NORM_FIRSTZONE);		printf("Zonesize=%d\n", BLOCK_SIZE << ZONESIZE);		printf("Maxsize=%ld\n", MAXSIZE);		printf("Filesystem state=%d\n", Super.s_state);		printf("namelen=%d\n\n", namelen);	}}static struct minix_inode *get_inode(unsigned int nr){	struct minix_inode *inode;	if (!nr || nr > INODES)		return NULL;	total++;	inode = Inode + nr;	if (!inode_count[nr]) {		if (!inode_in_use(nr)) {			printf("Inode %d marked not used, but used for file '", nr);			print_current_name();			printf("'\n");			if (repair) {				if (ask("Mark in use", 1))					mark_inode(nr);			} else {				errors_uncorrected = 1;			}		}		if (S_ISDIR(inode->i_mode))			directory++;		else if (S_ISREG(inode->i_mode))			regular++;		else if (S_ISCHR(inode->i_mode))			chardev++;		else if (S_ISBLK(inode->i_mode))			blockdev++;		else if (S_ISLNK(inode->i_mode))			symlinks++;		else if (S_ISSOCK(inode->i_mode));		else if (S_ISFIFO(inode->i_mode));		else {			print_current_name();			printf(" has mode %05o\n", inode->i_mode);		}	} else		links++;	if (!++inode_count[nr]) {		printf("Warning: inode count too big.\n");		inode_count[nr]--;		errors_uncorrected = 1;	}	return inode;}#ifdef BB_FEATURE_MINIX2static struct minix2_inode *get_inode2(unsigned int nr){	struct minix2_inode *inode;	if (!nr || nr > INODES)		return NULL;	total++;	inode = Inode2 + nr;	if (!inode_count[nr]) {		if (!inode_in_use(nr)) {			printf("Inode %d marked not used, but used for file '", nr);			print_current_name();			printf("'\n");			if (repair) {				if (ask("Mark in use", 1))					mark_inode(nr);				else					errors_uncorrected = 1;			}		}		if (S_ISDIR(inode->i_mode))			directory++;		else if (S_ISREG(inode->i_mode))			regular++;		else if (S_ISCHR(inode->i_mode))			chardev++;		else if (S_ISBLK(inode->i_mode))			blockdev++;		else if (S_ISLNK(inode->i_mode))			symlinks++;		else if (S_ISSOCK(inode->i_mode));		else if (S_ISFIFO(inode->i_mode));		else {			print_current_name();			printf(" has mode %05o\n", inode->i_mode);		}	} else		links++;	if (!++inode_count[nr]) {		printf("Warning: inode count too big.\n");		inode_count[nr]--;		errors_uncorrected = 1;	}	return inode;}#endifstatic void check_root(void){	struct minix_inode *inode = Inode + ROOT_INO;	if (!inode || !S_ISDIR(inode->i_mode))		die("root inode isn't a directory");}#ifdef BB_FEATURE_MINIX2static void check_root2(void){	struct minix2_inode *inode = Inode2 + ROOT_INO;	if (!inode || !S_ISDIR(inode->i_mode))		die("root inode isn't a directory");}#endifstatic int add_zone(unsigned short *znr, int *corrected){	int result;	int block;	result = 0;	block = check_zone_nr(znr, corrected);	if (!block)		return 0;	if (zone_count[block]) {		printf("Block has been used before. Now in file `");		print_current_name();		printf("'.");		if (ask("Clear", 1)) {			*znr = 0;			block = 0;			*corrected = 1;		}	}	if (!block)		return 0;	if (!zone_in_use(block)) {		printf("Block %d in file `", block);		print_current_name();		printf("' is marked not in use.");		if (ask("Correct", 1))			mark_zone(block);	}	if (!++zone_count[block])		zone_count[block]--;	return block;}#ifdef BB_FEATURE_MINIX2static int add_zone2(unsigned int *znr, int *corrected){	int result;	int block;	result = 0;	block = check_zone_nr2(znr, corrected);	if (!block)		return 0;	if (zone_count[block]) {		printf("Block has been used before. Now in file `");		print_current_name();		printf("'.");		if (ask("Clear", 1)) {			*znr = 0;			block = 0;			*corrected = 1;		}	}	if (!block)		return 0;	if (!zone_in_use(block)) {		printf("Block %d in file `", block);		print_current_name();		printf("' is marked not in use.");		if (ask("Correct", 1))			mark_zone(block);	}	if (!++zone_count[block])		zone_count[block]--;	return block;}#endifstatic void add_zone_ind(unsigned short *znr, int *corrected){	static char blk[BLOCK_SIZE];	int i, chg_blk = 0;	int block;	block = add_zone(znr, corrected);	if (!block)		return;	read_block(block, blk);	for (i = 0; i < (BLOCK_SIZE >> 1); i++)		add_zone(i + (unsigned short *) blk, &chg_blk);	if (chg_blk)		write_block(block, blk);}#ifdef BB_FEATURE_MINIX2static void add_zone_ind2(unsigned int *znr, int *corrected){	static char blk[BLOCK_SIZE];	int i, chg_blk = 0;	int block;	block = add_zone2(znr, corrected);	if (!block)		return;	read_block(block, blk);	for (i = 0; i < BLOCK_SIZE >> 2; i++)		add_zone2(i + (unsigned int *) blk, &chg_blk);	if (chg_blk)		write_block(block, blk);}#endifstatic void add_zone_dind(unsigned short *znr, int *corrected){	static char blk[BLOCK_SIZE];	int i, blk_chg = 0;	int block;	block = add_zone(znr, corrected);	if (!block)		return;	read_block(block, blk);	for (i = 0; i < (BLOCK_SIZE >> 1); i++)		add_zone_ind(i + (unsigned short *) blk, &blk_chg);	if (blk_chg)		write_block(block, blk);}#ifdef BB_FEATURE_MINIX2static void add_zone_dind2(unsigned int *znr, int *corrected){	static char blk[BLOCK_SIZE];	int i, blk_chg = 0;	int block;	block = add_zone2(znr, corrected);	if (!block)		return;	read_block(block, blk);	for (i = 0; i < BLOCK_SIZE >> 2; i++)		add_zone_ind2(i + (unsigned int *) blk, &blk_chg);	if (blk_chg)		write_block(block, blk);}static void add_zone_tind2(unsigned int *znr, int *corrected){	static char blk[BLOCK_SIZE];	int i, blk_chg = 0;	int block;	block = add_zone2(znr, corrected);	if (!block)		return;	read_block(block, blk);	for (i = 0; i < BLOCK_SIZE >> 2; i++)		add_zone_dind2(i + (unsigned int *) blk, &blk_chg);	if (blk_chg)		write_block(block, blk);}#endifstatic void check_zones(unsigned int i){	struct minix_inode *inode;	if (!i || i > INODES)		return;	if (inode_count[i] > 1)		/* have we counted this file already? */		return;	inode = Inode + i;	if (!S_ISDIR(inode->i_mode) && !S_ISREG(inode->i_mode) &&		!S_ISLNK(inode->i_mode)) return;	for (i = 0; i < 7; i++)		add_zone(i + inode->i_zone, &changed);	add_zone_ind(7 + inode->i_zone, &changed);	add_zone_dind(8 + inode->i_zone, &changed);}#ifdef BB_FEATURE_MINIX2static void check_zones2(unsigned int i){	struct minix2_inode *inode;	if (!i || i > INODES)		return;

⌨️ 快捷键说明

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