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