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