fsck_minix: getopt32-ification; code shrink; reduce stack usage;
fix bug in map_block2: s/(blknr >= 256 * 256)/(blknr < 256 * 256)/ function old new delta get_inode_common - 291 +291 add_zone_common - 205 +205 ask 229 215 -14 write_super_block 109 90 -19 write_block 653 629 -24 bad_zone 95 64 -31 read_block 241 198 -43 fsck_minix_main 3285 3195 -90 add_zone2 217 34 -183 add_zone 216 33 -183 recursive_check 1097 866 -231 recursive_check2 1340 956 -384 ------------------------------------------------------------------------------ (add/remove: 2/0 grow/shrink: 0/10 up/down: 496/-1202) Total: -706 bytes text data bss dec hex filename 799349 661 7428 807438 c520e busybox_old 798437 661 7428 806526 c4e7e busybox_unstripped
This commit is contained in:
parent
3f165fa5b3
commit
9f153f610f
@ -13,11 +13,14 @@
|
|||||||
*/
|
*/
|
||||||
char filter_accept_reject_list(archive_handle_t *archive_handle)
|
char filter_accept_reject_list(archive_handle_t *archive_handle)
|
||||||
{
|
{
|
||||||
const char *key = archive_handle->file_header->name;
|
const char *key;
|
||||||
const llist_t *reject_entry = find_list_entry2(archive_handle->reject, key);
|
const llist_t *reject_entry;
|
||||||
const llist_t *accept_entry;
|
const llist_t *accept_entry;
|
||||||
|
|
||||||
|
key = archive_handle->file_header->name;
|
||||||
|
|
||||||
/* If the key is in a reject list fail */
|
/* If the key is in a reject list fail */
|
||||||
|
reject_entry = find_list_entry2(archive_handle->reject, key);
|
||||||
if (reject_entry) {
|
if (reject_entry) {
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ const llist_t *find_list_entry2(const llist_t *list, const char *filename)
|
|||||||
if (*c++ == '/') pattern_slash_cnt++;
|
if (*c++ == '/') pattern_slash_cnt++;
|
||||||
c = filename;
|
c = filename;
|
||||||
d = buf;
|
d = buf;
|
||||||
/* paranoia is better that buffer overflows */
|
/* paranoia is better than buffer overflows */
|
||||||
while (*c && d != buf + sizeof(buf)-1) {
|
while (*c && d != buf + sizeof(buf)-1) {
|
||||||
if (*c == '/' && --pattern_slash_cnt < 0)
|
if (*c == '/' && --pattern_slash_cnt < 0)
|
||||||
break;
|
break;
|
||||||
|
@ -95,6 +95,13 @@
|
|||||||
#define BLKGETSIZE _IO(0x12,96) /* return device size */
|
#define BLKGETSIZE _IO(0x12,96) /* return device size */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct BUG_bad_inode_size {
|
||||||
|
char BUG_bad_inode1_size[(INODE_SIZE1 * MINIX1_INODES_PER_BLOCK != BLOCK_SIZE) ? -1 : 1];
|
||||||
|
#if ENABLE_FEATURE_MINIX2
|
||||||
|
char BUG_bad_inode2_size[(INODE_SIZE2 * MINIX2_INODES_PER_BLOCK != BLOCK_SIZE) ? -1 : 1];
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
#ifdef UNUSED
|
#ifdef UNUSED
|
||||||
MINIX1_LINK_MAX = 250,
|
MINIX1_LINK_MAX = 250,
|
||||||
@ -107,6 +114,7 @@ enum {
|
|||||||
MINIX_NAME_MAX = 255, /* # chars in a file name */
|
MINIX_NAME_MAX = 255, /* # chars in a file name */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#if !ENABLE_FEATURE_MINIX2
|
#if !ENABLE_FEATURE_MINIX2
|
||||||
enum { version2 = 0 };
|
enum { version2 = 0 };
|
||||||
#endif
|
#endif
|
||||||
@ -118,13 +126,12 @@ struct globals {
|
|||||||
#if ENABLE_FEATURE_MINIX2
|
#if ENABLE_FEATURE_MINIX2
|
||||||
smallint version2;
|
smallint version2;
|
||||||
#endif
|
#endif
|
||||||
smallint repair, automatic, verbose, list, show, warn_mode, force;
|
|
||||||
smallint changed; /* is filesystem modified? */
|
smallint changed; /* is filesystem modified? */
|
||||||
smallint errors_uncorrected; /* flag if some error was not corrected */
|
smallint errors_uncorrected; /* flag if some error was not corrected */
|
||||||
smallint termios_set;
|
smallint termios_set;
|
||||||
smallint dirsize;
|
smallint dirsize;
|
||||||
smallint namelen;
|
smallint namelen;
|
||||||
char *device_name;
|
const char *device_name;
|
||||||
int directory, regular, blockdev, chardev, links, symlinks, total;
|
int directory, regular, blockdev, chardev, links, symlinks, total;
|
||||||
char *inode_buffer;
|
char *inode_buffer;
|
||||||
|
|
||||||
@ -155,13 +162,6 @@ struct globals {
|
|||||||
#if ENABLE_FEATURE_MINIX2
|
#if ENABLE_FEATURE_MINIX2
|
||||||
#define version2 (G.version2 )
|
#define version2 (G.version2 )
|
||||||
#endif
|
#endif
|
||||||
#define repair (G.repair )
|
|
||||||
#define automatic (G.automatic )
|
|
||||||
#define verbose (G.verbose )
|
|
||||||
#define list (G.list )
|
|
||||||
#define show (G.show )
|
|
||||||
#define warn_mode (G.warn_mode )
|
|
||||||
#define force (G.force )
|
|
||||||
#define changed (G.changed )
|
#define changed (G.changed )
|
||||||
#define errors_uncorrected (G.errors_uncorrected )
|
#define errors_uncorrected (G.errors_uncorrected )
|
||||||
#define termios_set (G.termios_set )
|
#define termios_set (G.termios_set )
|
||||||
@ -198,6 +198,28 @@ struct globals {
|
|||||||
name_component[0] = ¤t_name[0]; \
|
name_component[0] = ¤t_name[0]; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
|
#define OPTION_STR "larvsmf"
|
||||||
|
enum {
|
||||||
|
OPT_l = (1 << 0),
|
||||||
|
OPT_a = (1 << 1),
|
||||||
|
OPT_r = (1 << 2),
|
||||||
|
OPT_v = (1 << 3),
|
||||||
|
OPT_s = (1 << 4),
|
||||||
|
OPT_w = (1 << 5),
|
||||||
|
OPT_f = (1 << 6),
|
||||||
|
};
|
||||||
|
#define OPT_list (option_mask32 & OPT_l)
|
||||||
|
#define OPT_automatic (option_mask32 & OPT_a)
|
||||||
|
#define OPT_repair (option_mask32 & OPT_r)
|
||||||
|
#define OPT_verbose (option_mask32 & OPT_v)
|
||||||
|
#define OPT_show (option_mask32 & OPT_s)
|
||||||
|
#define OPT_warn_mode (option_mask32 & OPT_w)
|
||||||
|
#define OPT_force (option_mask32 & OPT_f)
|
||||||
|
/* non-automatic repairs requested? */
|
||||||
|
#define OPT_manual ((option_mask32 & (OPT_a|OPT_r)) == OPT_r)
|
||||||
|
|
||||||
|
|
||||||
#define Inode1 (((struct minix1_inode *) inode_buffer)-1)
|
#define Inode1 (((struct minix1_inode *) inode_buffer)-1)
|
||||||
#define Inode2 (((struct minix2_inode *) inode_buffer)-1)
|
#define Inode2 (((struct minix2_inode *) inode_buffer)-1)
|
||||||
|
|
||||||
@ -306,12 +328,12 @@ static int ask(const char *string, int def)
|
|||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
if (!repair) {
|
if (!OPT_repair) {
|
||||||
bb_putchar('\n');
|
bb_putchar('\n');
|
||||||
errors_uncorrected = 1;
|
errors_uncorrected = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (automatic) {
|
if (OPT_automatic) {
|
||||||
bb_putchar('\n');
|
bb_putchar('\n');
|
||||||
if (!def)
|
if (!def)
|
||||||
errors_uncorrected = 1;
|
errors_uncorrected = 1;
|
||||||
@ -423,20 +445,16 @@ static int check_zone_nr(uint16_t *nr, smallint *corrected)
|
|||||||
/*
|
/*
|
||||||
* read-block reads block nr into the buffer at addr.
|
* read-block reads block nr into the buffer at addr.
|
||||||
*/
|
*/
|
||||||
static void read_block(unsigned nr, char *addr)
|
static void read_block(unsigned nr, void *addr)
|
||||||
{
|
{
|
||||||
if (!nr) {
|
if (!nr) {
|
||||||
memset(addr, 0, BLOCK_SIZE);
|
memset(addr, 0, BLOCK_SIZE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (BLOCK_SIZE * nr != lseek(dev_fd, BLOCK_SIZE * nr, SEEK_SET)) {
|
xlseek(dev_fd, BLOCK_SIZE * nr, SEEK_SET);
|
||||||
printf("%s: cannot seek to block in file '%s'\n",
|
if (BLOCK_SIZE != full_read(dev_fd, addr, BLOCK_SIZE)) {
|
||||||
bb_msg_read_error, current_name);
|
printf("%s: bad block %u in file '%s'\n",
|
||||||
errors_uncorrected = 1;
|
bb_msg_read_error, nr, current_name);
|
||||||
memset(addr, 0, BLOCK_SIZE);
|
|
||||||
} else if (BLOCK_SIZE != read(dev_fd, addr, BLOCK_SIZE)) {
|
|
||||||
printf("%s: bad block in file '%s'\n",
|
|
||||||
bb_msg_read_error, current_name);
|
|
||||||
errors_uncorrected = 1;
|
errors_uncorrected = 1;
|
||||||
memset(addr, 0, BLOCK_SIZE);
|
memset(addr, 0, BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
@ -445,7 +463,7 @@ static void read_block(unsigned nr, char *addr)
|
|||||||
/*
|
/*
|
||||||
* write_block writes block nr to disk.
|
* write_block writes block nr to disk.
|
||||||
*/
|
*/
|
||||||
static void write_block(unsigned nr, char *addr)
|
static void write_block(unsigned nr, void *addr)
|
||||||
{
|
{
|
||||||
if (!nr)
|
if (!nr)
|
||||||
return;
|
return;
|
||||||
@ -455,11 +473,10 @@ static void write_block(unsigned nr, char *addr)
|
|||||||
errors_uncorrected = 1;
|
errors_uncorrected = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (BLOCK_SIZE * nr != lseek(dev_fd, BLOCK_SIZE * nr, SEEK_SET))
|
xlseek(dev_fd, BLOCK_SIZE * nr, SEEK_SET);
|
||||||
die("seek failed in write_block");
|
if (BLOCK_SIZE != full_write(dev_fd, addr, BLOCK_SIZE)) {
|
||||||
if (BLOCK_SIZE != write(dev_fd, addr, BLOCK_SIZE)) {
|
printf("%s: bad block %u in file '%s'\n",
|
||||||
printf("%s: bad block in file '%s'\n",
|
bb_msg_write_error, nr, current_name);
|
||||||
bb_msg_write_error, current_name);
|
|
||||||
errors_uncorrected = 1;
|
errors_uncorrected = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -472,7 +489,6 @@ static void write_block(unsigned nr, char *addr)
|
|||||||
static int map_block(struct minix1_inode *inode, unsigned blknr)
|
static int map_block(struct minix1_inode *inode, unsigned blknr)
|
||||||
{
|
{
|
||||||
uint16_t ind[BLOCK_SIZE >> 1];
|
uint16_t ind[BLOCK_SIZE >> 1];
|
||||||
uint16_t dind[BLOCK_SIZE >> 1];
|
|
||||||
int block, result;
|
int block, result;
|
||||||
smallint blk_chg;
|
smallint blk_chg;
|
||||||
|
|
||||||
@ -481,26 +497,22 @@ static int map_block(struct minix1_inode *inode, unsigned blknr)
|
|||||||
blknr -= 7;
|
blknr -= 7;
|
||||||
if (blknr < 512) {
|
if (blknr < 512) {
|
||||||
block = check_zone_nr(inode->i_zone + 7, &changed);
|
block = check_zone_nr(inode->i_zone + 7, &changed);
|
||||||
read_block(block, (char *) ind);
|
goto common;
|
||||||
blk_chg = 0;
|
|
||||||
result = check_zone_nr(blknr + ind, &blk_chg);
|
|
||||||
if (blk_chg)
|
|
||||||
write_block(block, (char *) ind);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
blknr -= 512;
|
blknr -= 512;
|
||||||
block = check_zone_nr(inode->i_zone + 8, &changed);
|
block = check_zone_nr(inode->i_zone + 8, &changed);
|
||||||
read_block(block, (char *) dind);
|
read_block(block, ind); /* double indirect */
|
||||||
blk_chg = 0;
|
blk_chg = 0;
|
||||||
result = check_zone_nr(dind + (blknr / 512), &blk_chg);
|
result = check_zone_nr(&ind[blknr / 512], &blk_chg);
|
||||||
if (blk_chg)
|
if (blk_chg)
|
||||||
write_block(block, (char *) dind);
|
write_block(block, ind);
|
||||||
block = result;
|
block = result;
|
||||||
read_block(block, (char *) ind);
|
common:
|
||||||
|
read_block(block, ind);
|
||||||
blk_chg = 0;
|
blk_chg = 0;
|
||||||
result = check_zone_nr(ind + (blknr % 512), &blk_chg);
|
result = check_zone_nr(&ind[blknr % 512], &blk_chg);
|
||||||
if (blk_chg)
|
if (blk_chg)
|
||||||
write_block(block, (char *) ind);
|
write_block(block, ind);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -508,8 +520,6 @@ static int map_block(struct minix1_inode *inode, unsigned blknr)
|
|||||||
static int map_block2(struct minix2_inode *inode, unsigned blknr)
|
static int map_block2(struct minix2_inode *inode, unsigned blknr)
|
||||||
{
|
{
|
||||||
uint32_t ind[BLOCK_SIZE >> 2];
|
uint32_t ind[BLOCK_SIZE >> 2];
|
||||||
uint32_t dind[BLOCK_SIZE >> 2];
|
|
||||||
uint32_t tind[BLOCK_SIZE >> 2];
|
|
||||||
int block, result;
|
int block, result;
|
||||||
smallint blk_chg;
|
smallint blk_chg;
|
||||||
|
|
||||||
@ -518,48 +528,34 @@ static int map_block2(struct minix2_inode *inode, unsigned blknr)
|
|||||||
blknr -= 7;
|
blknr -= 7;
|
||||||
if (blknr < 256) {
|
if (blknr < 256) {
|
||||||
block = check_zone_nr2(inode->i_zone + 7, &changed);
|
block = check_zone_nr2(inode->i_zone + 7, &changed);
|
||||||
read_block(block, (char *) ind);
|
goto common2;
|
||||||
blk_chg = 0;
|
|
||||||
result = check_zone_nr2(blknr + ind, &blk_chg);
|
|
||||||
if (blk_chg)
|
|
||||||
write_block(block, (char *) ind);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
blknr -= 256;
|
blknr -= 256;
|
||||||
if (blknr >= 256 * 256) {
|
if (blknr < 256 * 256) {
|
||||||
block = check_zone_nr2(inode->i_zone + 8, &changed);
|
block = check_zone_nr2(inode->i_zone + 8, &changed);
|
||||||
read_block(block, (char *) dind);
|
goto common1;
|
||||||
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;
|
blknr -= 256 * 256;
|
||||||
block = check_zone_nr2(inode->i_zone + 9, &changed);
|
block = check_zone_nr2(inode->i_zone + 9, &changed);
|
||||||
read_block(block, (char *) tind);
|
read_block(block, ind); /* triple indirect */
|
||||||
blk_chg = 0;
|
blk_chg = 0;
|
||||||
result = check_zone_nr2(tind + blknr / (256 * 256), &blk_chg);
|
result = check_zone_nr2(&ind[blknr / (256 * 256)], &blk_chg);
|
||||||
if (blk_chg)
|
if (blk_chg)
|
||||||
write_block(block, (char *) tind);
|
write_block(block, ind);
|
||||||
block = result;
|
block = result;
|
||||||
read_block(block, (char *) dind);
|
common1:
|
||||||
|
read_block(block, ind); /* double indirect */
|
||||||
blk_chg = 0;
|
blk_chg = 0;
|
||||||
result = check_zone_nr2(dind + (blknr / 256) % 256, &blk_chg);
|
result = check_zone_nr2(&ind[(blknr / 256) % 256], &blk_chg);
|
||||||
if (blk_chg)
|
if (blk_chg)
|
||||||
write_block(block, (char *) dind);
|
write_block(block, ind);
|
||||||
block = result;
|
block = result;
|
||||||
read_block(block, (char *) ind);
|
common2:
|
||||||
|
read_block(block, ind);
|
||||||
blk_chg = 0;
|
blk_chg = 0;
|
||||||
result = check_zone_nr2(ind + blknr % 256, &blk_chg);
|
result = check_zone_nr2(&ind[blknr % 256], &blk_chg);
|
||||||
if (blk_chg)
|
if (blk_chg)
|
||||||
write_block(block, (char *) ind);
|
write_block(block, ind);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -575,9 +571,8 @@ static void write_super_block(void)
|
|||||||
if (!errors_uncorrected)
|
if (!errors_uncorrected)
|
||||||
Super.s_state &= ~MINIX_ERROR_FS;
|
Super.s_state &= ~MINIX_ERROR_FS;
|
||||||
|
|
||||||
if (BLOCK_SIZE != lseek(dev_fd, BLOCK_SIZE, SEEK_SET))
|
xlseek(dev_fd, BLOCK_SIZE, SEEK_SET);
|
||||||
die("seek failed in write_super_block");
|
if (BLOCK_SIZE != full_write(dev_fd, super_block_buffer, BLOCK_SIZE))
|
||||||
if (BLOCK_SIZE != write(dev_fd, super_block_buffer, BLOCK_SIZE))
|
|
||||||
die("cannot write super-block");
|
die("cannot write super-block");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -618,9 +613,8 @@ static void get_dirsize(void)
|
|||||||
|
|
||||||
static void read_superblock(void)
|
static void read_superblock(void)
|
||||||
{
|
{
|
||||||
if (BLOCK_SIZE != lseek(dev_fd, BLOCK_SIZE, SEEK_SET))
|
xlseek(dev_fd, BLOCK_SIZE, SEEK_SET);
|
||||||
die("seek failed");
|
if (BLOCK_SIZE != full_read(dev_fd, super_block_buffer, BLOCK_SIZE))
|
||||||
if (BLOCK_SIZE != read(dev_fd, super_block_buffer, BLOCK_SIZE))
|
|
||||||
die("cannot read super block");
|
die("cannot read super block");
|
||||||
/* already initialized to:
|
/* already initialized to:
|
||||||
namelen = 14;
|
namelen = 14;
|
||||||
@ -667,7 +661,7 @@ static void read_tables(void)
|
|||||||
errors_uncorrected = 1;
|
errors_uncorrected = 1;
|
||||||
}
|
}
|
||||||
get_dirsize();
|
get_dirsize();
|
||||||
if (show) {
|
if (OPT_show) {
|
||||||
printf("%u inodes\n"
|
printf("%u inodes\n"
|
||||||
"%u blocks\n"
|
"%u blocks\n"
|
||||||
"Firstdatazone=%u (%u)\n"
|
"Firstdatazone=%u (%u)\n"
|
||||||
@ -685,41 +679,35 @@ static void read_tables(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct minix1_inode *get_inode(unsigned nr)
|
static void get_inode_common(unsigned nr, uint16_t i_mode)
|
||||||
{
|
{
|
||||||
struct minix1_inode *inode;
|
|
||||||
|
|
||||||
if (!nr || nr > INODES)
|
|
||||||
return NULL;
|
|
||||||
total++;
|
total++;
|
||||||
inode = Inode1 + nr;
|
|
||||||
if (!inode_count[nr]) {
|
if (!inode_count[nr]) {
|
||||||
if (!inode_in_use(nr)) {
|
if (!inode_in_use(nr)) {
|
||||||
printf("Inode %d is marked as 'unused', but it is used "
|
printf("Inode %d is marked as 'unused', but it is used "
|
||||||
"for file '%s'\n", nr, current_name);
|
"for file '%s'\n", nr, current_name);
|
||||||
if (repair) {
|
if (OPT_repair) {
|
||||||
if (ask("Mark as 'in use'", 1))
|
if (ask("Mark as 'in use'", 1))
|
||||||
mark_inode(nr);
|
mark_inode(nr);
|
||||||
else
|
else
|
||||||
errors_uncorrected = 1;
|
errors_uncorrected = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (S_ISDIR(inode->i_mode))
|
if (S_ISDIR(i_mode))
|
||||||
directory++;
|
directory++;
|
||||||
else if (S_ISREG(inode->i_mode))
|
else if (S_ISREG(i_mode))
|
||||||
regular++;
|
regular++;
|
||||||
else if (S_ISCHR(inode->i_mode))
|
else if (S_ISCHR(i_mode))
|
||||||
chardev++;
|
chardev++;
|
||||||
else if (S_ISBLK(inode->i_mode))
|
else if (S_ISBLK(i_mode))
|
||||||
blockdev++;
|
blockdev++;
|
||||||
else if (S_ISLNK(inode->i_mode))
|
else if (S_ISLNK(i_mode))
|
||||||
symlinks++;
|
symlinks++;
|
||||||
else if (S_ISSOCK(inode->i_mode));
|
else if (S_ISSOCK(i_mode));
|
||||||
else if (S_ISFIFO(inode->i_mode));
|
else if (S_ISFIFO(i_mode));
|
||||||
else {
|
else {
|
||||||
printf("%s has mode %05o\n", current_name, inode->i_mode);
|
printf("%s has mode %05o\n", current_name, i_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else
|
} else
|
||||||
links++;
|
links++;
|
||||||
if (!++inode_count[nr]) {
|
if (!++inode_count[nr]) {
|
||||||
@ -727,6 +715,16 @@ static struct minix1_inode *get_inode(unsigned nr)
|
|||||||
inode_count[nr]--;
|
inode_count[nr]--;
|
||||||
errors_uncorrected = 1;
|
errors_uncorrected = 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct minix1_inode *get_inode(unsigned nr)
|
||||||
|
{
|
||||||
|
struct minix1_inode *inode;
|
||||||
|
|
||||||
|
if (!nr || nr > INODES)
|
||||||
|
return NULL;
|
||||||
|
inode = Inode1 + nr;
|
||||||
|
get_inode_common(nr, inode->i_mode);
|
||||||
return inode;
|
return inode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -737,41 +735,8 @@ static struct minix2_inode *get_inode2(unsigned nr)
|
|||||||
|
|
||||||
if (!nr || nr > INODES)
|
if (!nr || nr > INODES)
|
||||||
return NULL;
|
return NULL;
|
||||||
total++;
|
|
||||||
inode = Inode2 + nr;
|
inode = Inode2 + nr;
|
||||||
if (!inode_count[nr]) {
|
get_inode_common(nr, inode->i_mode);
|
||||||
if (!inode_in_use(nr)) {
|
|
||||||
printf("Inode %d is marked as 'unused', but it is used "
|
|
||||||
"for file '%s'\n", nr, current_name);
|
|
||||||
if (repair) {
|
|
||||||
if (ask("Mark as '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 {
|
|
||||||
printf("%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;
|
return inode;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -796,23 +761,17 @@ static void check_root2(void)
|
|||||||
void check_root2(void);
|
void check_root2(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int add_zone(uint16_t *znr, smallint *corrected)
|
static int add_zone_common(int block, smallint *corrected)
|
||||||
{
|
{
|
||||||
int result;
|
|
||||||
int block;
|
|
||||||
|
|
||||||
result = 0;
|
|
||||||
block = check_zone_nr(znr, corrected);
|
|
||||||
if (!block)
|
if (!block)
|
||||||
return 0;
|
return 0;
|
||||||
if (zone_count[block]) {
|
if (zone_count[block]) {
|
||||||
printf("Already used block is reused in file '%s'. ",
|
printf("Already used block is reused in file '%s'. ",
|
||||||
current_name);
|
current_name);
|
||||||
if (ask("Clear", 1)) {
|
if (ask("Clear", 1)) {
|
||||||
*znr = 0;
|
|
||||||
block = 0;
|
block = 0;
|
||||||
*corrected = 1;
|
*corrected = 1;
|
||||||
return 0;
|
return -1; /* "please zero out *znr" */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!zone_in_use(block)) {
|
if (!zone_in_use(block)) {
|
||||||
@ -826,34 +785,30 @@ static int add_zone(uint16_t *znr, smallint *corrected)
|
|||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int add_zone(uint16_t *znr, smallint *corrected)
|
||||||
|
{
|
||||||
|
int block;
|
||||||
|
|
||||||
|
block = check_zone_nr(znr, corrected);
|
||||||
|
block = add_zone_common(block, corrected);
|
||||||
|
if (block == -1) {
|
||||||
|
*znr = 0;
|
||||||
|
block = 0;
|
||||||
|
}
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
#if ENABLE_FEATURE_MINIX2
|
#if ENABLE_FEATURE_MINIX2
|
||||||
static int add_zone2(uint32_t *znr, smallint *corrected)
|
static int add_zone2(uint32_t *znr, smallint *corrected)
|
||||||
{
|
{
|
||||||
int result;
|
|
||||||
int block;
|
int block;
|
||||||
|
|
||||||
result = 0;
|
|
||||||
block = check_zone_nr2(znr, corrected);
|
block = check_zone_nr2(znr, corrected);
|
||||||
if (!block)
|
block = add_zone_common(block, corrected);
|
||||||
return 0;
|
if (block == -1) {
|
||||||
if (zone_count[block]) {
|
*znr = 0;
|
||||||
printf("Already used block is reused in file '%s'. ",
|
block = 0;
|
||||||
current_name);
|
|
||||||
if (ask("Clear", 1)) {
|
|
||||||
*znr = 0;
|
|
||||||
block = 0;
|
|
||||||
*corrected = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (!zone_in_use(block)) {
|
|
||||||
printf("Block %d in file '%s' is marked as 'unused'. ",
|
|
||||||
block, current_name);
|
|
||||||
if (ask("Correct", 1))
|
|
||||||
mark_zone(block);
|
|
||||||
}
|
|
||||||
if (!++zone_count[block])
|
|
||||||
zone_count[block]--;
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1018,8 +973,8 @@ static void check_file(struct minix1_inode *dir, unsigned offset)
|
|||||||
if (!inode)
|
if (!inode)
|
||||||
return;
|
return;
|
||||||
push_filename(name);
|
push_filename(name);
|
||||||
if (list) {
|
if (OPT_list) {
|
||||||
if (verbose)
|
if (OPT_verbose)
|
||||||
printf("%6d %07o %3d ", ino, inode->i_mode, inode->i_nlinks);
|
printf("%6d %07o %3d ", ino, inode->i_mode, inode->i_nlinks);
|
||||||
printf("%s%s\n", current_name, S_ISDIR(inode->i_mode) ? ":" : "");
|
printf("%s%s\n", current_name, S_ISDIR(inode->i_mode) ? ":" : "");
|
||||||
}
|
}
|
||||||
@ -1068,8 +1023,8 @@ static void check_file2(struct minix2_inode *dir, unsigned offset)
|
|||||||
if (!inode)
|
if (!inode)
|
||||||
return;
|
return;
|
||||||
push_filename(name);
|
push_filename(name);
|
||||||
if (list) {
|
if (OPT_list) {
|
||||||
if (verbose)
|
if (OPT_verbose)
|
||||||
printf("%6d %07o %3d ", ino, inode->i_mode, inode->i_nlinks);
|
printf("%6d %07o %3d ", ino, inode->i_mode, inode->i_nlinks);
|
||||||
printf("%s%s\n", current_name, S_ISDIR(inode->i_mode) ? ":" : "");
|
printf("%s%s\n", current_name, S_ISDIR(inode->i_mode) ? ":" : "");
|
||||||
}
|
}
|
||||||
@ -1118,9 +1073,8 @@ static int bad_zone(int i)
|
|||||||
{
|
{
|
||||||
char buffer[BLOCK_SIZE];
|
char buffer[BLOCK_SIZE];
|
||||||
|
|
||||||
if (BLOCK_SIZE * i != lseek(dev_fd, BLOCK_SIZE * i, SEEK_SET))
|
xlseek(dev_fd, BLOCK_SIZE * i, SEEK_SET);
|
||||||
die("seek failed in bad_zone");
|
return (BLOCK_SIZE != full_read(dev_fd, buffer, BLOCK_SIZE));
|
||||||
return (BLOCK_SIZE != read(dev_fd, buffer, BLOCK_SIZE));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_counts(void)
|
static void check_counts(void)
|
||||||
@ -1128,7 +1082,7 @@ static void check_counts(void)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 1; i <= INODES; i++) {
|
for (i = 1; i <= INODES; i++) {
|
||||||
if (warn_mode && Inode1[i].i_mode && !inode_in_use(i)) {
|
if (OPT_warn_mode && Inode1[i].i_mode && !inode_in_use(i)) {
|
||||||
printf("Inode %d has non-zero mode. ", i);
|
printf("Inode %d has non-zero mode. ", i);
|
||||||
if (ask("Clear", 1)) {
|
if (ask("Clear", 1)) {
|
||||||
Inode1[i].i_mode = 0;
|
Inode1[i].i_mode = 0;
|
||||||
@ -1180,7 +1134,7 @@ static void check_counts2(void)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 1; i <= INODES; i++) {
|
for (i = 1; i <= INODES; i++) {
|
||||||
if (warn_mode && Inode2[i].i_mode && !inode_in_use(i)) {
|
if (OPT_warn_mode && Inode2[i].i_mode && !inode_in_use(i)) {
|
||||||
printf("Inode %d has non-zero mode. ", i);
|
printf("Inode %d has non-zero mode. ", i);
|
||||||
if (ask("Clear", 1)) {
|
if (ask("Clear", 1)) {
|
||||||
Inode2[i].i_mode = 0;
|
Inode2[i].i_mode = 0;
|
||||||
@ -1259,59 +1213,17 @@ int fsck_minix_main(int argc, char **argv)
|
|||||||
|
|
||||||
INIT_G();
|
INIT_G();
|
||||||
|
|
||||||
if (INODE_SIZE1 * MINIX1_INODES_PER_BLOCK != BLOCK_SIZE)
|
opt_complementary = "=1:ar"; /* one argument; -a assumes -r */
|
||||||
die("bad inode size");
|
getopt32(argv, OPTION_STR);
|
||||||
#if ENABLE_FEATURE_MINIX2
|
argv += optind;
|
||||||
if (INODE_SIZE2 * MINIX2_INODES_PER_BLOCK != BLOCK_SIZE)
|
device_name = argv[0];
|
||||||
die("bad v2 inode size");
|
|
||||||
#endif
|
|
||||||
while (--argc != 0) {
|
|
||||||
argv++;
|
|
||||||
if (argv[0][0] != '-') {
|
|
||||||
if (device_name)
|
|
||||||
bb_show_usage();
|
|
||||||
device_name = argv[0];
|
|
||||||
} else {
|
|
||||||
while (*++argv[0]) {
|
|
||||||
switch (argv[0][0]) {
|
|
||||||
case 'l':
|
|
||||||
list = 1;
|
|
||||||
break;
|
|
||||||
case 'a':
|
|
||||||
automatic = 1;
|
|
||||||
repair = 1;
|
|
||||||
break;
|
|
||||||
case 'r':
|
|
||||||
automatic = 0;
|
|
||||||
repair = 1;
|
|
||||||
break;
|
|
||||||
case 'v':
|
|
||||||
verbose = 1;
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
show = 1;
|
|
||||||
break;
|
|
||||||
case 'm':
|
|
||||||
warn_mode = 1;
|
|
||||||
break;
|
|
||||||
case 'f':
|
|
||||||
force = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
bb_show_usage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!device_name)
|
|
||||||
bb_show_usage();
|
|
||||||
|
|
||||||
check_mount(); /* trying to check a mounted filesystem? */
|
check_mount(); /* trying to check a mounted filesystem? */
|
||||||
if (repair && !automatic) {
|
if (OPT_manual) {
|
||||||
if (!isatty(0) || !isatty(1))
|
if (!isatty(0) || !isatty(1))
|
||||||
die("need terminal for interactive repairs");
|
die("need terminal for interactive repairs");
|
||||||
}
|
}
|
||||||
dev_fd = xopen(device_name, repair ? O_RDWR : O_RDONLY);
|
dev_fd = xopen(device_name, OPT_repair ? O_RDWR : O_RDONLY);
|
||||||
|
|
||||||
/*sync(); paranoia? */
|
/*sync(); paranoia? */
|
||||||
read_superblock();
|
read_superblock();
|
||||||
@ -1325,20 +1237,20 @@ int fsck_minix_main(int argc, char **argv)
|
|||||||
printf("%s: %s\n", applet_name, bb_banner);
|
printf("%s: %s\n", applet_name, bb_banner);
|
||||||
|
|
||||||
if (!(Super.s_state & MINIX_ERROR_FS)
|
if (!(Super.s_state & MINIX_ERROR_FS)
|
||||||
&& (Super.s_state & MINIX_VALID_FS) && !force
|
&& (Super.s_state & MINIX_VALID_FS) && !OPT_force
|
||||||
) {
|
) {
|
||||||
if (repair)
|
if (OPT_repair)
|
||||||
printf("%s is clean, check is skipped\n", device_name);
|
printf("%s is clean, check is skipped\n", device_name);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (force)
|
} else if (OPT_force)
|
||||||
printf("Forcing filesystem check on %s\n", device_name);
|
printf("Forcing filesystem check on %s\n", device_name);
|
||||||
else if (repair)
|
else if (OPT_repair)
|
||||||
printf("Filesystem on %s is dirty, needs checking\n",
|
printf("Filesystem on %s is dirty, needs checking\n",
|
||||||
device_name);
|
device_name);
|
||||||
|
|
||||||
read_tables();
|
read_tables();
|
||||||
|
|
||||||
if (repair && !automatic) {
|
if (OPT_manual) {
|
||||||
tcgetattr(0, &sv_termios);
|
tcgetattr(0, &sv_termios);
|
||||||
tmp = sv_termios;
|
tmp = sv_termios;
|
||||||
tmp.c_lflag &= ~(ICANON | ECHO);
|
tmp.c_lflag &= ~(ICANON | ECHO);
|
||||||
@ -1354,7 +1266,7 @@ int fsck_minix_main(int argc, char **argv)
|
|||||||
check();
|
check();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (verbose) {
|
if (OPT_verbose) {
|
||||||
int i, free_cnt;
|
int i, free_cnt;
|
||||||
|
|
||||||
for (i = 1, free_cnt = 0; i <= INODES; i++)
|
for (i = 1, free_cnt = 0; i <= INODES; i++)
|
||||||
@ -1383,10 +1295,10 @@ int fsck_minix_main(int argc, char **argv)
|
|||||||
write_tables();
|
write_tables();
|
||||||
printf("FILE SYSTEM HAS BEEN CHANGED\n");
|
printf("FILE SYSTEM HAS BEEN CHANGED\n");
|
||||||
sync();
|
sync();
|
||||||
} else if (repair)
|
} else if (OPT_repair)
|
||||||
write_super_block();
|
write_super_block();
|
||||||
|
|
||||||
if (repair && !automatic)
|
if (OPT_manual)
|
||||||
tcsetattr(0, TCSANOW, &sv_termios);
|
tcsetattr(0, TCSANOW, &sv_termios);
|
||||||
|
|
||||||
if (changed)
|
if (changed)
|
||||||
|
Loading…
Reference in New Issue
Block a user