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

📄 fsck.minix.c

📁 Util-linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理硬盘驱动器
💻 C
📖 第 1 页 / 共 3 页
字号:
		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;}static voidwrite_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 voidwrite_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 voidget_dirsize (void) {	int block;	char blk[BLOCK_SIZE];	int size;	if (version2)		block = Inode2[ROOT_INO].i_zone[0];	else		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 voidread_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;	} else if (MAGIC == MINIX2_SUPER_MAGIC) {		namelen = 14;		dirsize = 16;		version2 = 1;	} else if (MAGIC == MINIX2_SUPER_MAGIC2) {		namelen = 30;		dirsize = 32;		version2 = 1;	} 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 voidread_tables(void) {	inode_map = malloc(IMAPS * BLOCK_SIZE);	if (!inode_map)		die(_("Unable to allocate buffer for inode map"));	zone_map = malloc(ZMAPS * BLOCK_SIZE);	if (!inode_map)		die("Unable to allocate buffer for zone map");	memset(inode_map,0,sizeof(inode_map));	memset(zone_map,0,sizeof(zone_map));	inode_buffer = malloc(INODE_BUFFER_SIZE);	if (!inode_buffer)		die(_("Unable to allocate buffer for inodes"));	inode_count = malloc(INODES + 1);	if (!inode_count)		die(_("Unable to allocate buffer for inode count"));	zone_count = malloc(ZONES);	if (!zone_count)		die(_("Unable to allocate buffer for zone count"));	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)) {			get_current_name();			printf(_("Inode %d marked unused, "				 "but used for file '%s'\n"),			       nr, current_name);			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 {                        get_current_name();                        printf(_("The file `%s' has mode %05o\n"),			       current_name, inode->i_mode);                }	} else		links++;	if (!++inode_count[nr]) {		printf(_("Warning: inode count too big.\n"));		inode_count[nr]--;		errors_uncorrected = 1;	}	return inode;}static 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)) {			get_current_name();			printf (_("Inode %d marked unused, "				  "but used for file '%s'\n"),				nr, current_name);			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 {			get_current_name ();			printf (_("The file `%s' has mode %05o\n"),				current_name, inode->i_mode);		}	} else		links++;	if (!++inode_count[nr]) {		printf (_("Warning: inode count too big.\n"));		inode_count[nr]--;		errors_uncorrected = 1;	}	return inode;}static voidcheck_root(void) {	struct minix_inode * inode = Inode + ROOT_INO;	if (!inode || !S_ISDIR(inode->i_mode))		die(_("root inode isn't a directory"));}static voidcheck_root2 (void) {	struct minix2_inode *inode = Inode2 + ROOT_INO;	if (!inode || !S_ISDIR (inode->i_mode))		die ("root inode isn't a directory");}static intadd_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]) {		get_current_name();		printf(_("Block has been used before. Now in file `%s'."),		       current_name);		if (ask(_("Clear"),1)) {			*znr = 0;			block = 0;			*corrected = 1;		}	}	if (!block)		return 0;	if (!zone_in_use(block)) {		get_current_name();		printf(_("Block %d in file `%s' is marked not in use."),		       block, current_name);		if (ask(_("Correct"),1))			mark_zone(block);	}	if (!++zone_count[block])		zone_count[block]--;	return block;}static intadd_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]) {		get_current_name();		printf (_("Block has been used before. Now in file `%s'."),			current_name);		if (ask (_("Clear"), 1)) {			*znr = 0;			block = 0;			*corrected = 1;		}	}	if (!block)		return 0;	if (!zone_in_use (block)) {		get_current_name();		printf (_("Block %d in file `%s' is marked not in use."),			block, current_name);		if (ask (_("Correct"), 1))			mark_zone (block);	}	if (!++zone_count[block])		zone_count[block]--;	return block;}static voidadd_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);}static voidadd_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);}static voidadd_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);}static voidadd_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 voidadd_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);}static voidcheck_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);}static voidcheck_zones2 (unsigned int i) {	struct minix2_inode *inode;	if (!i || i > INODES)		return;	if (inode_count[i] > 1)	/* have we counted this file already? */		return;	inode = Inode2 + i;

⌨️ 快捷键说明

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