119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * dumpe2fs.c - List the control structures of a second 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * extended filesystem 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1992, 1993, 1994 Remy Card <card@masi.ibp.fr> 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Laboratoire MASI, Institut Blaise Pascal 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Universite Pierre et Marie Curie (Paris VI) 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright 1995, 1996, 1997 by Theodore Ts'o. 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header% 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This file may be redistributed under the terms of the GNU Public 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * License. 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header% 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * History: 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 94/01/09 - Creation 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 94/02/27 - Ported to use the ext2fs library 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_GETOPT_H 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <getopt.h> 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern char *optarg; 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern int optind; 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h> 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2fs/ext2_fs.h" 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2fs/ext2fs.h" 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2p/e2p.h" 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "jfs_user.h" 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <uuid/uuid.h> 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "../version.h" 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "nls-enable.h" 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define in_use(m, x) (ext2fs_test_bit ((x), (m))) 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectconst char * program_name = "dumpe2fs"; 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectchar * device_name = NULL; 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint hex_format = 0; 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void usage(void) 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 533984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf (stderr, _("Usage: %s [-bfhixV] [-o superblock=<num>] " 543984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "[-o blocksize=<num>] device\n"), program_name); 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit (1); 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void print_number(unsigned long num) 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (hex_format) 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("0x%04lx", num); 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("%lu", num); 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void print_range(unsigned long a, unsigned long b) 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (hex_format) 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("0x%04lx-0x%04lx", a, b); 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("%lu-%lu", a, b); 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void print_free (unsigned long group, char * bitmap, 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long nbytes, unsigned long offset) 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int p = 0; 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long i; 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long j; 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project offset += group * nbytes; 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i = 0; i < nbytes; i++) 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!in_use (bitmap, i)) 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project { 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (p) 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf (", "); 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_number(i + offset); 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (j = i; j < nbytes && !in_use (bitmap, j); j++) 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ; 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (--j != i) { 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputc('-', stdout); 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_number(j + offset); 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project i = j; 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project p = 1; 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void print_bg_opt(int bg_flags, int mask, 10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *str, int *first) 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bg_flags & mask) { 10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*first) { 10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(" [", stdout); 10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *first = 0; 10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else 10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(", ", stdout); 10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(str, stdout); 10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void print_bg_opts(ext2_filsys fs, dgrp_t i) 11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 1133984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int first = 1, bg_flags = 0; 11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_GDT_CSUM) 11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bg_flags = fs->group_desc[i].bg_flags; 11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt print_bg_opt(bg_flags, EXT2_BG_INODE_UNINIT, "INODE_UNINIT", 1193984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt &first); 1203984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt print_bg_opt(bg_flags, EXT2_BG_BLOCK_UNINIT, "BLOCK_UNINIT", 12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &first); 1223984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt print_bg_opt(bg_flags, EXT2_BG_INODE_ZEROED, "ITABLE_ZEROED", 12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &first); 12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!first) 12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputc(']', stdout); 12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputc('\n', stdout); 12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void list_desc (ext2_filsys fs) 13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long i; 13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project long diff; 13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t first_block, last_block; 13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t super_blk, old_desc_blk, new_desc_blk; 13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *block_bitmap=NULL, *inode_bitmap=NULL; 13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int inode_blocks_per_group, old_desc_blocks, reserved_gdt; 1373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int block_nbytes, inode_nbytes; 13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int has_super; 1393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_t blk_itr = fs->super->s_first_data_block; 1403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2_ino_t ino_itr = 1; 1413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 1423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt block_nbytes = EXT2_BLOCKS_PER_GROUP(fs->super) / 8; 1433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt inode_nbytes = EXT2_INODES_PER_GROUP(fs->super) / 8; 14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fs->block_map) 1463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt block_bitmap = malloc(block_nbytes); 14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fs->inode_map) 1483984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt inode_bitmap = malloc(inode_nbytes); 14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode_blocks_per_group = ((fs->super->s_inodes_per_group * 15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_INODE_SIZE(fs->super)) + 15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_BLOCK_SIZE(fs->super) - 1) / 15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_BLOCK_SIZE(fs->super); 15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project reserved_gdt = fs->super->s_reserved_gdt_blocks; 15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputc('\n', stdout); 15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project first_block = fs->super->s_first_data_block; 15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) 15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project old_desc_blocks = fs->super->s_first_meta_bg; 15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project old_desc_blocks = fs->desc_blocks; 16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i = 0; i < fs->group_desc_count; i++) { 16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project first_block = ext2fs_group_first_block(fs, i); 16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project last_block = ext2fs_group_last_block(fs, i); 16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1653984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_super_and_bgd_loc(fs, i, &super_blk, 16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &old_desc_blk, &new_desc_blk, 0); 16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf (_("Group %lu: (Blocks "), i); 16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_range(first_block, last_block); 17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(")", stdout); 17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_bg_opts(fs, i); 1723984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_GDT_CSUM) 1733984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf(_(" Checksum 0x%04x, unused inodes %d\n"), 1743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[i].bg_checksum, 1753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[i].bg_itable_unused); 17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project has_super = ((i==0) || super_blk); 17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (has_super) { 17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf (_(" %s superblock at "), 17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project i == 0 ? _("Primary") : _("Backup")); 18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_number(super_blk); 18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (old_desc_blk) { 18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(_(", Group descriptors at ")); 1843984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt print_range(old_desc_blk, 18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project old_desc_blk + old_desc_blocks - 1); 18619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (reserved_gdt) { 18719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(_("\n Reserved GDT blocks at ")); 18819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_range(old_desc_blk + old_desc_blocks, 1893984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt old_desc_blk + old_desc_blocks + 19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project reserved_gdt - 1); 19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 19219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else if (new_desc_blk) { 19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputc(has_super ? ',' : ' ', stdout); 19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(_(" Group descriptor at ")); 19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_number(new_desc_blk); 19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project has_super++; 19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (has_super) 19919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputc('\n', stdout); 20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(_(" Block bitmap at "), stdout); 20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_number(fs->group_desc[i].bg_block_bitmap); 20219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project diff = fs->group_desc[i].bg_block_bitmap - first_block; 20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (diff >= 0) 20419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(" (+%ld)", diff); 20519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(_(", Inode bitmap at "), stdout); 20619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_number(fs->group_desc[i].bg_inode_bitmap); 20719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project diff = fs->group_desc[i].bg_inode_bitmap - first_block; 20819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (diff >= 0) 20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(" (+%ld)", diff); 21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(_("\n Inode table at "), stdout); 21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_range(fs->group_desc[i].bg_inode_table, 21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->group_desc[i].bg_inode_table + 21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project inode_blocks_per_group - 1); 21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project diff = fs->group_desc[i].bg_inode_table - first_block; 21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (diff > 0) 21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(" (+%ld)", diff); 2173984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf (_("\n %u free blocks, %u free inodes, " 2183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "%u directories%s"), 21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->group_desc[i].bg_free_blocks_count, 22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->group_desc[i].bg_free_inodes_count, 2213984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[i].bg_used_dirs_count, 2223984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[i].bg_itable_unused ? "" : "\n"); 2233984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (fs->group_desc[i].bg_itable_unused) 2243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf (_(", %u unused inodes\n"), 2253984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[i].bg_itable_unused); 22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (block_bitmap) { 22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(_(" Free blocks: "), stdout); 2283984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_get_block_bitmap_range(fs->block_map, 2293984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_itr, block_nbytes << 3, block_bitmap); 23019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_free (i, block_bitmap, 23119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_blocks_per_group, 23219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_first_data_block); 23319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputc('\n', stdout); 2343984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_itr += fs->super->s_blocks_per_group; 23519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 23619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (inode_bitmap) { 23719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(_(" Free inodes: "), stdout); 2383984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_get_inode_bitmap_range(fs->inode_map, 2393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ino_itr, inode_nbytes << 3, inode_bitmap); 24019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_free (i, inode_bitmap, 24119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_inodes_per_group, 1); 24219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputc('\n', stdout); 2433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ino_itr += fs->super->s_inodes_per_group; 24419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 24519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 2463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (block_bitmap) 2473984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt free(block_bitmap); 2483984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (inode_bitmap) 2493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt free(inode_bitmap); 25019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 25119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 25219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void list_bad_blocks(ext2_filsys fs, int dump) 25319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 25419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project badblocks_list bb_list = 0; 25519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project badblocks_iterate bb_iter; 25619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t blk; 25719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 25819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *header, *fmt; 25919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 26019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_read_bb_inode(fs, &bb_list); 26119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 26219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ext2fs_read_bb_inode", retval, 0); 26319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 26419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 26519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_badblocks_list_iterate_begin(bb_list, &bb_iter); 26619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 26719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ext2fs_badblocks_list_iterate_begin", retval, 26819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("while printing bad block list")); 26919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 27019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 27119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (dump) { 27219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project header = fmt = "%u\n"; 27319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 27419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project header = _("Bad blocks: %u"); 27519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fmt = ", %u"; 27619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 27719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (ext2fs_badblocks_list_iterate(bb_iter, &blk)) { 27819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(header ? header : fmt, blk); 27919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project header = 0; 28019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 28119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_badblocks_list_iterate_end(bb_iter); 28219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!dump) 28319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputc('\n', stdout); 2843984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_badblocks_list_free(bb_list); 28519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 28619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 28719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void print_inline_journal_information(ext2_filsys fs) 28819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 2893984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt journal_superblock_t *jsb; 29019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ext2_inode inode; 2913984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2_file_t journal_file; 29219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 29319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ino_t ino = fs->super->s_journal_inum; 2943984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt char buf[1024]; 2953984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt __u32 *mask_ptr, mask, m; 2963984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int i, j, size, printed = 0; 2973984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 29819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_read_inode(fs, ino, &inode); 29919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 30019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(program_name, retval, 30119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("while reading journal inode")); 30219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 30319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 3043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt retval = ext2fs_file_open2(fs, ino, &inode, 0, &journal_file); 3053984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (retval) { 3063984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(program_name, retval, 3073984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt _("while opening journal inode")); 3083984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt exit(1); 3093984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 3103984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt retval = ext2fs_file_read(journal_file, buf, sizeof(buf), 0); 3113984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (retval) { 3123984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(program_name, retval, 3133984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt _("while reading journal super block")); 3143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt exit(1); 3153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 3163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_file_close(journal_file); 3173984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt jsb = (journal_superblock_t *) buf; 3183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (be32_to_cpu(jsb->s_header.h_magic) != JFS_MAGIC_NUMBER) { 3193984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(stderr, 3203984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "Journal superblock magic number invalid!\n"); 3213984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt exit(1); 3223984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 3233984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf(_("Journal features: ")); 3243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt for (i=0, mask_ptr=&jsb->s_feature_compat; i <3; i++,mask_ptr++) { 3253984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt mask = be32_to_cpu(*mask_ptr); 3263984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt for (j=0,m=1; j < 32; j++, m<<=1) { 3273984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (mask & m) { 3283984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf(" %s", e2p_jrnl_feature2string(i, m)); 3293984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printed++; 3303984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 3313984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 3323984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 3333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (printed == 0) 3343984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf(" (none)"); 3353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf("\n"); 33619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fputs(_("Journal size: "), stdout); 3373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if ((fs->super->s_feature_ro_compat & 3383984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT4_FEATURE_RO_COMPAT_HUGE_FILE) && 3393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt (inode.i_flags & EXT4_HUGE_FILE_FL)) 3403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt size = inode.i_blocks / (fs->blocksize / 1024); 3413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt else 3423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt size = inode.i_blocks >> 1; 34319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (size < 8192) 34419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("%uk\n", size); 34519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 34619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("%uM\n", size >> 10); 3473984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf(_("Journal length: %u\n" 3483984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "Journal sequence: 0x%08x\n" 3493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "Journal start: %u\n"), 3503984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt (unsigned int)ntohl(jsb->s_maxlen), 3513984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt (unsigned int)ntohl(jsb->s_sequence), 3523984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt (unsigned int)ntohl(jsb->s_start)); 35319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 35419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 35519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void print_journal_information(ext2_filsys fs) 35619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 35719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 35819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char buf[1024]; 35919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char str[80]; 36019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned int i; 36119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project journal_superblock_t *jsb; 36219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 36319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Get the journal superblock */ 36419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((retval = io_channel_read_blk(fs->io, fs->super->s_first_data_block+1, -1024, buf))) { 36519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(program_name, retval, 36619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("while reading journal superblock")); 36719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 36819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 36919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project jsb = (journal_superblock_t *) buf; 37019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((jsb->s_header.h_magic != (unsigned) ntohl(JFS_MAGIC_NUMBER)) || 37119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (jsb->s_header.h_blocktype != 37219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (unsigned) ntohl(JFS_SUPERBLOCK_V2))) { 37319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(program_name, 0, 37419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("Couldn't find journal superblock magic numbers")); 37519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 37619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 37719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 37819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(_("\nJournal block size: %u\n" 37919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "Journal length: %u\n" 38019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "Journal first block: %u\n" 38119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "Journal sequence: 0x%08x\n" 38219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "Journal start: %u\n" 38319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "Journal number of users: %u\n"), 38419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (unsigned int)ntohl(jsb->s_blocksize), (unsigned int)ntohl(jsb->s_maxlen), 38519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (unsigned int)ntohl(jsb->s_first), (unsigned int)ntohl(jsb->s_sequence), 38619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (unsigned int)ntohl(jsb->s_start), (unsigned int)ntohl(jsb->s_nr_users)); 38719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 38819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i=0; i < ntohl(jsb->s_nr_users); i++) { 38919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project uuid_unparse(&jsb->s_users[i*16], str); 39019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(i ? " %s\n" 39119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project : _("Journal users: %s\n"), 39219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project str); 39319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 39419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 39519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3963984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtstatic void parse_extended_opts(const char *opts, blk_t *superblock, 39719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int *blocksize) 39819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 3993984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt char *buf, *token, *next, *p, *arg, *badopt = 0; 40019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int len; 4013984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int do_usage = 0; 40219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 40319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project len = strlen(opts); 40419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project buf = malloc(len+1); 40519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!buf) { 40619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, 40719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("Couldn't allocate memory to parse options!\n")); 40819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 40919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 41019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcpy(buf, opts); 41119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (token = buf; token && *token; token = next) { 41219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project p = strchr(token, ','); 41319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project next = 0; 41419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (p) { 41519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *p = 0; 41619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project next = p+1; 41719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 41819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project arg = strchr(token, '='); 41919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (arg) { 42019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *arg = 0; 42119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project arg++; 42219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 42319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (strcmp(token, "superblock") == 0 || 42419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcmp(token, "sb") == 0) { 42519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!arg) { 4263984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt do_usage++; 42719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project badopt = token; 42819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project continue; 42919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 43019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *superblock = strtoul(arg, &p, 0); 43119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*p) { 43219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, 43319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("Invalid superblock parameter: %s\n"), 43419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project arg); 4353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt do_usage++; 43619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project continue; 43719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 43819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else if (strcmp(token, "blocksize") == 0 || 43919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project strcmp(token, "bs") == 0) { 44019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!arg) { 4413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt do_usage++; 44219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project badopt = token; 44319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project continue; 44419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 44519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *blocksize = strtoul(arg, &p, 0); 44619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (*p) { 44719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, 44819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("Invalid blocksize parameter: %s\n"), 44919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project arg); 4503984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt do_usage++; 45119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project continue; 45219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 45319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 4543984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt do_usage++; 45519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project badopt = token; 45619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 45719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 4583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (do_usage) { 45919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, _("\nBad extended option(s) specified: %s\n\n" 46019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "Extended options are separated by commas, " 46119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "and may take an argument which\n" 46219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "\tis set off by an equals ('=') sign.\n\n" 46319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "Valid extended options are:\n" 46419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "\tsuperblock=<superblock number>\n" 46519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "\tblocksize=<blocksize>\n"), 4663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt badopt ? badopt : ""); 46719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project free(buf); 46819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 46919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 47019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project free(buf); 4713984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt} 47219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 47319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint main (int argc, char ** argv) 47419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 47519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 47619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_filsys fs; 47719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int print_badblocks = 0; 4783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_t use_superblock = 0; 47919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int use_blocksize = 0; 48019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int image_dump = 0; 48119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int force = 0; 48219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int flags; 48319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int header_only = 0; 48419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int c; 48519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 48619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef ENABLE_NLS 48719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project setlocale(LC_MESSAGES, ""); 48819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project setlocale(LC_CTYPE, ""); 48919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bindtextdomain(NLS_CAT_NAME, LOCALEDIR); 49019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project textdomain(NLS_CAT_NAME); 49119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 49219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project add_error_table(&et_ext2_error_table); 49319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf (stderr, "dumpe2fs %s (%s)\n", E2FSPROGS_VERSION, 49419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project E2FSPROGS_DATE); 49519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc && *argv) 49619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project program_name = *argv; 4973984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 49819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while ((c = getopt (argc, argv, "bfhixVo:")) != EOF) { 49919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (c) { 50019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'b': 50119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_badblocks++; 50219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 50319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'f': 50419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project force++; 50519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 50619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'h': 50719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project header_only++; 50819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 50919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'i': 51019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project image_dump++; 51119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 51219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'o': 5133984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt parse_extended_opts(optarg, &use_superblock, 51419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &use_blocksize); 51519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 51619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'V': 51719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Print version number and exit */ 51819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, _("\tUsing %s\n"), 51919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project error_message(EXT2_ET_BASE)); 52019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(0); 52119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'x': 52219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project hex_format++; 52319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 52419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project default: 52519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project usage(); 52619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 52719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 52819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (optind > argc - 1) 52919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project usage(); 53019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name = argv[optind++]; 53119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project flags = EXT2_FLAG_JOURNAL_DEV_OK | EXT2_FLAG_SOFTSUPP_FEATURES; 53219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (force) 53319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project flags |= EXT2_FLAG_FORCE; 53419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (image_dump) 53519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project flags |= EXT2_FLAG_IMAGE_FILE; 5363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 53719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (use_superblock && !use_blocksize) { 53819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (use_blocksize = EXT2_MIN_BLOCK_SIZE; 53919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project use_blocksize <= EXT2_MAX_BLOCK_SIZE; 54019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project use_blocksize *= 2) { 54119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_open (device_name, flags, 54219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project use_superblock, 54319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project use_blocksize, unix_io_manager, 54419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &fs); 54519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!retval) 54619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 54719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 54819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else 54919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_open (device_name, flags, use_superblock, 55019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project use_blocksize, unix_io_manager, &fs); 55119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 55219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err (program_name, retval, _("while trying to open %s"), 55319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name); 55419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf (_("Couldn't find valid filesystem superblock.\n")); 55519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit (1); 55619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 55719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (print_badblocks) { 55819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project list_bad_blocks(fs, 1); 55919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 56019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project list_super (fs->super); 56119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fs->super->s_feature_incompat & 56219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) { 56319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_journal_information(fs); 56419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_close(fs); 56519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(0); 56619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 5673984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if ((fs->super->s_feature_compat & 5683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt EXT3_FEATURE_COMPAT_HAS_JOURNAL) && 5693984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt (fs->super->s_journal_inum != 0)) 57019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project print_inline_journal_information(fs); 57119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project list_bad_blocks(fs, 0); 57219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (header_only) { 57319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_close (fs); 57419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit (0); 57519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 57619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_read_bitmaps (fs); 57719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project list_desc (fs); 57819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 57919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(_("\n%s: %s: error reading bitmaps: %s\n"), 58019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project program_name, device_name, 58119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project error_message(retval)); 58219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 58319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 58419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_close (fs); 58519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project remove_error_table(&et_ext2_error_table); 58619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit (0); 58719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 588