Patch from Denis Vlasenko:
* Do not initialize globals to 0, it is done automatically * unsigned short -> uint16_t, unsigned int -> uint32_t where appropriate (did it ever work on Alphas?) * triple sync() is silly - removed * check_zone_nr uses check_zone_nr2 now * remove trailing periods from messages, uppercase first letter
This commit is contained in:
parent
9950cab8e0
commit
8a6254994c
@ -206,28 +206,26 @@ enum { ROOT_INO = 1 };
|
||||
#define BITS_PER_BLOCK (BLOCK_SIZE<<3)
|
||||
|
||||
static char *program_version = "1.2 - 11/11/96";
|
||||
static char *device_name = NULL;
|
||||
static char *device_name;
|
||||
static int IN;
|
||||
static int repair = 0, automatic = 0, verbose = 0, list = 0, show =
|
||||
0, warn_mode = 0, force = 0;
|
||||
static int directory = 0, regular = 0, blockdev = 0, chardev = 0, links =
|
||||
0, symlinks = 0, total = 0;
|
||||
static int repair, automatic, verbose, list, show, warn_mode, force;
|
||||
static int directory, regular, blockdev, chardev, links, symlinks, total;
|
||||
|
||||
static int changed = 0; /* flags if the filesystem has been changed */
|
||||
static int errors_uncorrected = 0; /* flag if some error was not corrected */
|
||||
static int changed; /* flags if the filesystem has been changed */
|
||||
static int errors_uncorrected; /* flag if some error was not corrected */
|
||||
static int dirsize = 16;
|
||||
static int namelen = 14;
|
||||
static int version2 = 0;
|
||||
static int version2;
|
||||
static struct termios termios;
|
||||
static int termios_set = 0;
|
||||
static int termios_set;
|
||||
|
||||
/* File-name data */
|
||||
enum { MAX_DEPTH = 32 };
|
||||
static int name_depth = 0;
|
||||
static int name_depth;
|
||||
// static char name_list[MAX_DEPTH][BUFSIZ + 1];
|
||||
static char **name_list = NULL;
|
||||
static char **name_list;
|
||||
|
||||
static char *inode_buffer = NULL;
|
||||
static char *inode_buffer;
|
||||
|
||||
#define Inode (((struct minix_inode *) inode_buffer)-1)
|
||||
#define Inode2 (((struct minix2_inode *) inode_buffer)-1)
|
||||
@ -251,8 +249,8 @@ static char super_block_buffer[BLOCK_SIZE];
|
||||
static char *inode_map;
|
||||
static char *zone_map;
|
||||
|
||||
static unsigned char *inode_count = NULL;
|
||||
static unsigned char *zone_count = NULL;
|
||||
static unsigned char *inode_count;
|
||||
static unsigned char *zone_count;
|
||||
|
||||
static void recursive_check(unsigned int ino);
|
||||
#ifdef CONFIG_FEATURE_MINIX2
|
||||
@ -375,12 +373,11 @@ static void check_mount(void)
|
||||
close(fd);
|
||||
|
||||
printf("%s is mounted. ", device_name);
|
||||
cont = 0;
|
||||
if (isatty(0) && isatty(1))
|
||||
cont = ask("Do you really want to continue", 0);
|
||||
else
|
||||
cont = 0;
|
||||
if (!cont) {
|
||||
printf("check aborted.\n");
|
||||
printf("Check aborted\n");
|
||||
exit(0);
|
||||
}
|
||||
return;
|
||||
@ -392,7 +389,7 @@ static void check_mount(void)
|
||||
* if an error was corrected, and returns the zone (0 for no zone
|
||||
* or a bad zone-number).
|
||||
*/
|
||||
static int check_zone_nr(unsigned short *nr, int *corrected)
|
||||
static int check_zone_nr2(uint32_t *nr, int *corrected)
|
||||
{
|
||||
if (!*nr)
|
||||
return 0;
|
||||
@ -411,26 +408,13 @@ static int check_zone_nr(unsigned short *nr, int *corrected)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FEATURE_MINIX2
|
||||
static int check_zone_nr2(unsigned int *nr, int *corrected)
|
||||
static int check_zone_nr(uint16_t *nr, int *corrected)
|
||||
{
|
||||
if (!*nr)
|
||||
return 0;
|
||||
if (*nr < FIRSTZONE)
|
||||
printf("Zone nr < FIRSTZONE in file `");
|
||||
else if (*nr >= ZONES)
|
||||
printf("Zone nr >= ZONES in file `");
|
||||
else
|
||||
return *nr;
|
||||
print_current_name();
|
||||
printf("'.");
|
||||
if (ask("Remove block", 1)) {
|
||||
*nr = 0;
|
||||
*corrected = 1;
|
||||
}
|
||||
return 0;
|
||||
uint32_t nr32 = *nr;
|
||||
int r = check_zone_nr2(&nr32, corrected);
|
||||
*nr = (uint16_t)nr32;
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* read-block reads block nr into the buffer at addr.
|
||||
@ -445,14 +429,14 @@ static void read_block(unsigned int nr, char *addr)
|
||||
printf("Read error: unable to seek to block in file '");
|
||||
print_current_name();
|
||||
printf("'\n");
|
||||
memset(addr, 0, BLOCK_SIZE);
|
||||
errors_uncorrected = 1;
|
||||
memset(addr, 0, BLOCK_SIZE);
|
||||
} else if (BLOCK_SIZE != read(IN, addr, BLOCK_SIZE)) {
|
||||
printf("Read error: bad block in file '");
|
||||
print_current_name();
|
||||
printf("'\n");
|
||||
memset(addr, 0, BLOCK_SIZE);
|
||||
errors_uncorrected = 1;
|
||||
memset(addr, 0, BLOCK_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -480,14 +464,14 @@ static void write_block(unsigned int nr, char *addr)
|
||||
}
|
||||
|
||||
/*
|
||||
* map-block calculates the absolute block nr of a block in a file.
|
||||
* map_block calculates the absolute block nr of a block in a file.
|
||||
* It sets 'changed' if the inode has needed changing, and re-writes
|
||||
* any indirect blocks with errors.
|
||||
*/
|
||||
static int map_block(struct minix_inode *inode, unsigned int blknr)
|
||||
{
|
||||
unsigned short ind[BLOCK_SIZE >> 1];
|
||||
unsigned short dind[BLOCK_SIZE >> 1];
|
||||
uint16_t ind[BLOCK_SIZE >> 1];
|
||||
uint16_t dind[BLOCK_SIZE >> 1];
|
||||
int blk_chg, block, result;
|
||||
|
||||
if (blknr < 7)
|
||||
@ -521,9 +505,9 @@ static int map_block(struct minix_inode *inode, unsigned int blknr)
|
||||
#ifdef CONFIG_FEATURE_MINIX2
|
||||
static 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];
|
||||
uint32_t ind[BLOCK_SIZE >> 2];
|
||||
uint32_t dind[BLOCK_SIZE >> 2];
|
||||
uint32_t tind[BLOCK_SIZE >> 2];
|
||||
int blk_chg, block, result;
|
||||
|
||||
if (blknr < 7)
|
||||
@ -594,8 +578,6 @@ static void write_super_block(void)
|
||||
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)
|
||||
@ -639,18 +621,15 @@ static void read_superblock(void)
|
||||
die("seek failed");
|
||||
if (BLOCK_SIZE != read(IN, super_block_buffer, BLOCK_SIZE))
|
||||
die("unable to read super block");
|
||||
namelen = 14;
|
||||
dirsize = 16;
|
||||
version2 = 0;
|
||||
if (MAGIC == MINIX_SUPER_MAGIC) {
|
||||
namelen = 14;
|
||||
dirsize = 16;
|
||||
version2 = 0;
|
||||
} else if (MAGIC == MINIX_SUPER_MAGIC2) {
|
||||
namelen = 30;
|
||||
dirsize = 32;
|
||||
version2 = 0;
|
||||
#ifdef CONFIG_FEATURE_MINIX2
|
||||
} else if (MAGIC == MINIX2_SUPER_MAGIC) {
|
||||
namelen = 14;
|
||||
dirsize = 16;
|
||||
version2 = 1;
|
||||
} else if (MAGIC == MINIX2_SUPER_MAGIC2) {
|
||||
namelen = 30;
|
||||
@ -688,13 +667,20 @@ static void read_tables(void)
|
||||
}
|
||||
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);
|
||||
printf("%ld inodes\n"
|
||||
"%ld blocks\n"
|
||||
"Firstdatazone=%ld (%ld)\n"
|
||||
"Zonesize=%d\n"
|
||||
"Maxsize=%ld\n"
|
||||
"Filesystem state=%d\n"
|
||||
"namelen=%d\n\n",
|
||||
INODES,
|
||||
ZONES,
|
||||
FIRSTZONE, NORM_FIRSTZONE,
|
||||
BLOCK_SIZE << ZONESIZE,
|
||||
MAXSIZE,
|
||||
Super.s_state,
|
||||
namelen);
|
||||
}
|
||||
}
|
||||
|
||||
@ -738,7 +724,7 @@ static struct minix_inode *get_inode(unsigned int nr)
|
||||
} else
|
||||
links++;
|
||||
if (!++inode_count[nr]) {
|
||||
printf("Warning: inode count too big.\n");
|
||||
printf("Warning: inode count too big\n");
|
||||
inode_count[nr]--;
|
||||
errors_uncorrected = 1;
|
||||
}
|
||||
@ -785,7 +771,7 @@ static struct minix2_inode *get_inode2(unsigned int nr)
|
||||
} else
|
||||
links++;
|
||||
if (!++inode_count[nr]) {
|
||||
printf("Warning: inode count too big.\n");
|
||||
printf("Warning: inode count too big\n");
|
||||
inode_count[nr]--;
|
||||
errors_uncorrected = 1;
|
||||
}
|
||||
@ -811,7 +797,7 @@ static void check_root2(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
static int add_zone(unsigned short *znr, int *corrected)
|
||||
static int add_zone(uint16_t *znr, int *corrected)
|
||||
{
|
||||
int result;
|
||||
int block;
|
||||
@ -828,10 +814,9 @@ static int add_zone(unsigned short *znr, int *corrected)
|
||||
*znr = 0;
|
||||
block = 0;
|
||||
*corrected = 1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (!block)
|
||||
return 0;
|
||||
if (!zone_in_use(block)) {
|
||||
printf("Block %d in file `", block);
|
||||
print_current_name();
|
||||
@ -845,7 +830,7 @@ static int add_zone(unsigned short *znr, int *corrected)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FEATURE_MINIX2
|
||||
static int add_zone2(unsigned int *znr, int *corrected)
|
||||
static int add_zone2(uint32_t *znr, int *corrected)
|
||||
{
|
||||
int result;
|
||||
int block;
|
||||
@ -862,10 +847,9 @@ static int add_zone2(unsigned int *znr, int *corrected)
|
||||
*znr = 0;
|
||||
block = 0;
|
||||
*corrected = 1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (!block)
|
||||
return 0;
|
||||
if (!zone_in_use(block)) {
|
||||
printf("Block %d in file `", block);
|
||||
print_current_name();
|
||||
@ -879,7 +863,7 @@ static int add_zone2(unsigned int *znr, int *corrected)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void add_zone_ind(unsigned short *znr, int *corrected)
|
||||
static void add_zone_ind(uint16_t *znr, int *corrected)
|
||||
{
|
||||
static char blk[BLOCK_SIZE];
|
||||
int i, chg_blk = 0;
|
||||
@ -890,13 +874,13 @@ static void add_zone_ind(unsigned short *znr, int *corrected)
|
||||
return;
|
||||
read_block(block, blk);
|
||||
for (i = 0; i < (BLOCK_SIZE >> 1); i++)
|
||||
add_zone(i + (unsigned short *) blk, &chg_blk);
|
||||
add_zone(i + (uint16_t *) blk, &chg_blk);
|
||||
if (chg_blk)
|
||||
write_block(block, blk);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FEATURE_MINIX2
|
||||
static void add_zone_ind2(unsigned int *znr, int *corrected)
|
||||
static void add_zone_ind2(uint32_t *znr, int *corrected)
|
||||
{
|
||||
static char blk[BLOCK_SIZE];
|
||||
int i, chg_blk = 0;
|
||||
@ -907,13 +891,13 @@ static void add_zone_ind2(unsigned int *znr, int *corrected)
|
||||
return;
|
||||
read_block(block, blk);
|
||||
for (i = 0; i < BLOCK_SIZE >> 2; i++)
|
||||
add_zone2(i + (unsigned int *) blk, &chg_blk);
|
||||
add_zone2(i + (uint32_t *) blk, &chg_blk);
|
||||
if (chg_blk)
|
||||
write_block(block, blk);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void add_zone_dind(unsigned short *znr, int *corrected)
|
||||
static void add_zone_dind(uint16_t *znr, int *corrected)
|
||||
{
|
||||
static char blk[BLOCK_SIZE];
|
||||
int i, blk_chg = 0;
|
||||
@ -924,13 +908,13 @@ static void add_zone_dind(unsigned short *znr, int *corrected)
|
||||
return;
|
||||
read_block(block, blk);
|
||||
for (i = 0; i < (BLOCK_SIZE >> 1); i++)
|
||||
add_zone_ind(i + (unsigned short *) blk, &blk_chg);
|
||||
add_zone_ind(i + (uint16_t *) blk, &blk_chg);
|
||||
if (blk_chg)
|
||||
write_block(block, blk);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FEATURE_MINIX2
|
||||
static void add_zone_dind2(unsigned int *znr, int *corrected)
|
||||
static void add_zone_dind2(uint32_t *znr, int *corrected)
|
||||
{
|
||||
static char blk[BLOCK_SIZE];
|
||||
int i, blk_chg = 0;
|
||||
@ -941,12 +925,12 @@ static void add_zone_dind2(unsigned int *znr, int *corrected)
|
||||
return;
|
||||
read_block(block, blk);
|
||||
for (i = 0; i < BLOCK_SIZE >> 2; i++)
|
||||
add_zone_ind2(i + (unsigned int *) blk, &blk_chg);
|
||||
add_zone_ind2(i + (uint32_t *) blk, &blk_chg);
|
||||
if (blk_chg)
|
||||
write_block(block, blk);
|
||||
}
|
||||
|
||||
static void add_zone_tind2(unsigned int *znr, int *corrected)
|
||||
static void add_zone_tind2(uint32_t *znr, int *corrected)
|
||||
{
|
||||
static char blk[BLOCK_SIZE];
|
||||
int i, blk_chg = 0;
|
||||
@ -957,7 +941,7 @@ static void add_zone_tind2(unsigned int *znr, int *corrected)
|
||||
return;
|
||||
read_block(block, blk);
|
||||
for (i = 0; i < BLOCK_SIZE >> 2; i++)
|
||||
add_zone_dind2(i + (unsigned int *) blk, &blk_chg);
|
||||
add_zone_dind2(i + (uint32_t *) blk, &blk_chg);
|
||||
if (blk_chg)
|
||||
write_block(block, blk);
|
||||
}
|
||||
@ -1012,13 +996,13 @@ static void check_file(struct minix_inode *dir, unsigned int offset)
|
||||
block = map_block(dir, offset / BLOCK_SIZE);
|
||||
read_block(block, blk);
|
||||
name = blk + (offset % BLOCK_SIZE) + 2;
|
||||
ino = *(unsigned short *) (name - 2);
|
||||
ino = *(uint16_t *) (name - 2);
|
||||
if (ino > INODES) {
|
||||
print_current_name();
|
||||
printf(" contains a bad inode number for file '");
|
||||
printf("%.*s'.", namelen, name);
|
||||
if (ask(" Remove", 1)) {
|
||||
*(unsigned short *) (name - 2) = 0;
|
||||
*(uint16_t *) (name - 2) = 0;
|
||||
write_block(block, blk);
|
||||
}
|
||||
ino = 0;
|
||||
@ -1077,13 +1061,13 @@ static void check_file2(struct minix2_inode *dir, unsigned int offset)
|
||||
block = map_block2(dir, offset / BLOCK_SIZE);
|
||||
read_block(block, blk);
|
||||
name = blk + (offset % BLOCK_SIZE) + 2;
|
||||
ino = *(unsigned short *) (name - 2);
|
||||
ino = *(uint16_t *) (name - 2);
|
||||
if (ino > INODES) {
|
||||
print_current_name();
|
||||
printf(" contains a bad inode number for file '");
|
||||
printf("%.*s'.", namelen, name);
|
||||
if (ask(" Remove", 1)) {
|
||||
*(unsigned short *) (name - 2) = 0;
|
||||
*(uint16_t *) (name - 2) = 0;
|
||||
write_block(block, blk);
|
||||
}
|
||||
ino = 0;
|
||||
@ -1179,7 +1163,7 @@ static void check_counts(void)
|
||||
int i;
|
||||
|
||||
for (i = 1; i <= INODES; i++) {
|
||||
if (!inode_in_use(i) && Inode[i].i_mode && warn_mode) {
|
||||
if (warn_mode && Inode[i].i_mode && !inode_in_use(i)) {
|
||||
printf("Inode %d mode not cleared.", i);
|
||||
if (ask("Clear", 1)) {
|
||||
Inode[i].i_mode = 0;
|
||||
@ -1230,7 +1214,7 @@ static void check_counts2(void)
|
||||
int i;
|
||||
|
||||
for (i = 1; i <= INODES; i++) {
|
||||
if (!inode_in_use(i) && Inode2[i].i_mode && warn_mode) {
|
||||
if (warn_mode && Inode2[i].i_mode && !inode_in_use(i)) {
|
||||
printf("Inode %d mode not cleared.", i);
|
||||
if (ask("Clear", 1)) {
|
||||
Inode2[i].i_mode = 0;
|
||||
@ -1305,7 +1289,7 @@ static void alloc_name_list(void)
|
||||
|
||||
name_list = xmalloc(sizeof(char *) * MAX_DEPTH);
|
||||
for (i = 0; i < MAX_DEPTH; i++)
|
||||
name_list[i] = xmalloc(sizeof(char) * BUFSIZ + 1);
|
||||
name_list[i] = xmalloc(sizeof(char) * (BUFSIZ + 1));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FEATURE_CLEAN_UP
|
||||
@ -1327,7 +1311,6 @@ static void free_name_list(void)
|
||||
int fsck_minix_main(int argc, char **argv)
|
||||
{
|
||||
struct termios tmp;
|
||||
int count;
|
||||
int retcode = 0;
|
||||
|
||||
alloc_name_list();
|
||||
@ -1389,11 +1372,10 @@ int fsck_minix_main(int argc, char **argv)
|
||||
}
|
||||
IN = open(device_name, repair ? O_RDWR : O_RDONLY);
|
||||
if (IN < 0){
|
||||
fprintf(stderr,"unable to open device '%s'.\n",device_name);
|
||||
fprintf(stderr,"unable to open device '%s'\n",device_name);
|
||||
leave(8);
|
||||
}
|
||||
for (count = 0; count < 3; count++)
|
||||
sync();
|
||||
sync(); /* paranoia? */
|
||||
read_superblock();
|
||||
|
||||
/*
|
||||
@ -1406,12 +1388,12 @@ int fsck_minix_main(int argc, char **argv)
|
||||
if (!(Super.s_state & MINIX_ERROR_FS) &&
|
||||
(Super.s_state & MINIX_VALID_FS) && !force) {
|
||||
if (repair)
|
||||
printf("%s is clean, no check.\n", device_name);
|
||||
printf("%s is clean, no check\n", device_name);
|
||||
return retcode;
|
||||
} else if (force)
|
||||
printf("Forcing filesystem check on %s.\n", device_name);
|
||||
printf("Forcing filesystem check on %s\n", device_name);
|
||||
else if (repair)
|
||||
printf("Filesystem on %s is dirty, needs checking.\n",
|
||||
printf("Filesystem on %s is dirty, needs checking\n",
|
||||
device_name);
|
||||
|
||||
read_tables();
|
||||
@ -1463,8 +1445,7 @@ int fsck_minix_main(int argc, char **argv)
|
||||
printf("----------------------------\n"
|
||||
"FILE SYSTEM HAS BEEN CHANGED\n"
|
||||
"----------------------------\n");
|
||||
for (count = 0; count < 3; count++)
|
||||
sync();
|
||||
sync();
|
||||
} else if (repair)
|
||||
write_super_block();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user