OSDN Git Service

Merge "e2fsck: read only parameter incorrectly compared"
[android-x86/external-e2fsprogs.git] / resize / test_extent.c
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
17 void do_test(FILE *in, FILE *out);
18
19 void do_test(FILE *in, FILE *out)
20 {
21         char            buf[128];
22         char            *cp, *cmd, *arg1, *arg2;
23         __u32           num1, num2;
24         int             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: %u%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, "# %u -> %u (%d)\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
119 int main(int argc ATTR((unused)), char **argv ATTR((unused)))
120 {
121         do_test(stdin, stdout);
122         exit(0);
123 }