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