Home | History | Annotate | Download | only in ext2fs
      1 /*
      2  * tst_libext2fs.c
      3  */
      4 
      5 #include "config.h"
      6 #include <stdio.h>
      7 #include <string.h>
      8 #if HAVE_UNISTD_H
      9 #include <unistd.h>
     10 #endif
     11 #if HAVE_ERRNO_H
     12 #include <errno.h>
     13 #endif
     14 #if HAVE_SYS_STAT_H
     15 #include <sys/stat.h>
     16 #endif
     17 #if HAVE_SYS_TYPES_H
     18 #include <sys/types.h>
     19 #endif
     20 
     21 #include "ext2_fs.h"
     22 #include "ext2fsP.h"
     23 
     24 #include "ss/ss.h"
     25 #include "debugfs.h"
     26 
     27 /*
     28  * Hook in new commands into debugfs
     29  * Override debugfs's prompt
     30  */
     31 const char *debug_prog_name = "tst_libext2fs";
     32 extern ss_request_table libext2fs_cmds;
     33 ss_request_table *extra_cmds = &libext2fs_cmds;
     34 
     35 static int print_blocks_proc(ext2_filsys fs EXT2FS_ATTR((unused)),
     36 			     blk64_t *blocknr, e2_blkcnt_t blockcnt,
     37 			     blk64_t ref_block, int ref_offset,
     38 			     void *private EXT2FS_ATTR((unused)))
     39 {
     40 	printf("%6lld %8llu (%d %llu)\n", (long long) blockcnt,
     41 	       (unsigned long long)*blocknr, ref_offset, ref_block);
     42 	return 0;
     43 }
     44 
     45 
     46 void do_block_iterate(int argc, char **argv)
     47 {
     48 	const char	*usage = "block_iterate <file> <flags";
     49 	ext2_ino_t	ino;
     50 	int		err = 0;
     51 	int		flags = 0;
     52 
     53 	if (common_args_process(argc, argv, 2, 3, argv[0], usage, 0))
     54 		return;
     55 
     56 	ino = string_to_inode(argv[1]);
     57 	if (!ino)
     58 		return;
     59 
     60 	if (argc > 2) {
     61 		flags = parse_ulong(argv[2], argv[0], "flags", &err);
     62 		if (err)
     63 			return;
     64 	}
     65 	flags |= BLOCK_FLAG_READ_ONLY;
     66 
     67 	ext2fs_block_iterate3(current_fs, ino, flags, NULL,
     68 			      print_blocks_proc, NULL);
     69 	putc('\n', stdout);
     70 }
     71