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