| /* |
| * tst_libext2fs.c |
| */ |
| |
| #include "config.h" |
| #include <stdio.h> |
| #include <string.h> |
| #if HAVE_UNISTD_H |
| #include <unistd.h> |
| #endif |
| #if HAVE_ERRNO_H |
| #include <errno.h> |
| #endif |
| #if HAVE_SYS_STAT_H |
| #include <sys/stat.h> |
| #endif |
| #if HAVE_SYS_TYPES_H |
| #include <sys/types.h> |
| #endif |
| |
| #include "ext2_fs.h" |
| #include "ext2fsP.h" |
| |
| #include "ss/ss.h" |
| #include "debugfs.h" |
| |
| /* |
| * Hook in new commands into debugfs |
| * Override debugfs's prompt |
| */ |
| const char *debug_prog_name = "tst_libext2fs"; |
| extern ss_request_table libext2fs_cmds; |
| ss_request_table *extra_cmds = &libext2fs_cmds; |
| |
| static int print_blocks_proc(ext2_filsys fs EXT2FS_ATTR((unused)), |
| blk64_t *blocknr, e2_blkcnt_t blockcnt, |
| blk64_t ref_block, int ref_offset, |
| void *private EXT2FS_ATTR((unused))) |
| { |
| printf("%6lld %8llu (%d %llu)\n", (long long) blockcnt, |
| (unsigned long long)*blocknr, ref_offset, ref_block); |
| return 0; |
| } |
| |
| |
| void do_block_iterate(int argc, char **argv) |
| { |
| const char *usage = "block_iterate <file> <flags"; |
| ext2_ino_t ino; |
| int err = 0; |
| int flags = 0; |
| |
| if (common_args_process(argc, argv, 2, 3, argv[0], usage, 0)) |
| return; |
| |
| ino = string_to_inode(argv[1]); |
| if (!ino) |
| return; |
| |
| if (argc > 2) { |
| flags = parse_ulong(argv[2], argv[0], "flags", &err); |
| if (err) |
| return; |
| } |
| flags |= BLOCK_FLAG_READ_ONLY; |
| |
| ext2fs_block_iterate3(current_fs, ino, flags, NULL, |
| print_blocks_proc, NULL); |
| putc('\n', stdout); |
| } |