mirror of
https://github.com/sheumann/hush.git
synced 2024-12-27 01:32:08 +00:00
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)
|
||||
{
|
||||
const char *key = archive_handle->file_header->name;
|
||||
const llist_t *reject_entry = find_list_entry2(archive_handle->reject, key);
|
||||
const char *key;
|
||||
const llist_t *reject_entry;
|
||||
const llist_t *accept_entry;
|
||||
|
||||
key = archive_handle->file_header->name;
|
||||
|
||||
/* If the key is in a reject list fail */
|
||||
reject_entry = find_list_entry2(archive_handle->reject, key);
|
||||
if (reject_entry) {
|
||||
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++;
|
||||
c = filename;
|
||||
d = buf;
|
||||
/* paranoia is better that buffer overflows */
|
||||
/* paranoia is better than buffer overflows */
|
||||
while (*c && d != buf + sizeof(buf)-1) {
|
||||
if (*c == '/' && --pattern_slash_cnt < 0)
|
||||
break;
|
||||
|
@ -95,6 +95,13 @@
|
||||
#define BLKGETSIZE _IO(0x12,96) /* return device size */
|
||||
#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 {
|
||||
#ifdef UNUSED
|
||||
MINIX1_LINK_MAX = 250,
|
||||
@ -107,6 +114,7 @@ enum {
|
||||
MINIX_NAME_MAX = 255, /* # chars in a file name */
|
||||
};
|
||||
|
||||
|
||||
#if !ENABLE_FEATURE_MINIX2
|
||||
enum { version2 = 0 };
|
||||
#endif
|
||||
@ -118,13 +126,12 @@ struct globals {
|
||||
#if ENABLE_FEATURE_MINIX2
|
||||
smallint version2;
|
||||
#endif
|
||||
smallint repair, automatic, verbose, list, show, warn_mode, force;
|
||||
smallint changed; /* is filesystem modified? */
|
||||
smallint errors_uncorrected; /* flag if some error was not corrected */
|
||||
smallint termios_set;
|
||||
smallint dirsize;
|
||||
smallint namelen;
|
||||
char *device_name;
|
||||
const char *device_name;
|
||||
int directory, regular, blockdev, chardev, links, symlinks, total;
|
||||
char *inode_buffer;
|
||||
|
||||
@ -155,13 +162,6 @@ struct globals {
|
||||
#if ENABLE_FEATURE_MINIX2
|
||||
#define version2 (G.version2 )
|
||||
#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 errors_uncorrected (G.errors_uncorrected )
|
||||
#define termios_set (G.termios_set )
|
||||
@ -198,6 +198,28 @@ struct globals {
|
||||
name_component[0] = ¤t_name[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 Inode2 (((struct minix2_inode *) inode_buffer)-1)
|
||||
|
||||
@ -306,12 +328,12 @@ static int ask(const char *string, int def)
|
||||
{
|
||||
int c;
|
||||
|
||||
if (!repair) {
|
||||
if (!OPT_repair) {
|
||||
bb_putchar('\n');
|
||||
errors_uncorrected = 1;
|
||||
return 0;
|
||||
}
|
||||
if (automatic) {
|
||||
if (OPT_automatic) {
|
||||
bb_putchar('\n');
|
||||
if (!def)
|
||||
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.
|
||||
*/
|
||||
static void read_block(unsigned nr, char *addr)
|
||||
static void read_block(unsigned nr, void *addr)
|
||||
{
|
||||
if (!nr) {
|
||||
memset(addr, 0, BLOCK_SIZE);
|
||||
return;
|
||||
}
|
||||
if (BLOCK_SIZE * nr != lseek(dev_fd, BLOCK_SIZE * nr, SEEK_SET)) {
|
||||
printf("%s: cannot seek to block in file '%s'\n",
|
||||
bb_msg_read_error, current_name);
|
||||
errors_uncorrected = 1;
|
||||
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);
|
||||
xlseek(dev_fd, BLOCK_SIZE * nr, SEEK_SET);
|
||||
if (BLOCK_SIZE != full_read(dev_fd, addr, BLOCK_SIZE)) {
|
||||
printf("%s: bad block %u in file '%s'\n",
|
||||
bb_msg_read_error, nr, current_name);
|
||||
errors_uncorrected = 1;
|
||||
memset(addr, 0, BLOCK_SIZE);
|
||||
}
|
||||
@ -445,7 +463,7 @@ static void read_block(unsigned nr, char *addr)
|
||||
/*
|
||||
* 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)
|
||||
return;
|
||||
@ -455,11 +473,10 @@ static void write_block(unsigned nr, char *addr)
|
||||
errors_uncorrected = 1;
|
||||
return;
|
||||
}
|
||||
if (BLOCK_SIZE * nr != lseek(dev_fd, BLOCK_SIZE * nr, SEEK_SET))
|
||||
die("seek failed in write_block");
|
||||
if (BLOCK_SIZE != write(dev_fd, addr, BLOCK_SIZE)) {
|
||||
printf("%s: bad block in file '%s'\n",
|
||||
bb_msg_write_error, current_name);
|
||||
xlseek(dev_fd, BLOCK_SIZE * nr, SEEK_SET);
|
||||
if (BLOCK_SIZE != full_write(dev_fd, addr, BLOCK_SIZE)) {
|
||||
printf("%s: bad block %u in file '%s'\n",
|
||||
bb_msg_write_error, nr, current_name);
|
||||
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)
|
||||
{
|
||||
uint16_t ind[BLOCK_SIZE >> 1];
|
||||
uint16_t dind[BLOCK_SIZE >> 1];
|
||||
int block, result;
|
||||
smallint blk_chg;
|
||||
|
||||
@ -481,26 +497,22 @@ static int map_block(struct minix1_inode *inode, unsigned blknr)
|
||||
blknr -= 7;
|
||||
if (blknr < 512) {
|
||||
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;
|
||||
goto common;
|
||||
}
|
||||
blknr -= 512;
|
||||
block = check_zone_nr(inode->i_zone + 8, &changed);
|
||||
read_block(block, (char *) dind);
|
||||
read_block(block, ind); /* double indirect */
|
||||
blk_chg = 0;
|
||||
result = check_zone_nr(dind + (blknr / 512), &blk_chg);
|
||||
result = check_zone_nr(&ind[blknr / 512], &blk_chg);
|
||||
if (blk_chg)
|
||||
write_block(block, (char *) dind);
|
||||
write_block(block, ind);
|
||||
block = result;
|
||||
read_block(block, (char *) ind);
|
||||
common:
|
||||
read_block(block, ind);
|
||||
blk_chg = 0;
|
||||
result = check_zone_nr(ind + (blknr % 512), &blk_chg);
|
||||
result = check_zone_nr(&ind[blknr % 512], &blk_chg);
|
||||
if (blk_chg)
|
||||
write_block(block, (char *) ind);
|
||||
write_block(block, ind);
|
||||
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)
|
||||
{
|
||||
uint32_t ind[BLOCK_SIZE >> 2];
|
||||
uint32_t dind[BLOCK_SIZE >> 2];
|
||||
uint32_t tind[BLOCK_SIZE >> 2];
|
||||
int block, result;
|
||||
smallint blk_chg;
|
||||
|
||||
@ -518,48 +528,34 @@ static int map_block2(struct minix2_inode *inode, unsigned blknr)
|
||||
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;
|
||||
goto common2;
|
||||
}
|
||||
blknr -= 256;
|
||||
if (blknr >= 256 * 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;
|
||||
goto common1;
|
||||
}
|
||||
blknr -= 256 * 256;
|
||||
block = check_zone_nr2(inode->i_zone + 9, &changed);
|
||||
read_block(block, (char *) tind);
|
||||
read_block(block, ind); /* triple indirect */
|
||||
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)
|
||||
write_block(block, (char *) tind);
|
||||
write_block(block, ind);
|
||||
block = result;
|
||||
read_block(block, (char *) dind);
|
||||
common1:
|
||||
read_block(block, ind); /* double indirect */
|
||||
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)
|
||||
write_block(block, (char *) dind);
|
||||
write_block(block, ind);
|
||||
block = result;
|
||||
read_block(block, (char *) ind);
|
||||
common2:
|
||||
read_block(block, ind);
|
||||
blk_chg = 0;
|
||||
result = check_zone_nr2(ind + blknr % 256, &blk_chg);
|
||||
result = check_zone_nr2(&ind[blknr % 256], &blk_chg);
|
||||
if (blk_chg)
|
||||
write_block(block, (char *) ind);
|
||||
write_block(block, ind);
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
@ -575,9 +571,8 @@ static void write_super_block(void)
|
||||
if (!errors_uncorrected)
|
||||
Super.s_state &= ~MINIX_ERROR_FS;
|
||||
|
||||
if (BLOCK_SIZE != lseek(dev_fd, BLOCK_SIZE, SEEK_SET))
|
||||
die("seek failed in write_super_block");
|
||||
if (BLOCK_SIZE != write(dev_fd, super_block_buffer, BLOCK_SIZE))
|
||||
xlseek(dev_fd, BLOCK_SIZE, SEEK_SET);
|
||||
if (BLOCK_SIZE != full_write(dev_fd, super_block_buffer, BLOCK_SIZE))
|
||||
die("cannot write super-block");
|
||||
}
|
||||
|
||||
@ -618,9 +613,8 @@ static void get_dirsize(void)
|
||||
|
||||
static void read_superblock(void)
|
||||
{
|
||||
if (BLOCK_SIZE != lseek(dev_fd, BLOCK_SIZE, SEEK_SET))
|
||||
die("seek failed");
|
||||
if (BLOCK_SIZE != read(dev_fd, super_block_buffer, BLOCK_SIZE))
|
||||
xlseek(dev_fd, BLOCK_SIZE, SEEK_SET);
|
||||
if (BLOCK_SIZE != full_read(dev_fd, super_block_buffer, BLOCK_SIZE))
|
||||
die("cannot read super block");
|
||||
/* already initialized to:
|
||||
namelen = 14;
|
||||
@ -667,7 +661,7 @@ static void read_tables(void)
|
||||
errors_uncorrected = 1;
|
||||
}
|
||||
get_dirsize();
|
||||
if (show) {
|
||||
if (OPT_show) {
|
||||
printf("%u inodes\n"
|
||||
"%u blocks\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++;
|
||||
inode = Inode1 + nr;
|
||||
if (!inode_count[nr]) {
|
||||
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 (OPT_repair) {
|
||||
if (ask("Mark as 'in use'", 1))
|
||||
mark_inode(nr);
|
||||
else
|
||||
errors_uncorrected = 1;
|
||||
}
|
||||
}
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
if (S_ISDIR(i_mode))
|
||||
directory++;
|
||||
else if (S_ISREG(inode->i_mode))
|
||||
else if (S_ISREG(i_mode))
|
||||
regular++;
|
||||
else if (S_ISCHR(inode->i_mode))
|
||||
else if (S_ISCHR(i_mode))
|
||||
chardev++;
|
||||
else if (S_ISBLK(inode->i_mode))
|
||||
else if (S_ISBLK(i_mode))
|
||||
blockdev++;
|
||||
else if (S_ISLNK(inode->i_mode))
|
||||
else if (S_ISLNK(i_mode))
|
||||
symlinks++;
|
||||
else if (S_ISSOCK(inode->i_mode));
|
||||
else if (S_ISFIFO(inode->i_mode));
|
||||
else if (S_ISSOCK(i_mode));
|
||||
else if (S_ISFIFO(i_mode));
|
||||
else {
|
||||
printf("%s has mode %05o\n", current_name, inode->i_mode);
|
||||
printf("%s has mode %05o\n", current_name, i_mode);
|
||||
}
|
||||
|
||||
} else
|
||||
links++;
|
||||
if (!++inode_count[nr]) {
|
||||
@ -727,6 +715,16 @@ static struct minix1_inode *get_inode(unsigned nr)
|
||||
inode_count[nr]--;
|
||||
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;
|
||||
}
|
||||
|
||||
@ -737,41 +735,8 @@ static struct minix2_inode *get_inode2(unsigned nr)
|
||||
|
||||
if (!nr || nr > INODES)
|
||||
return NULL;
|
||||
total++;
|
||||
inode = Inode2 + nr;
|
||||
if (!inode_count[nr]) {
|
||||
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;
|
||||
}
|
||||
get_inode_common(nr, inode->i_mode);
|
||||
return inode;
|
||||
}
|
||||
#endif
|
||||
@ -796,23 +761,17 @@ static void check_root2(void)
|
||||
void check_root2(void);
|
||||
#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)
|
||||
return 0;
|
||||
if (zone_count[block]) {
|
||||
printf("Already used block is reused in file '%s'. ",
|
||||
current_name);
|
||||
if (ask("Clear", 1)) {
|
||||
*znr = 0;
|
||||
block = 0;
|
||||
*corrected = 1;
|
||||
return 0;
|
||||
return -1; /* "please zero out *znr" */
|
||||
}
|
||||
}
|
||||
if (!zone_in_use(block)) {
|
||||
@ -826,34 +785,30 @@ static int add_zone(uint16_t *znr, smallint *corrected)
|
||||
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
|
||||
static int add_zone2(uint32_t *znr, smallint *corrected)
|
||||
{
|
||||
int result;
|
||||
int block;
|
||||
|
||||
result = 0;
|
||||
block = check_zone_nr2(znr, corrected);
|
||||
if (!block)
|
||||
return 0;
|
||||
if (zone_count[block]) {
|
||||
printf("Already used block is reused in file '%s'. ",
|
||||
current_name);
|
||||
if (ask("Clear", 1)) {
|
||||
*znr = 0;
|
||||
block = 0;
|
||||
*corrected = 1;
|
||||
return 0;
|
||||
}
|
||||
block = add_zone_common(block, corrected);
|
||||
if (block == -1) {
|
||||
*znr = 0;
|
||||
block = 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;
|
||||
}
|
||||
#endif
|
||||
@ -1018,8 +973,8 @@ static void check_file(struct minix1_inode *dir, unsigned offset)
|
||||
if (!inode)
|
||||
return;
|
||||
push_filename(name);
|
||||
if (list) {
|
||||
if (verbose)
|
||||
if (OPT_list) {
|
||||
if (OPT_verbose)
|
||||
printf("%6d %07o %3d ", ino, inode->i_mode, inode->i_nlinks);
|
||||
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)
|
||||
return;
|
||||
push_filename(name);
|
||||
if (list) {
|
||||
if (verbose)
|
||||
if (OPT_list) {
|
||||
if (OPT_verbose)
|
||||
printf("%6d %07o %3d ", ino, inode->i_mode, inode->i_nlinks);
|
||||
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];
|
||||
|
||||
if (BLOCK_SIZE * i != lseek(dev_fd, BLOCK_SIZE * i, SEEK_SET))
|
||||
die("seek failed in bad_zone");
|
||||
return (BLOCK_SIZE != read(dev_fd, buffer, BLOCK_SIZE));
|
||||
xlseek(dev_fd, BLOCK_SIZE * i, SEEK_SET);
|
||||
return (BLOCK_SIZE != full_read(dev_fd, buffer, BLOCK_SIZE));
|
||||
}
|
||||
|
||||
static void check_counts(void)
|
||||
@ -1128,7 +1082,7 @@ static void check_counts(void)
|
||||
int 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);
|
||||
if (ask("Clear", 1)) {
|
||||
Inode1[i].i_mode = 0;
|
||||
@ -1180,7 +1134,7 @@ static void check_counts2(void)
|
||||
int 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);
|
||||
if (ask("Clear", 1)) {
|
||||
Inode2[i].i_mode = 0;
|
||||
@ -1259,59 +1213,17 @@ int fsck_minix_main(int argc, char **argv)
|
||||
|
||||
INIT_G();
|
||||
|
||||
if (INODE_SIZE1 * MINIX1_INODES_PER_BLOCK != BLOCK_SIZE)
|
||||
die("bad inode size");
|
||||
#if ENABLE_FEATURE_MINIX2
|
||||
if (INODE_SIZE2 * MINIX2_INODES_PER_BLOCK != BLOCK_SIZE)
|
||||
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();
|
||||
opt_complementary = "=1:ar"; /* one argument; -a assumes -r */
|
||||
getopt32(argv, OPTION_STR);
|
||||
argv += optind;
|
||||
device_name = argv[0];
|
||||
|
||||
check_mount(); /* trying to check a mounted filesystem? */
|
||||
if (repair && !automatic) {
|
||||
check_mount(); /* trying to check a mounted filesystem? */
|
||||
if (OPT_manual) {
|
||||
if (!isatty(0) || !isatty(1))
|
||||
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? */
|
||||
read_superblock();
|
||||
@ -1325,20 +1237,20 @@ int fsck_minix_main(int argc, char **argv)
|
||||
printf("%s: %s\n", applet_name, bb_banner);
|
||||
|
||||
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);
|
||||
return 0;
|
||||
} else if (force)
|
||||
} else if (OPT_force)
|
||||
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",
|
||||
device_name);
|
||||
|
||||
read_tables();
|
||||
|
||||
if (repair && !automatic) {
|
||||
if (OPT_manual) {
|
||||
tcgetattr(0, &sv_termios);
|
||||
tmp = sv_termios;
|
||||
tmp.c_lflag &= ~(ICANON | ECHO);
|
||||
@ -1354,7 +1266,7 @@ int fsck_minix_main(int argc, char **argv)
|
||||
check();
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
if (OPT_verbose) {
|
||||
int i, free_cnt;
|
||||
|
||||
for (i = 1, free_cnt = 0; i <= INODES; i++)
|
||||
@ -1383,10 +1295,10 @@ int fsck_minix_main(int argc, char **argv)
|
||||
write_tables();
|
||||
printf("FILE SYSTEM HAS BEEN CHANGED\n");
|
||||
sync();
|
||||
} else if (repair)
|
||||
} else if (OPT_repair)
|
||||
write_super_block();
|
||||
|
||||
if (repair && !automatic)
|
||||
if (OPT_manual)
|
||||
tcsetattr(0, TCSANOW, &sv_termios);
|
||||
|
||||
if (changed)
|
||||
|
Loading…
Reference in New Issue
Block a user