📄 fsck.minix.c
字号:
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 + -