X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=debugfs%2Fdebugfs.c;h=e33c92ef66a5248d0e47eecc74b9d9858d437f29;hb=336c440ccea8f94b0728f881cddee84f730e7cc7;hp=1a84cfc3ed16bb2ab523aea31b6ff73242d7cec4;hpb=bf615bb0ccadeb1579463f94a2a4752e7ec53f57;p=tools%2Fe2fsprogs.git diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c index 1a84cfc..e33c92e 100644 --- a/debugfs/debugfs.c +++ b/debugfs/debugfs.c @@ -26,6 +26,9 @@ extern char *optarg; #include #endif #include +#ifdef HAVE_SYS_SYSMACROS_H +#include +#endif #include "debugfs.h" #include "uuid/uuid.h" @@ -45,20 +48,28 @@ extern char *optarg; int journal_enable_debug = -1; #endif +/* + * There must be only one definition if we're hooking in extra commands or + * chaging default prompt. Use -DSKIP_GLOBDEF for that. + */ +#ifndef SKIP_GLOBDEFS ss_request_table *extra_cmds; const char *debug_prog_name; -int sci_idx; +#endif +int ss_sci_idx; ext2_filsys current_fs; quota_ctx_t current_qctx; ext2_ino_t root, cwd; +int no_copy_xattrs; static int debugfs_setup_tdb(const char *device_name, char *undo_file, io_manager *io_ptr) { errcode_t retval = ENOMEM; - char *tdb_dir = NULL, *tdb_file = NULL; - char *dev_name, *tmp_name; + const char *tdb_dir = NULL; + char *tdb_file = NULL; + char *dev_name, *tmp_name; /* (re)open a specific undo file */ if (undo_file && undo_file[0] != 0) { @@ -156,13 +167,8 @@ static void open_filesystem(char *device, int open_flags, blk64_t superblock, } } - if (catastrophic && (open_flags & EXT2_FLAG_RW)) { - com_err(device, 0, - "opening read-only because of catastrophic mode"); - open_flags &= ~EXT2_FLAG_RW; - } if (catastrophic) - open_flags |= EXT2_FLAG_SKIP_MMP; + open_flags |= EXT2_FLAG_SKIP_MMP | EXT2_FLAG_IGNORE_SB_ERRORS; if (undo_file) { retval = debugfs_setup_tdb(device, undo_file, &io_ptr); @@ -173,13 +179,15 @@ static void open_filesystem(char *device, int open_flags, blk64_t superblock, try_open_again: retval = ext2fs_open(device, open_flags, superblock, blocksize, io_ptr, ¤t_fs); - if (retval && !(open_flags & EXT2_FLAG_IGNORE_CSUM_ERRORS)) { + if (retval && (retval == EXT2_ET_SB_CSUM_INVALID) && + !(open_flags & EXT2_FLAG_IGNORE_CSUM_ERRORS)) { open_flags |= EXT2_FLAG_IGNORE_CSUM_ERRORS; printf("Checksum errors in superblock! Retrying...\n"); goto try_open_again; } if (retval) { - com_err(device, retval, "while opening filesystem"); + com_err(debug_prog_name, retval, + "while trying to open %s", device); if (retval == EXT2_ET_BAD_MAGIC) check_plausibility(device, CHECK_FS_EXIST, NULL); current_fs = NULL; @@ -190,14 +198,10 @@ try_open_again: if (catastrophic) com_err(device, 0, "catastrophic mode - not reading inode or group bitmaps"); else { - retval = ext2fs_read_inode_bitmap(current_fs); - if (retval) { - com_err(device, retval, "while reading inode bitmap"); - goto errout; - } - retval = ext2fs_read_block_bitmap(current_fs); + retval = ext2fs_read_bitmaps(current_fs); if (retval) { - com_err(device, retval, "while reading block bitmap"); + com_err(device, retval, + "while reading allocation bitmaps"); goto errout; } } @@ -220,7 +224,8 @@ errout: com_err(device, retval, "while trying to close filesystem"); } -void do_open_filesys(int argc, char **argv) +void do_open_filesys(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { int c, err; int catastrophic = 0; @@ -289,14 +294,15 @@ void do_open_filesys(int argc, char **argv) print_usage: fprintf(stderr, "%s: Usage: open [-s superblock] [-b blocksize] " - "[-d image_filename] [-c] [-i] [-f] [-e] [-D] " + "[-d image_filename] [-z undo_file] [-c] [-i] [-f] [-e] [-D] " #ifndef READ_ONLY "[-w] " #endif "\n", argv[0]); } -void do_lcd(int argc, char **argv) +void do_lcd(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { if (argc != 2) { com_err(argv[0], 0, "Usage: %s %s", argv[0], ""); @@ -333,7 +339,8 @@ static void close_filesystem(NOARGS) return; } -void do_close_filesys(int argc, char **argv) +void do_close_filesys(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { int c; @@ -361,7 +368,8 @@ void do_close_filesys(int argc, char **argv) } #ifndef READ_ONLY -void do_init_filesys(int argc, char **argv) +void do_init_filesys(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { struct ext2_super_block param; errcode_t retval; @@ -421,7 +429,9 @@ static void print_bg_opts(ext2_filsys fs, dgrp_t group, int mask, } } -void do_show_super_stats(int argc, char *argv[]) +void do_show_super_stats(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { const char *units ="block"; dgrp_t i; @@ -511,12 +521,14 @@ void do_show_super_stats(int argc, char *argv[]) close_pager(out); return; print_usage: - fprintf(stderr, "%s: Usage: show_super [-h]\n", argv[0]); + fprintf(stderr, "%s: Usage: show_super_stats [-h]\n", argv[0]); } #ifndef READ_ONLY void do_dirty_filesys(int argc EXT2FS_ATTR((unused)), - char **argv EXT2FS_ATTR((unused))) + char **argv EXT2FS_ATTR((unused)), + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { if (check_fs_open(argv[0])) return; @@ -775,41 +787,31 @@ static void dump_inline_data(FILE *out, const char *prefix, ext2_ino_t inode_num fprintf(out, "%sSize of inline data: %zu\n", prefix, size); } -static void dump_fast_link(FILE *out, ext2_ino_t inode_num, - struct ext2_inode *inode, const char *prefix) +static void dump_inline_symlink(FILE *out, ext2_ino_t inode_num, + struct ext2_inode *inode, const char *prefix) { - errcode_t retval = 0; - char *buf; + errcode_t retval; + char *buf = NULL; size_t size; - if (inode->i_flags & EXT4_INLINE_DATA_FL) { - retval = ext2fs_inline_data_size(current_fs, inode_num, &size); - if (retval) - goto out; - - retval = ext2fs_get_memzero(size + 1, &buf); - if (retval) - goto out; + retval = ext2fs_inline_data_size(current_fs, inode_num, &size); + if (retval) + goto out; - retval = ext2fs_inline_data_get(current_fs, inode_num, - inode, buf, &size); - if (retval) - goto out; - fprintf(out, "%sFast link dest: \"%.*s\"\n", prefix, - (int)size, buf); + retval = ext2fs_get_memzero(size + 1, &buf); + if (retval) + goto out; - retval = ext2fs_free_mem(&buf); - if (retval) - goto out; - } else { - size_t sz = EXT2_I_SIZE(inode); + retval = ext2fs_inline_data_get(current_fs, inode_num, + inode, buf, &size); + if (retval) + goto out; - if (sz > sizeof(inode->i_block)) - sz = sizeof(inode->i_block); - fprintf(out, "%sFast link dest: \"%.*s\"\n", prefix, (int) sz, - (char *)inode->i_block); - } + fprintf(out, "%sFast link dest: \"%.*s\"\n", prefix, + (int)size, buf); out: + if (buf) + ext2fs_free_mem(&buf); if (retval) com_err(__func__, retval, "while dumping link destination"); } @@ -837,8 +839,8 @@ void internal_dump_inode(FILE *out, const char *prefix, else if (LINUX_S_ISSOCK(inode->i_mode)) i_type = "socket"; else i_type = "bad type"; fprintf(out, "%sInode: %u Type: %s ", prefix, inode_num, i_type); - fprintf(out, "%sMode: %04o Flags: 0x%x\n", - prefix, inode->i_mode & 0777, inode->i_flags); + fprintf(out, "%sMode: 0%03o Flags: 0x%x\n", + prefix, inode->i_mode & 07777, inode->i_flags); if (is_large_inode && large_inode->i_extra_isize >= 24) { fprintf(out, "%sGeneration: %u Version: 0x%08x:%08x\n", prefix, inode->i_generation, large_inode->i_version_hi, @@ -852,22 +854,21 @@ void internal_dump_inode(FILE *out, const char *prefix, if (is_large_inode && large_inode->i_extra_isize >= 32) fprintf(out, " Project: %5d", large_inode->i_projid); fputs(" Size: ", out); - if (LINUX_S_ISREG(inode->i_mode)) + if (LINUX_S_ISREG(inode->i_mode) || LINUX_S_ISDIR(inode->i_mode)) fprintf(out, "%llu\n", EXT2_I_SIZE(inode)); else fprintf(out, "%d\n", inode->i_size); if (os == EXT2_OS_HURD) fprintf(out, - "%sFile ACL: %d Directory ACL: %d Translator: %d\n", + "%sFile ACL: %d Translator: %d\n", prefix, - inode->i_file_acl, LINUX_S_ISDIR(inode->i_mode) ? inode->i_dir_acl : 0, + inode->i_file_acl, inode->osd1.hurd1.h_i_translator); else - fprintf(out, "%sFile ACL: %llu Directory ACL: %d\n", + fprintf(out, "%sFile ACL: %llu\n", prefix, inode->i_file_acl | ((long long) - (inode->osd2.linux2.l_i_file_acl_high) << 32), - LINUX_S_ISDIR(inode->i_mode) ? inode->i_dir_acl : 0); + (inode->osd2.linux2.l_i_file_acl_high) << 32)); if (os != EXT2_OS_HURD) fprintf(out, "%sLinks: %d Blockcount: %llu\n", prefix, inode->i_links_count, @@ -936,9 +937,12 @@ void internal_dump_inode(FILE *out, const char *prefix, fprintf(out, "Inode checksum: 0x%08x\n", crc); } - if (LINUX_S_ISLNK(inode->i_mode) && - ext2fs_inode_data_blocks(current_fs, inode) == 0) - dump_fast_link(out, inode_num, inode, prefix); + if (LINUX_S_ISLNK(inode->i_mode) && ext2fs_is_fast_symlink(inode)) + fprintf(out, "%sFast link dest: \"%.*s\"\n", prefix, + (int)EXT2_I_SIZE(inode), (char *)inode->i_block); + else if (LINUX_S_ISLNK(inode->i_mode) && + (inode->i_flags & EXT4_INLINE_DATA_FL)) + dump_inline_symlink(out, inode_num, inode, prefix); else if (LINUX_S_ISBLK(inode->i_mode) || LINUX_S_ISCHR(inode->i_mode)) { int major, minor; const char *devnote; @@ -975,7 +979,8 @@ static void dump_inode(ext2_ino_t inode_num, struct ext2_inode *inode) close_pager(out); } -void do_stat(int argc, char *argv[]) +void do_stat(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t inode; struct ext2_inode * inode_buf; @@ -995,8 +1000,8 @@ void do_stat(int argc, char *argv[]) return; } - if (debugfs_read_inode_full(inode, inode_buf, argv[0], - EXT2_INODE_SIZE(current_fs->super))) { + if (debugfs_read_inode2(inode, inode_buf, argv[0], + EXT2_INODE_SIZE(current_fs->super), 0)) { free(inode_buf); return; } @@ -1006,7 +1011,8 @@ void do_stat(int argc, char *argv[]) return; } -void do_dump_extents(int argc, char **argv) +void do_dump_extents(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { struct ext2_inode inode; ext2_ino_t ino; @@ -1077,7 +1083,8 @@ static int print_blocks_proc(ext2_filsys fs EXT2FS_ATTR((unused)), return 0; } -void do_blocks(int argc, char *argv[]) +void do_blocks(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t inode; @@ -1094,7 +1101,8 @@ void do_blocks(int argc, char *argv[]) return; } -void do_chroot(int argc, char *argv[]) +void do_chroot(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t inode; int retval; @@ -1111,7 +1119,8 @@ void do_chroot(int argc, char *argv[]) } #ifndef READ_ONLY -void do_clri(int argc, char *argv[]) +void do_clri(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t inode; struct ext2_inode inode_buf; @@ -1126,7 +1135,8 @@ void do_clri(int argc, char *argv[]) return; } -void do_freei(int argc, char *argv[]) +void do_freei(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { unsigned int len = 1; int err = 0; @@ -1156,7 +1166,8 @@ void do_freei(int argc, char *argv[]) ext2fs_mark_ib_dirty(current_fs); } -void do_seti(int argc, char *argv[]) +void do_seti(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { unsigned int len = 1; int err = 0; @@ -1187,7 +1198,8 @@ void do_seti(int argc, char *argv[]) } #endif /* READ_ONLY */ -void do_testi(int argc, char *argv[]) +void do_testi(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t inode; @@ -1201,7 +1213,8 @@ void do_testi(int argc, char *argv[]) } #ifndef READ_ONLY -void do_freeb(int argc, char *argv[]) +void do_freeb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { blk64_t block; blk64_t count = 1; @@ -1220,7 +1233,8 @@ void do_freeb(int argc, char *argv[]) ext2fs_mark_bb_dirty(current_fs); } -void do_setb(int argc, char *argv[]) +void do_setb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { blk64_t block; blk64_t count = 1; @@ -1240,7 +1254,8 @@ void do_setb(int argc, char *argv[]) } #endif /* READ_ONLY */ -void do_testb(int argc, char *argv[]) +void do_testb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { blk64_t block; blk64_t count = 1; @@ -1324,7 +1339,8 @@ static void modify_u32(char *com, const char *prompt, } -void do_modify_inode(int argc, char *argv[]) +void do_modify_inode(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { struct ext2_inode inode; ext2_ino_t inode_num; @@ -1364,10 +1380,9 @@ void do_modify_inode(int argc, char *argv[]) modify_u32(argv[0], "Reserved1", decimal_format, &inode.i_reserved1); #endif modify_u32(argv[0], "File acl", decimal_format, &inode.i_file_acl); - if (LINUX_S_ISDIR(inode.i_mode)) - modify_u32(argv[0], "Directory acl", decimal_format, &inode.i_dir_acl); - else - modify_u32(argv[0], "High 32bits of size", decimal_format, &inode.i_size_high); + + modify_u32(argv[0], "High 32bits of size", decimal_format, + &inode.i_size_high); if (os == EXT2_OS_HURD) modify_u32(argv[0], "Translator Block", @@ -1402,7 +1417,9 @@ void do_modify_inode(int argc, char *argv[]) } #endif /* READ_ONLY */ -void do_change_working_dir(int argc, char *argv[]) +void do_change_working_dir(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t inode; int retval; @@ -1419,7 +1436,9 @@ void do_change_working_dir(int argc, char *argv[]) return; } -void do_print_working_directory(int argc, char *argv[]) +void do_print_working_directory(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { int retval; char *pathname = NULL; @@ -1508,7 +1527,8 @@ static void make_link(char *sourcename, char *destname) } -void do_link(int argc, char *argv[]) +void do_link(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { if (common_args_process(argc, argv, 3, 3, "link", " ", CHECK_FS_RW)) @@ -1530,7 +1550,8 @@ static int mark_blocks_proc(ext2_filsys fs, blk64_t *blocknr, return 0; } -void do_undel(int argc, char *argv[]) +void do_undel(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t ino; struct ext2_inode inode; @@ -1593,7 +1614,8 @@ static void unlink_file_by_name(char *filename) return; } -void do_unlink(int argc, char *argv[]) +void do_unlink(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { if (common_args_process(argc, argv, 2, 2, "link", "", CHECK_FS_RW)) @@ -1602,12 +1624,11 @@ void do_unlink(int argc, char *argv[]) unlink_file_by_name(argv[1]); } -void do_copy_inode(int argc, char *argv[]) +void do_copy_inode(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t src_ino, dest_ino; - struct ext2_inode inode; unsigned char buf[4096]; - int retval; if (common_args_process(argc, argv, 3, 3, "copy_inode", " ", CHECK_FS_RW)) @@ -1621,18 +1642,20 @@ void do_copy_inode(int argc, char *argv[]) if (!dest_ino) return; - if (debugfs_read_inode_full(src_ino, (struct ext2_inode *) buf, - argv[0], sizeof(buf))) + if (debugfs_read_inode2(src_ino, (struct ext2_inode *) buf, + argv[0], sizeof(buf), 0)) return; - if (debugfs_write_inode_full(dest_ino, (struct ext2_inode *) buf, - argv[0], sizeof(buf))) + if (debugfs_write_inode2(dest_ino, (struct ext2_inode *) buf, + argv[0], sizeof(buf), 0)) return; } #endif /* READ_ONLY */ -void do_find_free_block(int argc, char *argv[]) +void do_find_free_block(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { blk64_t free_blk, goal, first_free = 0; int count; @@ -1684,7 +1707,9 @@ void do_find_free_block(int argc, char *argv[]) printf("\n"); } -void do_find_free_inode(int argc, char *argv[]) +void do_find_free_inode(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t free_inode, dir; int mode; @@ -1692,7 +1717,7 @@ void do_find_free_inode(int argc, char *argv[]) char *tmp; if (argc > 3 || (argc>1 && *argv[1] == '?')) { - com_err(argv[0], 0, "Usage: find_free_inode [dir] [mode]"); + com_err(argv[0], 0, "Usage: find_free_inode [dir [mode]]"); return; } if (check_fs_open(argv[0])) @@ -1724,7 +1749,8 @@ void do_find_free_inode(int argc, char *argv[]) } #ifndef READ_ONLY -void do_write(int argc, char *argv[]) +void do_write(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { errcode_t retval; @@ -1737,7 +1763,8 @@ void do_write(int argc, char *argv[]) com_err(argv[0], retval, 0); } -void do_mknod(int argc, char *argv[]) +void do_mknod(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { unsigned long major, minor; errcode_t retval; @@ -1781,12 +1808,14 @@ void do_mknod(int argc, char *argv[]) goto usage; st.st_rdev = makedev(major, minor); - retval = do_mknod_internal(current_fs, cwd, argv[1], &st); + retval = do_mknod_internal(current_fs, cwd, argv[1], + st.st_mode, st.st_rdev); if (retval) com_err(argv[0], retval, 0); } -void do_mkdir(int argc, char *argv[]) +void do_mkdir(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { errcode_t retval; @@ -1804,11 +1833,17 @@ static int release_blocks_proc(ext2_filsys fs, blk64_t *blocknr, e2_blkcnt_t blockcnt EXT2FS_ATTR((unused)), blk64_t ref_block EXT2FS_ATTR((unused)), int ref_offset EXT2FS_ATTR((unused)), - void *private EXT2FS_ATTR((unused))) + void *private) { - blk64_t block; + blk64_t block = *blocknr; + blk64_t *last_cluster = (blk64_t *)private; + blk64_t cluster = EXT2FS_B2C(fs, block); + + if (cluster == *last_cluster) + return 0; + + *last_cluster = cluster; - block = *blocknr; ext2fs_block_alloc_stats2(fs, block, -1); return 0; } @@ -1823,8 +1858,9 @@ static void kill_file_by_inode(ext2_ino_t inode) if (debugfs_write_inode(inode, &inode_buf, 0)) return; if (ext2fs_inode_has_valid_blocks2(current_fs, &inode_buf)) { + blk64_t last_cluster = 0; ext2fs_block_iterate3(current_fs, inode, BLOCK_FLAG_READ_ONLY, - NULL, release_blocks_proc, NULL); + NULL, release_blocks_proc, &last_cluster); } printf("\n"); ext2fs_inode_alloc_stats2(current_fs, inode, -1, @@ -1832,7 +1868,8 @@ static void kill_file_by_inode(ext2_ino_t inode) } -void do_kill_file(int argc, char *argv[]) +void do_kill_file(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t inode_num; @@ -1842,7 +1879,8 @@ void do_kill_file(int argc, char *argv[]) kill_file_by_inode(inode_num); } -void do_rm(int argc, char *argv[]) +void do_rm(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { int retval; ext2_ino_t inode_num; @@ -1903,7 +1941,8 @@ static int rmdir_proc(ext2_ino_t dir EXT2FS_ATTR((unused)), return 0; } -void do_rmdir(int argc, char *argv[]) +void do_rmdir(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { int retval; ext2_ino_t inode_num; @@ -1961,7 +2000,9 @@ void do_rmdir(int argc, char *argv[]) #endif /* READ_ONLY */ void do_show_debugfs_params(int argc EXT2FS_ATTR((unused)), - char *argv[] EXT2FS_ATTR((unused))) + char *argv[] EXT2FS_ATTR((unused)), + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { if (current_fs) printf("Open mode: read-%s\n", @@ -1971,7 +2012,8 @@ void do_show_debugfs_params(int argc EXT2FS_ATTR((unused)), } #ifndef READ_ONLY -void do_expand_dir(int argc, char *argv[]) +void do_expand_dir(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t inode; int retval; @@ -1985,7 +2027,8 @@ void do_expand_dir(int argc, char *argv[]) return; } -void do_features(int argc, char *argv[]) +void do_features(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { int i; @@ -2006,7 +2049,8 @@ void do_features(int argc, char *argv[]) } #endif /* READ_ONLY */ -void do_bmap(int argc, char *argv[]) +void do_bmap(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t ino; blk64_t blk, pblk = 0; @@ -2069,7 +2113,8 @@ void do_bmap(int argc, char *argv[]) fputc('\n', stdout); } -void do_imap(int argc, char *argv[]) +void do_imap(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t ino; unsigned long group, block, block_nr, offset; @@ -2100,17 +2145,32 @@ void do_imap(int argc, char *argv[]) } -void do_idump(int argc, char *argv[]) +void do_idump(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { + struct ext2_inode_large *inode; ext2_ino_t ino; unsigned char *buf; errcode_t err; - int isize; + unsigned int isize, size, offset = 0; + int c, mode = 0; - if (common_args_process(argc, argv, 2, 2, argv[0], - "", 0)) + reset_getopt(); + while ((c = getopt (argc, argv, "bex")) != EOF) { + if (mode || c == '?') { + com_err(argv[0], 0, + "Usage: inode_dump [-b]|[-e] "); + return; + } + mode = c; + } + if (optind != argc-1) return; - ino = string_to_inode(argv[1]); + + if (check_fs_open(argv[0])) + return; + + ino = string_to_inode(argv[optind]); if (!ino) return; @@ -2124,17 +2184,41 @@ void do_idump(int argc, char *argv[]) err = ext2fs_read_inode_full(current_fs, ino, (struct ext2_inode *)buf, isize); if (err) { - com_err(argv[0], err, "while reading inode %d", ino); + com_err(argv[0], err, "while reading inode %u", ino); goto err; } - do_byte_hexdump(stdout, buf, isize); + inode = (struct ext2_inode_large *) buf; + size = isize; + switch (mode) { + case 'b': + offset = ((char *) (&inode->i_block)) - ((char *) buf); + size = sizeof(inode->i_block); + break; + case 'x': + case 'e': + if (size <= EXT2_GOOD_OLD_INODE_SIZE) { + com_err(argv[0], 0, "No extra space in inode"); + goto err; + } + offset = EXT2_GOOD_OLD_INODE_SIZE + inode->i_extra_isize; + if (offset > size) + goto err; + size -= offset; + break; + } + if (mode == 'x') + raw_inode_xattr_dump(stdout, buf + offset, size); + else + do_byte_hexdump(stdout, buf + offset, size); err: ext2fs_free_mem(&buf); } #ifndef READ_ONLY -void do_set_current_time(int argc, char *argv[]) +void do_set_current_time(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { __s64 now; @@ -2193,7 +2277,9 @@ static int find_supp_feature(__u32 *supp, int feature_type, char *name) return 0; } -void do_supported_features(int argc, char *argv[]) +void do_supported_features(int argc, char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { int ret; __u32 supp[3] = { EXT2_LIB_FEATURE_COMPAT_SUPP, @@ -2221,7 +2307,8 @@ void do_supported_features(int argc, char *argv[]) } #ifndef READ_ONLY -void do_punch(int argc, char *argv[]) +void do_punch(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t ino; blk64_t start, end; @@ -2256,7 +2343,8 @@ void do_punch(int argc, char *argv[]) } } -void do_fallocate(int argc, char *argv[]) +void do_fallocate(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { ext2_ino_t ino; blk64_t start, end; @@ -2293,7 +2381,8 @@ void do_fallocate(int argc, char *argv[]) } #endif /* READ_ONLY */ -void do_symlink(int argc, char *argv[]) +void do_symlink(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { errcode_t retval; @@ -2308,7 +2397,9 @@ void do_symlink(int argc, char *argv[]) } #if CONFIG_MMP -void do_dump_mmp(int argc EXT2FS_ATTR((unused)), char *argv[]) +void do_dump_mmp(int argc EXT2FS_ATTR((unused)), char *argv[], + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { struct mmp_struct *mmp_s; unsigned long long mmp_block; @@ -2361,16 +2452,18 @@ void do_dump_mmp(int argc EXT2FS_ATTR((unused)), char *argv[]) fprintf(stdout, "check_interval: %d\n", mmp_s->mmp_check_interval); fprintf(stdout, "sequence: %08x\n", mmp_s->mmp_seq); fprintf(stdout, "time: %lld -- %s", mmp_s->mmp_time, ctime(&t)); - fprintf(stdout, "node_name: %s\n", mmp_s->mmp_nodename); - fprintf(stdout, "device_name: %s\n", mmp_s->mmp_bdevname); + fprintf(stdout, "node_name: %.*s\n", + EXT2_LEN_STR(mmp_s->mmp_nodename)); + fprintf(stdout, "device_name: %.*s\n", + EXT2_LEN_STR(mmp_s->mmp_bdevname)); fprintf(stdout, "magic: 0x%x\n", mmp_s->mmp_magic); fprintf(stdout, "checksum: 0x%08x\n", mmp_s->mmp_checksum); - fprintf(stdout, "MMP is unsupported, please recompile with " - "--enable-mmp\n"); } #else void do_dump_mmp(int argc EXT2FS_ATTR((unused)), - char *argv[] EXT2FS_ATTR((unused))) + char *argv[] EXT2FS_ATTR((unused)), + int sci_idx EXT2FS_ATTR((unused)), + void *infop EXT2FS_ATTR((unused))) { fprintf(stdout, "MMP is unsupported, please recompile with " "--enable-mmp\n"); @@ -2424,11 +2517,11 @@ int main(int argc, char **argv) int retval; const char *usage = "Usage: %s [-b blocksize] [-s superblock] [-f cmd_file] " - "[-R request] [-V] [" + "[-R request] [-d data_source_device] [-i] [-n] [-D] [-V] [" #ifndef READ_ONLY "[-w] [-z undo_file] " #endif - "[-c] device]"; + "[-c]] [device]"; int c; int open_flags = EXT2_FLAG_SOFTSUPP_FEATURES | EXT2_FLAG_64BITS; char *request = 0; @@ -2528,39 +2621,39 @@ int main(int argc, char **argv) superblock, blocksize, catastrophic, data_filename, undo_file); - sci_idx = ss_create_invocation(debug_prog_name, "0.0", (char *) NULL, - &debug_cmds, &retval); + ss_sci_idx = ss_create_invocation(debug_prog_name, "0.0", (char *) NULL, + &debug_cmds, &retval); if (retval) { - ss_perror(sci_idx, retval, "creating invocation"); + ss_perror(ss_sci_idx, retval, "creating invocation"); exit(1); } - ss_get_readline(sci_idx); + ss_get_readline(ss_sci_idx); - (void) ss_add_request_table (sci_idx, &ss_std_requests, 1, &retval); + (void) ss_add_request_table(ss_sci_idx, &ss_std_requests, 1, &retval); if (retval) { - ss_perror(sci_idx, retval, "adding standard requests"); + ss_perror(ss_sci_idx, retval, "adding standard requests"); exit (1); } if (extra_cmds) - ss_add_request_table (sci_idx, extra_cmds, 1, &retval); + ss_add_request_table(ss_sci_idx, extra_cmds, 1, &retval); if (retval) { - ss_perror(sci_idx, retval, "adding extra requests"); + ss_perror(ss_sci_idx, retval, "adding extra requests"); exit (1); } if (request) { retval = 0; - retval = ss_execute_line(sci_idx, request); + retval = ss_execute_line(ss_sci_idx, request); if (retval) { - ss_perror(sci_idx, retval, request); + ss_perror(ss_sci_idx, retval, request); exit_status++; } } else if (cmd_file) { - exit_status = source_file(cmd_file, sci_idx); + exit_status = source_file(cmd_file, ss_sci_idx); } else { - ss_listen(sci_idx); + ss_listen(ss_sci_idx); } - ss_delete_invocation(sci_idx); + ss_delete_invocation(ss_sci_idx); if (current_fs) close_filesystem();