1c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/*
2c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * test_extent.c --- tester for the extent abstraction
3c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o *
40cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * Copyright (C) 1997, 1998 by Theodore Ts'o and
50cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * 	PowerQuest, Inc.
60cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o *
70cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * Copyright (C) 1999, 2000 by Theosore Ts'o
8efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *
9c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * %Begin-Header%
100cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * This file may be redistributed under the terms of the GNU Public
110cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * License.
12c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * %End-Header%
13c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */
14c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o
15c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o#include "resize2fs.h"
16c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o
17c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'ovoid do_test(FILE *in, FILE *out);
18c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o
19c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'ovoid do_test(FILE *in, FILE *out)
20c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o{
21c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o	char		buf[128];
22c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o	char		*cp, *cmd, *arg1, *arg2;
23e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	__u64		num1, num2;
24e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	__u64		size;
25c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o	errcode_t	retval;
26c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o	ext2_extent	extent = 0;
27c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o	const char	*no_table = "# No extent table\n";
28efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
29c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o	while (!feof(in)) {
30c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		if (!fgets(buf, sizeof(buf), in))
31c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			break;
32c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		/*
33c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		 * Ignore comments
34c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		 */
35c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		if (buf[0] =='#')
36c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			continue;
37c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o
38c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		/*
39c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		 * Echo command
40c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		 */
41c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		fputs(buf, out);
42c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o
43c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		cp = strchr(buf, '\n');
44c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		if (cp)
45c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			*cp = '\0';
46c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o
47c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		/*
48c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		 * Parse command line; simple, at most two arguments
49c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		 */
50c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		cmd = buf;
51c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		num1 = num2 = 0;
52c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		arg1 = arg2 = 0;
53c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		cp = strchr(buf, ' ');
54c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		if (cp) {
55c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			*cp++ = '\0';
56c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			arg1 = cp;
57c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			num1 = strtoul(arg1, 0, 0);
58efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
59c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			cp = strchr(cp, ' ');
60c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		}
61c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		if (cp) {
62c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			*cp++ = '\0';
63c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			arg2 = cp;
64c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			num2 = strtoul(arg2, 0, 0);
65c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		}
66efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
67c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		if (!strcmp(cmd, "create")) {
68c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			retval = ext2fs_create_extent_table(&extent, num1);
69c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			if (retval) {
70c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			handle_error:
71c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o				fprintf(out, "# Error: %s\n",
72c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o					error_message(retval));
73c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o				continue;
74c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			}
75c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			continue;
76c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		}
77c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		if (!extent) {
78c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			fputs(no_table, out);
79c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			continue;
80efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o		}
81c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		if (!strcmp(cmd, "free")) {
82c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			ext2fs_free_extent_table(extent);
83c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			extent = 0;
84c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		} else if (!strcmp(cmd, "add")) {
85c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			retval = ext2fs_add_extent_entry(extent, num1, num2);
86c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			if (retval)
87c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o				goto handle_error;
88c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		} else if (!strcmp(cmd, "lookup")) {
89c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			num2 = ext2fs_extent_translate(extent, num1);
90e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall			fprintf(out, "# Answer: %llu%s\n", num2,
91c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o				num2 ? "" : " (not found)");
92c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		} else if (!strcmp(cmd, "dump")) {
93c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			ext2fs_extent_dump(extent, out);
94c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o		} else if (!strcmp(cmd, "iter_test")) {
95c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			retval = ext2fs_iterate_extent(extent, 0, 0, 0);
96c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			if (retval)
97c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o				goto handle_error;
98c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			while (1) {
99c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o				retval = ext2fs_iterate_extent(extent,
100c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o					       &num1, &num2, &size);
101c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o				if (retval)
102c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o					goto handle_error;
103c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o				if (!size)
104c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o					break;
105e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall				fprintf(out, "# %llu -> %llu (%llu)\n",
106c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o					num1, num2, size);
107c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			}
108efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o		} else
109c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o			fputs("# Syntax error\n", out);
110c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o	}
111c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o}
112c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o
1132c25f7e75ad10078ecfed08b9295fb1904c8bb80Theodore Ts'o#ifdef __GNUC__
1142c25f7e75ad10078ecfed08b9295fb1904c8bb80Theodore Ts'o#define ATTR(x) __attribute__(x)
1152c25f7e75ad10078ecfed08b9295fb1904c8bb80Theodore Ts'o#else
1162c25f7e75ad10078ecfed08b9295fb1904c8bb80Theodore Ts'o#define ATTR(x)
1172c25f7e75ad10078ecfed08b9295fb1904c8bb80Theodore Ts'o#endif
1182c25f7e75ad10078ecfed08b9295fb1904c8bb80Theodore Ts'o
1192c25f7e75ad10078ecfed08b9295fb1904c8bb80Theodore Ts'oint main(int argc ATTR((unused)), char **argv ATTR((unused)))
120c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o{
121c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o	do_test(stdin, stdout);
122c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o	exit(0);
123c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o}
124