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