1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker * tst_bitmaps.c
3*6a54128fSAndroid Build Coastguard Worker *
4*6a54128fSAndroid Build Coastguard Worker * Copyright (C) 2011 Theodore Ts'o.
5*6a54128fSAndroid Build Coastguard Worker *
6*6a54128fSAndroid Build Coastguard Worker * %Begin-Header%
7*6a54128fSAndroid Build Coastguard Worker * This file may be redistributed under the terms of the GNU Library
8*6a54128fSAndroid Build Coastguard Worker * General Public License, version 2.
9*6a54128fSAndroid Build Coastguard Worker * %End-Header%
10*6a54128fSAndroid Build Coastguard Worker */
11*6a54128fSAndroid Build Coastguard Worker
12*6a54128fSAndroid Build Coastguard Worker #include "config.h"
13*6a54128fSAndroid Build Coastguard Worker #include <unistd.h>
14*6a54128fSAndroid Build Coastguard Worker #include <stdlib.h>
15*6a54128fSAndroid Build Coastguard Worker #include <stdio.h>
16*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_GETOPT_H
17*6a54128fSAndroid Build Coastguard Worker #include <getopt.h>
18*6a54128fSAndroid Build Coastguard Worker #endif
19*6a54128fSAndroid Build Coastguard Worker #include <string.h>
20*6a54128fSAndroid Build Coastguard Worker #include <fcntl.h>
21*6a54128fSAndroid Build Coastguard Worker #include <time.h>
22*6a54128fSAndroid Build Coastguard Worker #include <sys/stat.h>
23*6a54128fSAndroid Build Coastguard Worker #include <sys/types.h>
24*6a54128fSAndroid Build Coastguard Worker #include "ss/ss.h"
25*6a54128fSAndroid Build Coastguard Worker
26*6a54128fSAndroid Build Coastguard Worker #include "ext2_fs.h"
27*6a54128fSAndroid Build Coastguard Worker #include "ext2fs.h"
28*6a54128fSAndroid Build Coastguard Worker #include "ext2fsP.h"
29*6a54128fSAndroid Build Coastguard Worker
30*6a54128fSAndroid Build Coastguard Worker extern ss_request_table tst_bitmaps_cmds;
31*6a54128fSAndroid Build Coastguard Worker
32*6a54128fSAndroid Build Coastguard Worker static char subsystem_name[] = "tst_bitmaps";
33*6a54128fSAndroid Build Coastguard Worker static char version[] = "1.0";
34*6a54128fSAndroid Build Coastguard Worker
35*6a54128fSAndroid Build Coastguard Worker ext2_filsys test_fs;
36*6a54128fSAndroid Build Coastguard Worker int exit_status = 0;
37*6a54128fSAndroid Build Coastguard Worker
source_file(const char * cmd_file,int sci_idx)38*6a54128fSAndroid Build Coastguard Worker static int source_file(const char *cmd_file, int sci_idx)
39*6a54128fSAndroid Build Coastguard Worker {
40*6a54128fSAndroid Build Coastguard Worker FILE *f;
41*6a54128fSAndroid Build Coastguard Worker char buf[256];
42*6a54128fSAndroid Build Coastguard Worker char *cp;
43*6a54128fSAndroid Build Coastguard Worker int retval;
44*6a54128fSAndroid Build Coastguard Worker int noecho;
45*6a54128fSAndroid Build Coastguard Worker
46*6a54128fSAndroid Build Coastguard Worker if (strcmp(cmd_file, "-") == 0)
47*6a54128fSAndroid Build Coastguard Worker f = stdin;
48*6a54128fSAndroid Build Coastguard Worker else {
49*6a54128fSAndroid Build Coastguard Worker f = fopen(cmd_file, "r");
50*6a54128fSAndroid Build Coastguard Worker if (!f) {
51*6a54128fSAndroid Build Coastguard Worker perror(cmd_file);
52*6a54128fSAndroid Build Coastguard Worker exit(1);
53*6a54128fSAndroid Build Coastguard Worker }
54*6a54128fSAndroid Build Coastguard Worker }
55*6a54128fSAndroid Build Coastguard Worker fflush(stdout);
56*6a54128fSAndroid Build Coastguard Worker fflush(stderr);
57*6a54128fSAndroid Build Coastguard Worker setbuf(stdout, NULL);
58*6a54128fSAndroid Build Coastguard Worker setbuf(stderr, NULL);
59*6a54128fSAndroid Build Coastguard Worker while (!feof(f)) {
60*6a54128fSAndroid Build Coastguard Worker if (fgets(buf, sizeof(buf), f) == NULL)
61*6a54128fSAndroid Build Coastguard Worker break;
62*6a54128fSAndroid Build Coastguard Worker if (buf[0] == '#')
63*6a54128fSAndroid Build Coastguard Worker continue;
64*6a54128fSAndroid Build Coastguard Worker noecho = 0;
65*6a54128fSAndroid Build Coastguard Worker if (buf[0] == '-') {
66*6a54128fSAndroid Build Coastguard Worker noecho = 1;
67*6a54128fSAndroid Build Coastguard Worker buf[0] = ' ';
68*6a54128fSAndroid Build Coastguard Worker }
69*6a54128fSAndroid Build Coastguard Worker cp = strchr(buf, '\n');
70*6a54128fSAndroid Build Coastguard Worker if (cp)
71*6a54128fSAndroid Build Coastguard Worker *cp = 0;
72*6a54128fSAndroid Build Coastguard Worker cp = strchr(buf, '\r');
73*6a54128fSAndroid Build Coastguard Worker if (cp)
74*6a54128fSAndroid Build Coastguard Worker *cp = 0;
75*6a54128fSAndroid Build Coastguard Worker if (!noecho)
76*6a54128fSAndroid Build Coastguard Worker printf("%s: %s\n", subsystem_name, buf);
77*6a54128fSAndroid Build Coastguard Worker retval = ss_execute_line(sci_idx, buf);
78*6a54128fSAndroid Build Coastguard Worker if (retval) {
79*6a54128fSAndroid Build Coastguard Worker ss_perror(sci_idx, retval, buf);
80*6a54128fSAndroid Build Coastguard Worker exit_status++;
81*6a54128fSAndroid Build Coastguard Worker }
82*6a54128fSAndroid Build Coastguard Worker }
83*6a54128fSAndroid Build Coastguard Worker return exit_status;
84*6a54128fSAndroid Build Coastguard Worker }
85*6a54128fSAndroid Build Coastguard Worker
86*6a54128fSAndroid Build Coastguard Worker
87*6a54128fSAndroid Build Coastguard Worker /*
88*6a54128fSAndroid Build Coastguard Worker * This function resets the libc getopt() function, which keeps
89*6a54128fSAndroid Build Coastguard Worker * internal state. Bad design! Stupid libc API designers! No
90*6a54128fSAndroid Build Coastguard Worker * biscuit!
91*6a54128fSAndroid Build Coastguard Worker *
92*6a54128fSAndroid Build Coastguard Worker * BSD-derived getopt() functions require that optind be reset to 1 in
93*6a54128fSAndroid Build Coastguard Worker * order to reset getopt() state. This used to be generally accepted
94*6a54128fSAndroid Build Coastguard Worker * way of resetting getopt(). However, glibc's getopt()
95*6a54128fSAndroid Build Coastguard Worker * has additional getopt() state beyond optind, and requires that
96*6a54128fSAndroid Build Coastguard Worker * optind be set zero to reset its state. So the unfortunate state of
97*6a54128fSAndroid Build Coastguard Worker * affairs is that BSD-derived versions of getopt() misbehave if
98*6a54128fSAndroid Build Coastguard Worker * optind is set to 0 in order to reset getopt(), and glibc's getopt()
99*6a54128fSAndroid Build Coastguard Worker * will core dump if optind is set 1 in order to reset getopt().
100*6a54128fSAndroid Build Coastguard Worker *
101*6a54128fSAndroid Build Coastguard Worker * More modern versions of BSD require that optreset be set to 1 in
102*6a54128fSAndroid Build Coastguard Worker * order to reset getopt(). Sigh. Standards, anyone?
103*6a54128fSAndroid Build Coastguard Worker *
104*6a54128fSAndroid Build Coastguard Worker * We hide the hair here.
105*6a54128fSAndroid Build Coastguard Worker */
reset_getopt(void)106*6a54128fSAndroid Build Coastguard Worker void reset_getopt(void)
107*6a54128fSAndroid Build Coastguard Worker {
108*6a54128fSAndroid Build Coastguard Worker #if defined(__GLIBC__) || defined(__linux__)
109*6a54128fSAndroid Build Coastguard Worker optind = 0;
110*6a54128fSAndroid Build Coastguard Worker #else
111*6a54128fSAndroid Build Coastguard Worker optind = 1;
112*6a54128fSAndroid Build Coastguard Worker #endif
113*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_OPTRESET
114*6a54128fSAndroid Build Coastguard Worker optreset = 1; /* Makes BSD getopt happy */
115*6a54128fSAndroid Build Coastguard Worker #endif
116*6a54128fSAndroid Build Coastguard Worker }
117*6a54128fSAndroid Build Coastguard Worker
118*6a54128fSAndroid Build Coastguard Worker /*
119*6a54128fSAndroid Build Coastguard Worker * This function will convert a string to an unsigned long, printing
120*6a54128fSAndroid Build Coastguard Worker * an error message if it fails, and returning success or failure in err.
121*6a54128fSAndroid Build Coastguard Worker */
parse_ulong(const char * str,const char * cmd,const char * descr,int * err)122*6a54128fSAndroid Build Coastguard Worker unsigned long parse_ulong(const char *str, const char *cmd,
123*6a54128fSAndroid Build Coastguard Worker const char *descr, int *err)
124*6a54128fSAndroid Build Coastguard Worker {
125*6a54128fSAndroid Build Coastguard Worker char *tmp;
126*6a54128fSAndroid Build Coastguard Worker unsigned long ret;
127*6a54128fSAndroid Build Coastguard Worker
128*6a54128fSAndroid Build Coastguard Worker ret = strtoul(str, &tmp, 0);
129*6a54128fSAndroid Build Coastguard Worker if (*tmp == 0) {
130*6a54128fSAndroid Build Coastguard Worker if (err)
131*6a54128fSAndroid Build Coastguard Worker *err = 0;
132*6a54128fSAndroid Build Coastguard Worker return ret;
133*6a54128fSAndroid Build Coastguard Worker }
134*6a54128fSAndroid Build Coastguard Worker com_err(cmd, 0, "Bad %s - %s", descr, str);
135*6a54128fSAndroid Build Coastguard Worker if (err)
136*6a54128fSAndroid Build Coastguard Worker *err = 1;
137*6a54128fSAndroid Build Coastguard Worker else
138*6a54128fSAndroid Build Coastguard Worker exit(1);
139*6a54128fSAndroid Build Coastguard Worker return 0;
140*6a54128fSAndroid Build Coastguard Worker }
141*6a54128fSAndroid Build Coastguard Worker
142*6a54128fSAndroid Build Coastguard Worker
check_fs_open(char * name)143*6a54128fSAndroid Build Coastguard Worker int check_fs_open(char *name)
144*6a54128fSAndroid Build Coastguard Worker {
145*6a54128fSAndroid Build Coastguard Worker if (!test_fs) {
146*6a54128fSAndroid Build Coastguard Worker com_err(name, 0, "Filesystem not open");
147*6a54128fSAndroid Build Coastguard Worker return 1;
148*6a54128fSAndroid Build Coastguard Worker }
149*6a54128fSAndroid Build Coastguard Worker return 0;
150*6a54128fSAndroid Build Coastguard Worker }
151*6a54128fSAndroid Build Coastguard Worker
setup_filesystem(const char * name,unsigned int blocks,unsigned int inodes,unsigned int type,int flags)152*6a54128fSAndroid Build Coastguard Worker static void setup_filesystem(const char *name,
153*6a54128fSAndroid Build Coastguard Worker unsigned int blocks, unsigned int inodes,
154*6a54128fSAndroid Build Coastguard Worker unsigned int type, int flags)
155*6a54128fSAndroid Build Coastguard Worker {
156*6a54128fSAndroid Build Coastguard Worker struct ext2_super_block param;
157*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
158*6a54128fSAndroid Build Coastguard Worker
159*6a54128fSAndroid Build Coastguard Worker memset(¶m, 0, sizeof(param));
160*6a54128fSAndroid Build Coastguard Worker ext2fs_blocks_count_set(¶m, blocks);
161*6a54128fSAndroid Build Coastguard Worker param.s_inodes_count = inodes;
162*6a54128fSAndroid Build Coastguard Worker
163*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_initialize("test fs", flags, ¶m,
164*6a54128fSAndroid Build Coastguard Worker test_io_manager, &test_fs);
165*6a54128fSAndroid Build Coastguard Worker
166*6a54128fSAndroid Build Coastguard Worker if (retval) {
167*6a54128fSAndroid Build Coastguard Worker com_err(name, retval, "while initializing filesystem");
168*6a54128fSAndroid Build Coastguard Worker return;
169*6a54128fSAndroid Build Coastguard Worker }
170*6a54128fSAndroid Build Coastguard Worker test_fs->default_bitmap_type = type;
171*6a54128fSAndroid Build Coastguard Worker ext2fs_free_block_bitmap(test_fs->block_map);
172*6a54128fSAndroid Build Coastguard Worker test_fs->block_map = 0;
173*6a54128fSAndroid Build Coastguard Worker ext2fs_free_inode_bitmap(test_fs->inode_map);
174*6a54128fSAndroid Build Coastguard Worker test_fs->inode_map = 0;
175*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_allocate_block_bitmap(test_fs, "block bitmap",
176*6a54128fSAndroid Build Coastguard Worker &test_fs->block_map);
177*6a54128fSAndroid Build Coastguard Worker if (retval) {
178*6a54128fSAndroid Build Coastguard Worker com_err(name, retval, "while allocating block bitmap");
179*6a54128fSAndroid Build Coastguard Worker goto errout;
180*6a54128fSAndroid Build Coastguard Worker }
181*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_allocate_inode_bitmap(test_fs, "inode bitmap",
182*6a54128fSAndroid Build Coastguard Worker &test_fs->inode_map);
183*6a54128fSAndroid Build Coastguard Worker if (retval) {
184*6a54128fSAndroid Build Coastguard Worker com_err(name, retval, "while allocating inode bitmap");
185*6a54128fSAndroid Build Coastguard Worker goto errout;
186*6a54128fSAndroid Build Coastguard Worker }
187*6a54128fSAndroid Build Coastguard Worker return;
188*6a54128fSAndroid Build Coastguard Worker
189*6a54128fSAndroid Build Coastguard Worker errout:
190*6a54128fSAndroid Build Coastguard Worker ext2fs_close_free(&test_fs);
191*6a54128fSAndroid Build Coastguard Worker }
192*6a54128fSAndroid Build Coastguard Worker
setup_cmd(int argc,char ** argv,int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))193*6a54128fSAndroid Build Coastguard Worker void setup_cmd(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
194*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
195*6a54128fSAndroid Build Coastguard Worker {
196*6a54128fSAndroid Build Coastguard Worker int c, err;
197*6a54128fSAndroid Build Coastguard Worker unsigned int blocks = 128;
198*6a54128fSAndroid Build Coastguard Worker unsigned int inodes = 0;
199*6a54128fSAndroid Build Coastguard Worker unsigned int type = EXT2FS_BMAP64_BITARRAY;
200*6a54128fSAndroid Build Coastguard Worker int flags = EXT2_FLAG_64BITS;
201*6a54128fSAndroid Build Coastguard Worker
202*6a54128fSAndroid Build Coastguard Worker if (test_fs)
203*6a54128fSAndroid Build Coastguard Worker ext2fs_close_free(&test_fs);
204*6a54128fSAndroid Build Coastguard Worker
205*6a54128fSAndroid Build Coastguard Worker reset_getopt();
206*6a54128fSAndroid Build Coastguard Worker while ((c = getopt(argc, argv, "b:i:lt:")) != EOF) {
207*6a54128fSAndroid Build Coastguard Worker switch (c) {
208*6a54128fSAndroid Build Coastguard Worker case 'b':
209*6a54128fSAndroid Build Coastguard Worker blocks = parse_ulong(optarg, argv[0],
210*6a54128fSAndroid Build Coastguard Worker "number of blocks", &err);
211*6a54128fSAndroid Build Coastguard Worker if (err)
212*6a54128fSAndroid Build Coastguard Worker return;
213*6a54128fSAndroid Build Coastguard Worker break;
214*6a54128fSAndroid Build Coastguard Worker case 'i':
215*6a54128fSAndroid Build Coastguard Worker inodes = parse_ulong(optarg, argv[0],
216*6a54128fSAndroid Build Coastguard Worker "number of blocks", &err);
217*6a54128fSAndroid Build Coastguard Worker if (err)
218*6a54128fSAndroid Build Coastguard Worker return;
219*6a54128fSAndroid Build Coastguard Worker break;
220*6a54128fSAndroid Build Coastguard Worker case 'l': /* Legacy bitmaps */
221*6a54128fSAndroid Build Coastguard Worker flags = 0;
222*6a54128fSAndroid Build Coastguard Worker break;
223*6a54128fSAndroid Build Coastguard Worker case 't':
224*6a54128fSAndroid Build Coastguard Worker type = parse_ulong(optarg, argv[0],
225*6a54128fSAndroid Build Coastguard Worker "bitmap backend type", &err);
226*6a54128fSAndroid Build Coastguard Worker if (err)
227*6a54128fSAndroid Build Coastguard Worker return;
228*6a54128fSAndroid Build Coastguard Worker break;
229*6a54128fSAndroid Build Coastguard Worker default:
230*6a54128fSAndroid Build Coastguard Worker fprintf(stderr, "%s: usage: setup [-b blocks] "
231*6a54128fSAndroid Build Coastguard Worker "[-i inodes] [-t type]\n", argv[0]);
232*6a54128fSAndroid Build Coastguard Worker return;
233*6a54128fSAndroid Build Coastguard Worker }
234*6a54128fSAndroid Build Coastguard Worker }
235*6a54128fSAndroid Build Coastguard Worker setup_filesystem(argv[0], blocks, inodes, type, flags);
236*6a54128fSAndroid Build Coastguard Worker }
237*6a54128fSAndroid Build Coastguard Worker
close_cmd(int argc,char ** argv,int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))238*6a54128fSAndroid Build Coastguard Worker void close_cmd(int argc, char **argv, int sci_idx EXT2FS_ATTR((unused)),
239*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
240*6a54128fSAndroid Build Coastguard Worker {
241*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
242*6a54128fSAndroid Build Coastguard Worker return;
243*6a54128fSAndroid Build Coastguard Worker
244*6a54128fSAndroid Build Coastguard Worker ext2fs_close_free(&test_fs);
245*6a54128fSAndroid Build Coastguard Worker }
246*6a54128fSAndroid Build Coastguard Worker
247*6a54128fSAndroid Build Coastguard Worker
dump_bitmap(ext2fs_generic_bitmap bmap,unsigned int start,unsigned num)248*6a54128fSAndroid Build Coastguard Worker void dump_bitmap(ext2fs_generic_bitmap bmap, unsigned int start, unsigned num)
249*6a54128fSAndroid Build Coastguard Worker {
250*6a54128fSAndroid Build Coastguard Worker unsigned char *buf;
251*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
252*6a54128fSAndroid Build Coastguard Worker int i, len = (num - start + 7) / 8;
253*6a54128fSAndroid Build Coastguard Worker
254*6a54128fSAndroid Build Coastguard Worker buf = malloc(len);
255*6a54128fSAndroid Build Coastguard Worker if (!buf) {
256*6a54128fSAndroid Build Coastguard Worker com_err("dump_bitmap", 0, "couldn't allocate buffer");
257*6a54128fSAndroid Build Coastguard Worker return;
258*6a54128fSAndroid Build Coastguard Worker }
259*6a54128fSAndroid Build Coastguard Worker memset(buf, 0, len);
260*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_get_generic_bmap_range(bmap, (__u64) start, num, buf);
261*6a54128fSAndroid Build Coastguard Worker if (retval) {
262*6a54128fSAndroid Build Coastguard Worker com_err("dump_bitmap", retval,
263*6a54128fSAndroid Build Coastguard Worker "while calling ext2fs_generic_bmap_range");
264*6a54128fSAndroid Build Coastguard Worker free(buf);
265*6a54128fSAndroid Build Coastguard Worker return;
266*6a54128fSAndroid Build Coastguard Worker }
267*6a54128fSAndroid Build Coastguard Worker for (i=0; i < len; i++)
268*6a54128fSAndroid Build Coastguard Worker printf("%02x", buf[i]);
269*6a54128fSAndroid Build Coastguard Worker printf("\n");
270*6a54128fSAndroid Build Coastguard Worker printf("bits set: %u\n", ext2fs_bitcount(buf, len));
271*6a54128fSAndroid Build Coastguard Worker free(buf);
272*6a54128fSAndroid Build Coastguard Worker }
273*6a54128fSAndroid Build Coastguard Worker
dump_inode_bitmap_cmd(int argc,char ** argv,int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))274*6a54128fSAndroid Build Coastguard Worker void dump_inode_bitmap_cmd(int argc, char **argv,
275*6a54128fSAndroid Build Coastguard Worker int sci_idx EXT2FS_ATTR((unused)),
276*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
277*6a54128fSAndroid Build Coastguard Worker {
278*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
279*6a54128fSAndroid Build Coastguard Worker return;
280*6a54128fSAndroid Build Coastguard Worker
281*6a54128fSAndroid Build Coastguard Worker printf("inode bitmap: ");
282*6a54128fSAndroid Build Coastguard Worker dump_bitmap(test_fs->inode_map, 1, test_fs->super->s_inodes_count);
283*6a54128fSAndroid Build Coastguard Worker }
284*6a54128fSAndroid Build Coastguard Worker
dump_block_bitmap_cmd(int argc,char ** argv,int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))285*6a54128fSAndroid Build Coastguard Worker void dump_block_bitmap_cmd(int argc, char **argv,
286*6a54128fSAndroid Build Coastguard Worker int sci_idx EXT2FS_ATTR((unused)),
287*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
288*6a54128fSAndroid Build Coastguard Worker {
289*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
290*6a54128fSAndroid Build Coastguard Worker return;
291*6a54128fSAndroid Build Coastguard Worker
292*6a54128fSAndroid Build Coastguard Worker printf("block bitmap: ");
293*6a54128fSAndroid Build Coastguard Worker dump_bitmap(test_fs->block_map, test_fs->super->s_first_data_block,
294*6a54128fSAndroid Build Coastguard Worker test_fs->super->s_blocks_count);
295*6a54128fSAndroid Build Coastguard Worker }
296*6a54128fSAndroid Build Coastguard Worker
do_setb(int argc,char * argv[],int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))297*6a54128fSAndroid Build Coastguard Worker void do_setb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
298*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
299*6a54128fSAndroid Build Coastguard Worker {
300*6a54128fSAndroid Build Coastguard Worker unsigned int block, num;
301*6a54128fSAndroid Build Coastguard Worker int err;
302*6a54128fSAndroid Build Coastguard Worker int test_result, op_result;
303*6a54128fSAndroid Build Coastguard Worker
304*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
305*6a54128fSAndroid Build Coastguard Worker return;
306*6a54128fSAndroid Build Coastguard Worker
307*6a54128fSAndroid Build Coastguard Worker if (argc != 2 && argc != 3) {
308*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "Usage: setb <block> [num]");
309*6a54128fSAndroid Build Coastguard Worker return;
310*6a54128fSAndroid Build Coastguard Worker }
311*6a54128fSAndroid Build Coastguard Worker
312*6a54128fSAndroid Build Coastguard Worker block = parse_ulong(argv[1], argv[0], "block", &err);
313*6a54128fSAndroid Build Coastguard Worker if (err)
314*6a54128fSAndroid Build Coastguard Worker return;
315*6a54128fSAndroid Build Coastguard Worker
316*6a54128fSAndroid Build Coastguard Worker if (argc == 3) {
317*6a54128fSAndroid Build Coastguard Worker num = parse_ulong(argv[2], argv[0], "num", &err);
318*6a54128fSAndroid Build Coastguard Worker if (err)
319*6a54128fSAndroid Build Coastguard Worker return;
320*6a54128fSAndroid Build Coastguard Worker
321*6a54128fSAndroid Build Coastguard Worker ext2fs_mark_block_bitmap_range2(test_fs->block_map,
322*6a54128fSAndroid Build Coastguard Worker block, num);
323*6a54128fSAndroid Build Coastguard Worker printf("Marking blocks %u to %u\n", block, block + num - 1);
324*6a54128fSAndroid Build Coastguard Worker return;
325*6a54128fSAndroid Build Coastguard Worker }
326*6a54128fSAndroid Build Coastguard Worker
327*6a54128fSAndroid Build Coastguard Worker test_result = ext2fs_test_block_bitmap2(test_fs->block_map, block);
328*6a54128fSAndroid Build Coastguard Worker op_result = ext2fs_mark_block_bitmap2(test_fs->block_map, block);
329*6a54128fSAndroid Build Coastguard Worker printf("Setting block %u, was %s before\n", block, op_result ?
330*6a54128fSAndroid Build Coastguard Worker "set" : "clear");
331*6a54128fSAndroid Build Coastguard Worker if (!test_result != !op_result)
332*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "*ERROR* test_result different! (%d, %d)",
333*6a54128fSAndroid Build Coastguard Worker test_result, op_result);
334*6a54128fSAndroid Build Coastguard Worker }
335*6a54128fSAndroid Build Coastguard Worker
do_clearb(int argc,char * argv[],int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))336*6a54128fSAndroid Build Coastguard Worker void do_clearb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
337*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
338*6a54128fSAndroid Build Coastguard Worker {
339*6a54128fSAndroid Build Coastguard Worker unsigned int block, num;
340*6a54128fSAndroid Build Coastguard Worker int err;
341*6a54128fSAndroid Build Coastguard Worker int test_result, op_result;
342*6a54128fSAndroid Build Coastguard Worker
343*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
344*6a54128fSAndroid Build Coastguard Worker return;
345*6a54128fSAndroid Build Coastguard Worker
346*6a54128fSAndroid Build Coastguard Worker if (argc != 2 && argc != 3) {
347*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "Usage: clearb <block> [num]");
348*6a54128fSAndroid Build Coastguard Worker return;
349*6a54128fSAndroid Build Coastguard Worker }
350*6a54128fSAndroid Build Coastguard Worker
351*6a54128fSAndroid Build Coastguard Worker block = parse_ulong(argv[1], argv[0], "block", &err);
352*6a54128fSAndroid Build Coastguard Worker if (err)
353*6a54128fSAndroid Build Coastguard Worker return;
354*6a54128fSAndroid Build Coastguard Worker
355*6a54128fSAndroid Build Coastguard Worker if (argc == 3) {
356*6a54128fSAndroid Build Coastguard Worker num = parse_ulong(argv[2], argv[0], "num", &err);
357*6a54128fSAndroid Build Coastguard Worker if (err)
358*6a54128fSAndroid Build Coastguard Worker return;
359*6a54128fSAndroid Build Coastguard Worker
360*6a54128fSAndroid Build Coastguard Worker ext2fs_unmark_block_bitmap_range2(test_fs->block_map,
361*6a54128fSAndroid Build Coastguard Worker block, num);
362*6a54128fSAndroid Build Coastguard Worker printf("Clearing blocks %u to %u\n", block, block + num - 1);
363*6a54128fSAndroid Build Coastguard Worker return;
364*6a54128fSAndroid Build Coastguard Worker }
365*6a54128fSAndroid Build Coastguard Worker
366*6a54128fSAndroid Build Coastguard Worker test_result = ext2fs_test_block_bitmap2(test_fs->block_map, block);
367*6a54128fSAndroid Build Coastguard Worker op_result = ext2fs_unmark_block_bitmap2(test_fs->block_map, block);
368*6a54128fSAndroid Build Coastguard Worker printf("Clearing block %u, was %s before\n", block, op_result ?
369*6a54128fSAndroid Build Coastguard Worker "set" : "clear");
370*6a54128fSAndroid Build Coastguard Worker if (!test_result != !op_result)
371*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "*ERROR* test_result different! (%d, %d)",
372*6a54128fSAndroid Build Coastguard Worker test_result, op_result);
373*6a54128fSAndroid Build Coastguard Worker }
374*6a54128fSAndroid Build Coastguard Worker
do_testb(int argc,char * argv[],int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))375*6a54128fSAndroid Build Coastguard Worker void do_testb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
376*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
377*6a54128fSAndroid Build Coastguard Worker {
378*6a54128fSAndroid Build Coastguard Worker unsigned int block, num;
379*6a54128fSAndroid Build Coastguard Worker int err;
380*6a54128fSAndroid Build Coastguard Worker int test_result;
381*6a54128fSAndroid Build Coastguard Worker
382*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
383*6a54128fSAndroid Build Coastguard Worker return;
384*6a54128fSAndroid Build Coastguard Worker
385*6a54128fSAndroid Build Coastguard Worker if (argc != 2 && argc != 3) {
386*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "Usage: testb <block> [num]");
387*6a54128fSAndroid Build Coastguard Worker return;
388*6a54128fSAndroid Build Coastguard Worker }
389*6a54128fSAndroid Build Coastguard Worker
390*6a54128fSAndroid Build Coastguard Worker block = parse_ulong(argv[1], argv[0], "block", &err);
391*6a54128fSAndroid Build Coastguard Worker if (err)
392*6a54128fSAndroid Build Coastguard Worker return;
393*6a54128fSAndroid Build Coastguard Worker
394*6a54128fSAndroid Build Coastguard Worker if (argc == 3) {
395*6a54128fSAndroid Build Coastguard Worker num = parse_ulong(argv[2], argv[0], "num", &err);
396*6a54128fSAndroid Build Coastguard Worker if (err)
397*6a54128fSAndroid Build Coastguard Worker return;
398*6a54128fSAndroid Build Coastguard Worker
399*6a54128fSAndroid Build Coastguard Worker test_result =
400*6a54128fSAndroid Build Coastguard Worker ext2fs_test_block_bitmap_range2(test_fs->block_map,
401*6a54128fSAndroid Build Coastguard Worker block, num);
402*6a54128fSAndroid Build Coastguard Worker printf("Blocks %u to %u are %sall clear.\n",
403*6a54128fSAndroid Build Coastguard Worker block, block + num - 1, test_result ? "" : "NOT ");
404*6a54128fSAndroid Build Coastguard Worker return;
405*6a54128fSAndroid Build Coastguard Worker }
406*6a54128fSAndroid Build Coastguard Worker
407*6a54128fSAndroid Build Coastguard Worker test_result = ext2fs_test_block_bitmap2(test_fs->block_map, block);
408*6a54128fSAndroid Build Coastguard Worker printf("Block %u is %s\n", block, test_result ? "set" : "clear");
409*6a54128fSAndroid Build Coastguard Worker }
410*6a54128fSAndroid Build Coastguard Worker
do_ffzb(int argc,char * argv[],int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))411*6a54128fSAndroid Build Coastguard Worker void do_ffzb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
412*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
413*6a54128fSAndroid Build Coastguard Worker {
414*6a54128fSAndroid Build Coastguard Worker unsigned int start, end;
415*6a54128fSAndroid Build Coastguard Worker int err;
416*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
417*6a54128fSAndroid Build Coastguard Worker blk64_t out;
418*6a54128fSAndroid Build Coastguard Worker
419*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
420*6a54128fSAndroid Build Coastguard Worker return;
421*6a54128fSAndroid Build Coastguard Worker
422*6a54128fSAndroid Build Coastguard Worker if (argc != 3 && argc != 3) {
423*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "Usage: ffzb <start> <end>");
424*6a54128fSAndroid Build Coastguard Worker return;
425*6a54128fSAndroid Build Coastguard Worker }
426*6a54128fSAndroid Build Coastguard Worker
427*6a54128fSAndroid Build Coastguard Worker start = parse_ulong(argv[1], argv[0], "start", &err);
428*6a54128fSAndroid Build Coastguard Worker if (err)
429*6a54128fSAndroid Build Coastguard Worker return;
430*6a54128fSAndroid Build Coastguard Worker
431*6a54128fSAndroid Build Coastguard Worker end = parse_ulong(argv[2], argv[0], "end", &err);
432*6a54128fSAndroid Build Coastguard Worker if (err)
433*6a54128fSAndroid Build Coastguard Worker return;
434*6a54128fSAndroid Build Coastguard Worker
435*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_find_first_zero_block_bitmap2(test_fs->block_map,
436*6a54128fSAndroid Build Coastguard Worker start, end, &out);
437*6a54128fSAndroid Build Coastguard Worker if (retval) {
438*6a54128fSAndroid Build Coastguard Worker printf("ext2fs_find_first_zero_block_bitmap2() returned %s\n",
439*6a54128fSAndroid Build Coastguard Worker error_message(retval));
440*6a54128fSAndroid Build Coastguard Worker return;
441*6a54128fSAndroid Build Coastguard Worker }
442*6a54128fSAndroid Build Coastguard Worker printf("First unmarked block is %llu\n", (unsigned long long) out);
443*6a54128fSAndroid Build Coastguard Worker }
444*6a54128fSAndroid Build Coastguard Worker
do_ffsb(int argc,char * argv[],int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))445*6a54128fSAndroid Build Coastguard Worker void do_ffsb(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
446*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
447*6a54128fSAndroid Build Coastguard Worker {
448*6a54128fSAndroid Build Coastguard Worker unsigned int start, end;
449*6a54128fSAndroid Build Coastguard Worker int err;
450*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
451*6a54128fSAndroid Build Coastguard Worker blk64_t out;
452*6a54128fSAndroid Build Coastguard Worker
453*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
454*6a54128fSAndroid Build Coastguard Worker return;
455*6a54128fSAndroid Build Coastguard Worker
456*6a54128fSAndroid Build Coastguard Worker if (argc != 3 && argc != 3) {
457*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "Usage: ffsb <start> <end>");
458*6a54128fSAndroid Build Coastguard Worker return;
459*6a54128fSAndroid Build Coastguard Worker }
460*6a54128fSAndroid Build Coastguard Worker
461*6a54128fSAndroid Build Coastguard Worker start = parse_ulong(argv[1], argv[0], "start", &err);
462*6a54128fSAndroid Build Coastguard Worker if (err)
463*6a54128fSAndroid Build Coastguard Worker return;
464*6a54128fSAndroid Build Coastguard Worker
465*6a54128fSAndroid Build Coastguard Worker end = parse_ulong(argv[2], argv[0], "end", &err);
466*6a54128fSAndroid Build Coastguard Worker if (err)
467*6a54128fSAndroid Build Coastguard Worker return;
468*6a54128fSAndroid Build Coastguard Worker
469*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_find_first_set_block_bitmap2(test_fs->block_map,
470*6a54128fSAndroid Build Coastguard Worker start, end, &out);
471*6a54128fSAndroid Build Coastguard Worker if (retval) {
472*6a54128fSAndroid Build Coastguard Worker printf("ext2fs_find_first_set_block_bitmap2() returned %s\n",
473*6a54128fSAndroid Build Coastguard Worker error_message(retval));
474*6a54128fSAndroid Build Coastguard Worker return;
475*6a54128fSAndroid Build Coastguard Worker }
476*6a54128fSAndroid Build Coastguard Worker printf("First marked block is %llu\n", (unsigned long long) out);
477*6a54128fSAndroid Build Coastguard Worker }
478*6a54128fSAndroid Build Coastguard Worker
479*6a54128fSAndroid Build Coastguard Worker
do_zerob(int argc,char * argv[],int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))480*6a54128fSAndroid Build Coastguard Worker void do_zerob(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
481*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
482*6a54128fSAndroid Build Coastguard Worker {
483*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
484*6a54128fSAndroid Build Coastguard Worker return;
485*6a54128fSAndroid Build Coastguard Worker
486*6a54128fSAndroid Build Coastguard Worker printf("Clearing block bitmap.\n");
487*6a54128fSAndroid Build Coastguard Worker ext2fs_clear_block_bitmap(test_fs->block_map);
488*6a54128fSAndroid Build Coastguard Worker }
489*6a54128fSAndroid Build Coastguard Worker
do_seti(int argc,char * argv[],int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))490*6a54128fSAndroid Build Coastguard Worker void do_seti(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
491*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
492*6a54128fSAndroid Build Coastguard Worker {
493*6a54128fSAndroid Build Coastguard Worker unsigned int inode;
494*6a54128fSAndroid Build Coastguard Worker int err;
495*6a54128fSAndroid Build Coastguard Worker int test_result, op_result;
496*6a54128fSAndroid Build Coastguard Worker
497*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
498*6a54128fSAndroid Build Coastguard Worker return;
499*6a54128fSAndroid Build Coastguard Worker
500*6a54128fSAndroid Build Coastguard Worker if (argc != 2) {
501*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "Usage: seti <inode>");
502*6a54128fSAndroid Build Coastguard Worker return;
503*6a54128fSAndroid Build Coastguard Worker }
504*6a54128fSAndroid Build Coastguard Worker
505*6a54128fSAndroid Build Coastguard Worker inode = parse_ulong(argv[1], argv[0], "inode", &err);
506*6a54128fSAndroid Build Coastguard Worker if (err)
507*6a54128fSAndroid Build Coastguard Worker return;
508*6a54128fSAndroid Build Coastguard Worker
509*6a54128fSAndroid Build Coastguard Worker test_result = ext2fs_test_inode_bitmap2(test_fs->inode_map, inode);
510*6a54128fSAndroid Build Coastguard Worker op_result = ext2fs_mark_inode_bitmap2(test_fs->inode_map, inode);
511*6a54128fSAndroid Build Coastguard Worker printf("Setting inode %u, was %s before\n", inode, op_result ?
512*6a54128fSAndroid Build Coastguard Worker "set" : "clear");
513*6a54128fSAndroid Build Coastguard Worker if (!test_result != !op_result) {
514*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "*ERROR* test_result different! (%d, %d)",
515*6a54128fSAndroid Build Coastguard Worker test_result, op_result);
516*6a54128fSAndroid Build Coastguard Worker exit_status++;
517*6a54128fSAndroid Build Coastguard Worker }
518*6a54128fSAndroid Build Coastguard Worker }
519*6a54128fSAndroid Build Coastguard Worker
do_cleari(int argc,char * argv[],int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))520*6a54128fSAndroid Build Coastguard Worker void do_cleari(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
521*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
522*6a54128fSAndroid Build Coastguard Worker {
523*6a54128fSAndroid Build Coastguard Worker unsigned int inode;
524*6a54128fSAndroid Build Coastguard Worker int err;
525*6a54128fSAndroid Build Coastguard Worker int test_result, op_result;
526*6a54128fSAndroid Build Coastguard Worker
527*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
528*6a54128fSAndroid Build Coastguard Worker return;
529*6a54128fSAndroid Build Coastguard Worker
530*6a54128fSAndroid Build Coastguard Worker if (argc != 2) {
531*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "Usage: clearb <inode>");
532*6a54128fSAndroid Build Coastguard Worker return;
533*6a54128fSAndroid Build Coastguard Worker }
534*6a54128fSAndroid Build Coastguard Worker
535*6a54128fSAndroid Build Coastguard Worker inode = parse_ulong(argv[1], argv[0], "inode", &err);
536*6a54128fSAndroid Build Coastguard Worker if (err)
537*6a54128fSAndroid Build Coastguard Worker return;
538*6a54128fSAndroid Build Coastguard Worker
539*6a54128fSAndroid Build Coastguard Worker test_result = ext2fs_test_inode_bitmap2(test_fs->inode_map, inode);
540*6a54128fSAndroid Build Coastguard Worker op_result = ext2fs_unmark_inode_bitmap2(test_fs->inode_map, inode);
541*6a54128fSAndroid Build Coastguard Worker printf("Clearing inode %u, was %s before\n", inode, op_result ?
542*6a54128fSAndroid Build Coastguard Worker "set" : "clear");
543*6a54128fSAndroid Build Coastguard Worker if (!test_result != !op_result) {
544*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "*ERROR* test_result different! (%d, %d)",
545*6a54128fSAndroid Build Coastguard Worker test_result, op_result);
546*6a54128fSAndroid Build Coastguard Worker exit_status++;
547*6a54128fSAndroid Build Coastguard Worker }
548*6a54128fSAndroid Build Coastguard Worker }
549*6a54128fSAndroid Build Coastguard Worker
do_testi(int argc,char * argv[],int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))550*6a54128fSAndroid Build Coastguard Worker void do_testi(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
551*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
552*6a54128fSAndroid Build Coastguard Worker {
553*6a54128fSAndroid Build Coastguard Worker unsigned int inode;
554*6a54128fSAndroid Build Coastguard Worker int err;
555*6a54128fSAndroid Build Coastguard Worker int test_result;
556*6a54128fSAndroid Build Coastguard Worker
557*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
558*6a54128fSAndroid Build Coastguard Worker return;
559*6a54128fSAndroid Build Coastguard Worker
560*6a54128fSAndroid Build Coastguard Worker if (argc != 2) {
561*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "Usage: testb <inode>");
562*6a54128fSAndroid Build Coastguard Worker return;
563*6a54128fSAndroid Build Coastguard Worker }
564*6a54128fSAndroid Build Coastguard Worker
565*6a54128fSAndroid Build Coastguard Worker inode = parse_ulong(argv[1], argv[0], "inode", &err);
566*6a54128fSAndroid Build Coastguard Worker if (err)
567*6a54128fSAndroid Build Coastguard Worker return;
568*6a54128fSAndroid Build Coastguard Worker
569*6a54128fSAndroid Build Coastguard Worker test_result = ext2fs_test_inode_bitmap2(test_fs->inode_map, inode);
570*6a54128fSAndroid Build Coastguard Worker printf("Inode %u is %s\n", inode, test_result ? "set" : "clear");
571*6a54128fSAndroid Build Coastguard Worker }
572*6a54128fSAndroid Build Coastguard Worker
do_ffzi(int argc,char * argv[],int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))573*6a54128fSAndroid Build Coastguard Worker void do_ffzi(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
574*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
575*6a54128fSAndroid Build Coastguard Worker {
576*6a54128fSAndroid Build Coastguard Worker unsigned int start, end;
577*6a54128fSAndroid Build Coastguard Worker int err;
578*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
579*6a54128fSAndroid Build Coastguard Worker ext2_ino_t out;
580*6a54128fSAndroid Build Coastguard Worker
581*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
582*6a54128fSAndroid Build Coastguard Worker return;
583*6a54128fSAndroid Build Coastguard Worker
584*6a54128fSAndroid Build Coastguard Worker if (argc != 3 && argc != 3) {
585*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "Usage: ffzi <start> <end>");
586*6a54128fSAndroid Build Coastguard Worker return;
587*6a54128fSAndroid Build Coastguard Worker }
588*6a54128fSAndroid Build Coastguard Worker
589*6a54128fSAndroid Build Coastguard Worker start = parse_ulong(argv[1], argv[0], "start", &err);
590*6a54128fSAndroid Build Coastguard Worker if (err)
591*6a54128fSAndroid Build Coastguard Worker return;
592*6a54128fSAndroid Build Coastguard Worker
593*6a54128fSAndroid Build Coastguard Worker end = parse_ulong(argv[2], argv[0], "end", &err);
594*6a54128fSAndroid Build Coastguard Worker if (err)
595*6a54128fSAndroid Build Coastguard Worker return;
596*6a54128fSAndroid Build Coastguard Worker
597*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_find_first_zero_inode_bitmap2(test_fs->inode_map,
598*6a54128fSAndroid Build Coastguard Worker start, end, &out);
599*6a54128fSAndroid Build Coastguard Worker if (retval) {
600*6a54128fSAndroid Build Coastguard Worker printf("ext2fs_find_first_zero_inode_bitmap2() returned %s\n",
601*6a54128fSAndroid Build Coastguard Worker error_message(retval));
602*6a54128fSAndroid Build Coastguard Worker return;
603*6a54128fSAndroid Build Coastguard Worker }
604*6a54128fSAndroid Build Coastguard Worker printf("First unmarked inode is %u\n", out);
605*6a54128fSAndroid Build Coastguard Worker }
606*6a54128fSAndroid Build Coastguard Worker
do_ffsi(int argc,char * argv[],int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))607*6a54128fSAndroid Build Coastguard Worker void do_ffsi(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
608*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
609*6a54128fSAndroid Build Coastguard Worker {
610*6a54128fSAndroid Build Coastguard Worker unsigned int start, end;
611*6a54128fSAndroid Build Coastguard Worker int err;
612*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
613*6a54128fSAndroid Build Coastguard Worker ext2_ino_t out;
614*6a54128fSAndroid Build Coastguard Worker
615*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
616*6a54128fSAndroid Build Coastguard Worker return;
617*6a54128fSAndroid Build Coastguard Worker
618*6a54128fSAndroid Build Coastguard Worker if (argc != 3 && argc != 3) {
619*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "Usage: ffsi <start> <end>");
620*6a54128fSAndroid Build Coastguard Worker return;
621*6a54128fSAndroid Build Coastguard Worker }
622*6a54128fSAndroid Build Coastguard Worker
623*6a54128fSAndroid Build Coastguard Worker start = parse_ulong(argv[1], argv[0], "start", &err);
624*6a54128fSAndroid Build Coastguard Worker if (err)
625*6a54128fSAndroid Build Coastguard Worker return;
626*6a54128fSAndroid Build Coastguard Worker
627*6a54128fSAndroid Build Coastguard Worker end = parse_ulong(argv[2], argv[0], "end", &err);
628*6a54128fSAndroid Build Coastguard Worker if (err)
629*6a54128fSAndroid Build Coastguard Worker return;
630*6a54128fSAndroid Build Coastguard Worker
631*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_find_first_set_inode_bitmap2(test_fs->inode_map,
632*6a54128fSAndroid Build Coastguard Worker start, end, &out);
633*6a54128fSAndroid Build Coastguard Worker if (retval) {
634*6a54128fSAndroid Build Coastguard Worker printf("ext2fs_find_first_set_inode_bitmap2() returned %s\n",
635*6a54128fSAndroid Build Coastguard Worker error_message(retval));
636*6a54128fSAndroid Build Coastguard Worker return;
637*6a54128fSAndroid Build Coastguard Worker }
638*6a54128fSAndroid Build Coastguard Worker printf("First marked inode is %u\n", out);
639*6a54128fSAndroid Build Coastguard Worker }
640*6a54128fSAndroid Build Coastguard Worker
do_zeroi(int argc,char * argv[],int sci_idx EXT2FS_ATTR ((unused)),void * infop EXT2FS_ATTR ((unused)))641*6a54128fSAndroid Build Coastguard Worker void do_zeroi(int argc, char *argv[], int sci_idx EXT2FS_ATTR((unused)),
642*6a54128fSAndroid Build Coastguard Worker void *infop EXT2FS_ATTR((unused)))
643*6a54128fSAndroid Build Coastguard Worker {
644*6a54128fSAndroid Build Coastguard Worker if (check_fs_open(argv[0]))
645*6a54128fSAndroid Build Coastguard Worker return;
646*6a54128fSAndroid Build Coastguard Worker
647*6a54128fSAndroid Build Coastguard Worker printf("Clearing inode bitmap.\n");
648*6a54128fSAndroid Build Coastguard Worker ext2fs_clear_inode_bitmap(test_fs->inode_map);
649*6a54128fSAndroid Build Coastguard Worker }
650*6a54128fSAndroid Build Coastguard Worker
main(int argc,char ** argv)651*6a54128fSAndroid Build Coastguard Worker int main(int argc, char **argv)
652*6a54128fSAndroid Build Coastguard Worker {
653*6a54128fSAndroid Build Coastguard Worker unsigned int blocks = 128;
654*6a54128fSAndroid Build Coastguard Worker unsigned int inodes = 0;
655*6a54128fSAndroid Build Coastguard Worker unsigned int type = EXT2FS_BMAP64_BITARRAY;
656*6a54128fSAndroid Build Coastguard Worker int c, err, code;
657*6a54128fSAndroid Build Coastguard Worker char *request = (char *)NULL;
658*6a54128fSAndroid Build Coastguard Worker char *cmd_file = 0;
659*6a54128fSAndroid Build Coastguard Worker int sci_idx;
660*6a54128fSAndroid Build Coastguard Worker int flags = EXT2_FLAG_64BITS;
661*6a54128fSAndroid Build Coastguard Worker
662*6a54128fSAndroid Build Coastguard Worker add_error_table(&et_ss_error_table);
663*6a54128fSAndroid Build Coastguard Worker add_error_table(&et_ext2_error_table);
664*6a54128fSAndroid Build Coastguard Worker while ((c = getopt (argc, argv, "b:i:lt:R:f:")) != EOF) {
665*6a54128fSAndroid Build Coastguard Worker switch (c) {
666*6a54128fSAndroid Build Coastguard Worker case 'b':
667*6a54128fSAndroid Build Coastguard Worker blocks = parse_ulong(optarg, argv[0],
668*6a54128fSAndroid Build Coastguard Worker "number of blocks", &err);
669*6a54128fSAndroid Build Coastguard Worker if (err)
670*6a54128fSAndroid Build Coastguard Worker exit(1);
671*6a54128fSAndroid Build Coastguard Worker break;
672*6a54128fSAndroid Build Coastguard Worker case 'i':
673*6a54128fSAndroid Build Coastguard Worker inodes = parse_ulong(optarg, argv[0],
674*6a54128fSAndroid Build Coastguard Worker "number of blocks", &err);
675*6a54128fSAndroid Build Coastguard Worker if (err)
676*6a54128fSAndroid Build Coastguard Worker exit(1);
677*6a54128fSAndroid Build Coastguard Worker break;
678*6a54128fSAndroid Build Coastguard Worker case 'l': /* Legacy bitmaps */
679*6a54128fSAndroid Build Coastguard Worker flags = 0;
680*6a54128fSAndroid Build Coastguard Worker break;
681*6a54128fSAndroid Build Coastguard Worker case 't':
682*6a54128fSAndroid Build Coastguard Worker type = parse_ulong(optarg, argv[0],
683*6a54128fSAndroid Build Coastguard Worker "bitmap backend type", &err);
684*6a54128fSAndroid Build Coastguard Worker if (err)
685*6a54128fSAndroid Build Coastguard Worker exit(1);
686*6a54128fSAndroid Build Coastguard Worker break;
687*6a54128fSAndroid Build Coastguard Worker case 'R':
688*6a54128fSAndroid Build Coastguard Worker request = optarg;
689*6a54128fSAndroid Build Coastguard Worker break;
690*6a54128fSAndroid Build Coastguard Worker case 'f':
691*6a54128fSAndroid Build Coastguard Worker cmd_file = optarg;
692*6a54128fSAndroid Build Coastguard Worker break;
693*6a54128fSAndroid Build Coastguard Worker default:
694*6a54128fSAndroid Build Coastguard Worker com_err(argv[0], 0, "Usage: %s [-R request] "
695*6a54128fSAndroid Build Coastguard Worker "[-f cmd_file]", subsystem_name);
696*6a54128fSAndroid Build Coastguard Worker exit(1);
697*6a54128fSAndroid Build Coastguard Worker }
698*6a54128fSAndroid Build Coastguard Worker }
699*6a54128fSAndroid Build Coastguard Worker
700*6a54128fSAndroid Build Coastguard Worker sci_idx = ss_create_invocation(subsystem_name, version,
701*6a54128fSAndroid Build Coastguard Worker (char *)NULL, &tst_bitmaps_cmds, &code);
702*6a54128fSAndroid Build Coastguard Worker if (code) {
703*6a54128fSAndroid Build Coastguard Worker ss_perror(sci_idx, code, "creating invocation");
704*6a54128fSAndroid Build Coastguard Worker exit(1);
705*6a54128fSAndroid Build Coastguard Worker }
706*6a54128fSAndroid Build Coastguard Worker
707*6a54128fSAndroid Build Coastguard Worker (void) ss_add_request_table (sci_idx, &ss_std_requests, 1, &code);
708*6a54128fSAndroid Build Coastguard Worker if (code) {
709*6a54128fSAndroid Build Coastguard Worker ss_perror(sci_idx, code, "adding standard requests");
710*6a54128fSAndroid Build Coastguard Worker exit (1);
711*6a54128fSAndroid Build Coastguard Worker }
712*6a54128fSAndroid Build Coastguard Worker
713*6a54128fSAndroid Build Coastguard Worker printf("%s %s. Type '?' for a list of commands.\n\n",
714*6a54128fSAndroid Build Coastguard Worker subsystem_name, version);
715*6a54128fSAndroid Build Coastguard Worker
716*6a54128fSAndroid Build Coastguard Worker setup_filesystem(argv[0], blocks, inodes, type, flags);
717*6a54128fSAndroid Build Coastguard Worker
718*6a54128fSAndroid Build Coastguard Worker if (request) {
719*6a54128fSAndroid Build Coastguard Worker code = ss_execute_line(sci_idx, request);
720*6a54128fSAndroid Build Coastguard Worker if (code) {
721*6a54128fSAndroid Build Coastguard Worker ss_perror(sci_idx, code, request);
722*6a54128fSAndroid Build Coastguard Worker exit_status++;
723*6a54128fSAndroid Build Coastguard Worker }
724*6a54128fSAndroid Build Coastguard Worker } else if (cmd_file) {
725*6a54128fSAndroid Build Coastguard Worker exit_status = source_file(cmd_file, sci_idx);
726*6a54128fSAndroid Build Coastguard Worker } else {
727*6a54128fSAndroid Build Coastguard Worker ss_listen(sci_idx);
728*6a54128fSAndroid Build Coastguard Worker }
729*6a54128fSAndroid Build Coastguard Worker
730*6a54128fSAndroid Build Coastguard Worker exit(exit_status);
731*6a54128fSAndroid Build Coastguard Worker }
732*6a54128fSAndroid Build Coastguard Worker
733