lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | /* |
| 2 | * unused.c --- quick and dirty unused space dumper |
| 3 | * |
| 4 | * Copyright (C) 1997 Theodore Ts'o. This file may be redistributed |
| 5 | * under the terms of the GNU Public License. |
| 6 | */ |
| 7 | |
| 8 | #include "config.h" |
| 9 | #include <stdio.h> |
| 10 | #include <unistd.h> |
| 11 | #include <stdlib.h> |
| 12 | #include <ctype.h> |
| 13 | #include <string.h> |
| 14 | #include <time.h> |
| 15 | #ifdef HAVE_ERRNO_H |
| 16 | #include <errno.h> |
| 17 | #endif |
| 18 | #include <sys/types.h> |
| 19 | #ifdef HAVE_GETOPT_H |
| 20 | #include <getopt.h> |
| 21 | #else |
| 22 | extern int optind; |
| 23 | extern char *optarg; |
| 24 | #endif |
| 25 | |
| 26 | #include "debugfs.h" |
| 27 | |
| 28 | void do_dump_unused(int argc EXT2FS_ATTR((unused)), char **argv) |
| 29 | { |
| 30 | blk64_t blk; |
| 31 | unsigned char buf[EXT2_MAX_BLOCK_SIZE]; |
| 32 | unsigned int i; |
| 33 | errcode_t retval; |
| 34 | |
| 35 | if (common_args_process(argc, argv, 1, 1, |
| 36 | "dump_unused", "", 0)) |
| 37 | return; |
| 38 | |
| 39 | for (blk=current_fs->super->s_first_data_block; |
| 40 | blk < ext2fs_blocks_count(current_fs->super); blk++) { |
| 41 | if (ext2fs_test_block_bitmap2(current_fs->block_map,blk)) |
| 42 | continue; |
| 43 | retval = io_channel_read_blk64(current_fs->io, blk, 1, buf); |
| 44 | if (retval) { |
| 45 | com_err(argv[0], retval, "While reading block\n"); |
| 46 | return; |
| 47 | } |
| 48 | for (i=0; i < current_fs->blocksize; i++) |
| 49 | if (buf[i]) |
| 50 | break; |
| 51 | if (i >= current_fs->blocksize) |
| 52 | continue; |
| 53 | printf("\nUnused block %llu contains non-zero data:\n\n", |
| 54 | blk); |
| 55 | for (i=0; i < current_fs->blocksize; i++) |
| 56 | fputc(buf[i], stdout); |
| 57 | } |
| 58 | } |