119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * test_extent.c --- tester for the extent abstraction
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1997, 1998 by Theodore Ts'o and
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 	PowerQuest, Inc.
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1999, 2000 by Theosore Ts'o
83984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt *
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header%
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This file may be redistributed under the terms of the GNU Public
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * License.
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header%
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "resize2fs.h"
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_test(FILE *in, FILE *out);
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid do_test(FILE *in, FILE *out)
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	char		buf[128];
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	char		*cp, *cmd, *arg1, *arg2;
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	__u32		num1, num2;
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int		size;
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	errcode_t	retval;
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ext2_extent	extent = 0;
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	const char	*no_table = "# No extent table\n";
283984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while (!feof(in)) {
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (!fgets(buf, sizeof(buf), in))
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		/*
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		 * Ignore comments
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		 */
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (buf[0] =='#')
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			continue;
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		/*
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		 * Echo command
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		 */
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		fputs(buf, out);
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		cp = strchr(buf, '\n');
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (cp)
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			*cp = '\0';
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		/*
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		 * Parse command line; simple, at most two arguments
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		 */
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		cmd = buf;
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		num1 = num2 = 0;
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		arg1 = arg2 = 0;
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		cp = strchr(buf, ' ');
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (cp) {
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			*cp++ = '\0';
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			arg1 = cp;
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			num1 = strtoul(arg1, 0, 0);
583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			cp = strchr(cp, ' ');
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (cp) {
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			*cp++ = '\0';
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			arg2 = cp;
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			num2 = strtoul(arg2, 0, 0);
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (!strcmp(cmd, "create")) {
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			retval = ext2fs_create_extent_table(&extent, num1);
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (retval) {
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			handle_error:
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				fprintf(out, "# Error: %s\n",
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					error_message(retval));
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				continue;
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			}
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			continue;
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (!extent) {
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			fputs(no_table, out);
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			continue;
803984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt		}
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (!strcmp(cmd, "free")) {
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			ext2fs_free_extent_table(extent);
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			extent = 0;
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		} else if (!strcmp(cmd, "add")) {
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			retval = ext2fs_add_extent_entry(extent, num1, num2);
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (retval)
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				goto handle_error;
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		} else if (!strcmp(cmd, "lookup")) {
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			num2 = ext2fs_extent_translate(extent, num1);
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			fprintf(out, "# Answer: %u%s\n", num2,
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				num2 ? "" : " (not found)");
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		} else if (!strcmp(cmd, "dump")) {
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			ext2fs_extent_dump(extent, out);
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		} else if (!strcmp(cmd, "iter_test")) {
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			retval = ext2fs_iterate_extent(extent, 0, 0, 0);
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (retval)
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				goto handle_error;
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			while (1) {
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				retval = ext2fs_iterate_extent(extent,
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					       &num1, &num2, &size);
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				if (retval)
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					goto handle_error;
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				if (!size)
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					break;
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				fprintf(out, "# %u -> %u (%d)\n",
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					num1, num2, size);
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			}
1083984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt		} else
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			fputs("# Syntax error\n", out);
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1133984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#ifdef __GNUC__
1143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define ATTR(x) __attribute__(x)
1153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#else
1163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#define ATTR(x)
1173984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#endif
1183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
1193984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidtint main(int argc ATTR((unused)), char **argv ATTR((unused)))
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	do_test(stdin, stdout);
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	exit(0);
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
124