const char * program_name = "dumpe2fs";
char * device_name = NULL;
-const char *num_format = "%lu";
-char range_format[16];
+int hex_format = 0;
static void usage(void)
{
exit (1);
}
-static void print_number (unsigned long num)
+static void print_number(unsigned long num)
{
- printf(num_format, num);
+ if (hex_format)
+ printf("0x%04lx", num);
+ else
+ printf("%lu", num);
+}
+
+static void print_range(unsigned long a, unsigned long b)
+{
+ if (hex_format)
+ printf("0x%04lx-0x%04lx", a, b);
+ else
+ printf("%lu-%lu", a, b);
}
static void print_free (unsigned long group, char * bitmap,
}
}
+static void print_bg_opt(int bg_flags, int mask,
+ const char *str, int *first)
+{
+ if (bg_flags & mask) {
+ if (*first) {
+ fputs(" [", stdout);
+ *first = 0;
+ } else
+ fputs(", ", stdout);
+ fputs(str, stdout);
+ }
+}
+static void print_bg_opts(ext2_filsys fs, dgrp_t i)
+{
+ int first = 1, bg_flags;
+
+ if (fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_LAZY_BG)
+ bg_flags = fs->group_desc[i].bg_flags;
+ else
+ bg_flags = 0;
+
+ print_bg_opt(bg_flags, EXT2_BG_INODE_UNINIT, "Inode not init",
+ &first);
+ print_bg_opt(bg_flags, EXT2_BG_BLOCK_UNINIT, "Block not init",
+ &first);
+ if (!first)
+ fputc(']', stdout);
+ fputc('\n', stdout);
+}
+
static void list_desc (ext2_filsys fs)
{
unsigned long i;
long diff;
- blk_t group_blk, next_blk;
+ blk_t first_block, last_block;
blk_t super_blk, old_desc_blk, new_desc_blk;
char *block_bitmap=NULL, *inode_bitmap=NULL;
int inode_blocks_per_group, old_desc_blocks, reserved_gdt;
EXT2_BLOCK_SIZE(fs->super);
reserved_gdt = fs->super->s_reserved_gdt_blocks;
fputc('\n', stdout);
- group_blk = fs->super->s_first_data_block;
+ first_block = fs->super->s_first_data_block;
if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG)
old_desc_blocks = fs->super->s_first_meta_bg;
else
old_desc_blocks = fs->desc_blocks;
for (i = 0; i < fs->group_desc_count; i++) {
+ first_block = ext2fs_group_first_block(fs, i);
+ last_block = ext2fs_group_last_block(fs, i);
+
ext2fs_super_and_bgd_loc(fs, i, &super_blk,
&old_desc_blk, &new_desc_blk, 0);
- next_blk = group_blk + fs->super->s_blocks_per_group;
- if (next_blk > fs->super->s_blocks_count)
- next_blk = fs->super->s_blocks_count;
+
printf (_("Group %lu: (Blocks "), i);
- printf(range_format, group_blk, next_blk - 1);
- fputs(")\n", stdout);
+ print_range(first_block, last_block);
+ fputs(")", stdout);
+ print_bg_opts(fs, i);
has_super = ((i==0) || super_blk);
if (has_super) {
printf (_(" %s superblock at "),
}
if (old_desc_blk) {
printf(_(", Group descriptors at "));
- printf(range_format, old_desc_blk,
- old_desc_blk + old_desc_blocks - 1);
+ print_range(old_desc_blk,
+ old_desc_blk + old_desc_blocks - 1);
if (reserved_gdt) {
printf(_("\n Reserved GDT blocks at "));
- printf(range_format,
- old_desc_blk + old_desc_blocks,
- old_desc_blk + old_desc_blocks +
- reserved_gdt - 1);
+ print_range(old_desc_blk + old_desc_blocks,
+ old_desc_blk + old_desc_blocks +
+ reserved_gdt - 1);
}
} else if (new_desc_blk) {
fputc(has_super ? ',' : ' ', stdout);
fputc('\n', stdout);
fputs(_(" Block bitmap at "), stdout);
print_number(fs->group_desc[i].bg_block_bitmap);
- diff = fs->group_desc[i].bg_block_bitmap - group_blk;
+ diff = fs->group_desc[i].bg_block_bitmap - first_block;
if (diff >= 0)
printf(" (+%ld)", diff);
fputs(_(", Inode bitmap at "), stdout);
print_number(fs->group_desc[i].bg_inode_bitmap);
- diff = fs->group_desc[i].bg_inode_bitmap - group_blk;
+ diff = fs->group_desc[i].bg_inode_bitmap - first_block;
if (diff >= 0)
printf(" (+%ld)", diff);
fputs(_("\n Inode table at "), stdout);
- printf(range_format, fs->group_desc[i].bg_inode_table,
- fs->group_desc[i].bg_inode_table +
- inode_blocks_per_group - 1);
- diff = fs->group_desc[i].bg_inode_table - group_blk;
+ print_range(fs->group_desc[i].bg_inode_table,
+ fs->group_desc[i].bg_inode_table +
+ inode_blocks_per_group - 1);
+ diff = fs->group_desc[i].bg_inode_table - first_block;
if (diff > 0)
printf(" (+%ld)", diff);
printf (_("\n %d free blocks, %d free inodes, "
fputc('\n', stdout);
inode_bitmap += fs->super->s_inodes_per_group / 8;
}
- group_blk = next_blk;
}
}
retval = ext2fs_read_bb_inode(fs, &bb_list);
if (retval) {
- com_err("ext2fs_read_bb_inode", retval, "");
+ com_err("ext2fs_read_bb_inode", retval, 0);
return;
}
retval = ext2fs_badblocks_list_iterate_begin(bb_list, &bb_iter);
return;
}
if (dump) {
- header = fmt = "%d\n";
+ header = fmt = "%u\n";
} else {
- header = _("Bad blocks: %d");
- fmt = ", %d";
+ header = _("Bad blocks: %u");
+ fmt = ", %u";
}
while (ext2fs_badblocks_list_iterate(bb_iter, &blk)) {
printf(header ? header : fmt, blk);
fputc('\n', stdout);
}
+static void print_inline_journal_information(ext2_filsys fs)
+{
+ struct ext2_inode inode;
+ errcode_t retval;
+ ino_t ino = fs->super->s_journal_inum;
+ int size;
+
+ retval = ext2fs_read_inode(fs, ino, &inode);
+ if (retval) {
+ com_err(program_name, retval,
+ _("while reading journal inode"));
+ exit(1);
+ }
+ fputs(_("Journal size: "), stdout);
+ size = inode.i_blocks >> 1;
+ if (size < 8192)
+ printf("%uk\n", size);
+ else
+ printf("%uM\n", size >> 10);
+}
+
static void print_journal_information(ext2_filsys fs)
{
errcode_t retval;
exit(1);
}
- printf(_("\nJournal block size: %d\n"
- "Journal length: %d\n"
- "Journal first block: %d\n"
+ printf(_("\nJournal block size: %u\n"
+ "Journal length: %u\n"
+ "Journal first block: %u\n"
"Journal sequence: 0x%08x\n"
- "Journal start: %d\n"
- "Journal number of users: %d\n"),
- ntohl(jsb->s_blocksize), ntohl(jsb->s_maxlen),
- ntohl(jsb->s_first), ntohl(jsb->s_sequence),
- ntohl(jsb->s_start), ntohl(jsb->s_nr_users));
+ "Journal start: %u\n"
+ "Journal number of users: %u\n"),
+ (unsigned int)ntohl(jsb->s_blocksize), (unsigned int)ntohl(jsb->s_maxlen),
+ (unsigned int)ntohl(jsb->s_first), (unsigned int)ntohl(jsb->s_sequence),
+ (unsigned int)ntohl(jsb->s_start), (unsigned int)ntohl(jsb->s_nr_users));
for (i=0; i < ntohl(jsb->s_nr_users); i++) {
uuid_unparse(&jsb->s_users[i*16], str);
printf(i ? " %s\n"
- : "Journal users: %s\n",
+ : _("Journal users: %s\n"),
str);
}
}
bindtextdomain(NLS_CAT_NAME, LOCALEDIR);
textdomain(NLS_CAT_NAME);
#endif
- initialize_ext2_error_table();
+ add_error_table(&et_ext2_error_table);
fprintf (stderr, "dumpe2fs %s (%s)\n", E2FSPROGS_VERSION,
E2FSPROGS_DATE);
if (argc && *argv)
error_message(EXT2_ET_BASE));
exit(0);
case 'x':
- num_format = "0x%04x";
+ hex_format++;
break;
default:
usage();
}
if (optind > argc - 1)
usage();
- sprintf(range_format, "%s-%s", num_format, num_format);
device_name = argv[optind++];
if (use_superblock && !use_blocksize)
use_blocksize = 1024;
- flags = EXT2_FLAG_JOURNAL_DEV_OK;
+ flags = EXT2_FLAG_JOURNAL_DEV_OK | EXT2_FLAG_SOFTSUPP_FEATURES;
if (force)
flags |= EXT2_FLAG_FORCE;
if (image_dump)
ext2fs_close(fs);
exit(0);
}
+ if (fs->super->s_feature_compat &
+ EXT3_FEATURE_COMPAT_HAS_JOURNAL)
+ print_inline_journal_information(fs);
list_bad_blocks(fs, 0);
if (header_only) {
ext2fs_close (fs);
}
}
ext2fs_close (fs);
+ remove_error_table(&et_ext2_error_table);
exit (0);
}