xref: /aosp_15_r20/external/e2fsprogs/tests/progs/test_rel.c (revision 6a54128f25917bfc36a8a6e9d722c04a0b4641b6)
1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker  * test_rel.c
3*6a54128fSAndroid Build Coastguard Worker  *
4*6a54128fSAndroid Build Coastguard Worker  * Copyright (C) 1997 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 Public
8*6a54128fSAndroid Build Coastguard Worker  * License.
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 <stdio.h>
14*6a54128fSAndroid Build Coastguard Worker #include <stdlib.h>
15*6a54128fSAndroid Build Coastguard Worker #include <string.h>
16*6a54128fSAndroid Build Coastguard Worker #include <unistd.h>
17*6a54128fSAndroid Build Coastguard Worker #ifdef HAVE_GETOPT_H
18*6a54128fSAndroid Build Coastguard Worker #include <getopt.h>
19*6a54128fSAndroid Build Coastguard Worker #endif
20*6a54128fSAndroid Build Coastguard Worker #include <fcntl.h>
21*6a54128fSAndroid Build Coastguard Worker 
22*6a54128fSAndroid Build Coastguard Worker #include <et/com_err.h>
23*6a54128fSAndroid Build Coastguard Worker #include <ss/ss.h>
24*6a54128fSAndroid Build Coastguard Worker #include <ext2fs/ext2_fs.h>
25*6a54128fSAndroid Build Coastguard Worker #include <ext2fs/ext2fs.h>
26*6a54128fSAndroid Build Coastguard Worker #include <ext2fs/irel.h>
27*6a54128fSAndroid Build Coastguard Worker #include <ext2fs/brel.h>
28*6a54128fSAndroid Build Coastguard Worker 
29*6a54128fSAndroid Build Coastguard Worker #include "test_rel.h"
30*6a54128fSAndroid Build Coastguard Worker 
31*6a54128fSAndroid Build Coastguard Worker extern ss_request_table test_cmds;
32*6a54128fSAndroid Build Coastguard Worker 
33*6a54128fSAndroid Build Coastguard Worker ext2_irel irel = NULL;
34*6a54128fSAndroid Build Coastguard Worker ext2_brel brel = NULL;
35*6a54128fSAndroid Build Coastguard Worker 
36*6a54128fSAndroid Build Coastguard Worker /*
37*6a54128fSAndroid Build Coastguard Worker  * Helper function which parses an inode number.
38*6a54128fSAndroid Build Coastguard Worker  */
parse_inode(const char * request,const char * desc,const char * str,ext2_ino_t * ino)39*6a54128fSAndroid Build Coastguard Worker static int parse_inode(const char *request, const char *desc,
40*6a54128fSAndroid Build Coastguard Worker 		       const char *str, ext2_ino_t *ino)
41*6a54128fSAndroid Build Coastguard Worker {
42*6a54128fSAndroid Build Coastguard Worker 	char *tmp;
43*6a54128fSAndroid Build Coastguard Worker 
44*6a54128fSAndroid Build Coastguard Worker 	*ino = strtoul(str, &tmp, 0);
45*6a54128fSAndroid Build Coastguard Worker 	if (*tmp) {
46*6a54128fSAndroid Build Coastguard Worker 		com_err(request, 0, "Bad %s - %s", desc, str);
47*6a54128fSAndroid Build Coastguard Worker 		return 1;
48*6a54128fSAndroid Build Coastguard Worker 	}
49*6a54128fSAndroid Build Coastguard Worker 	return 0;
50*6a54128fSAndroid Build Coastguard Worker }
51*6a54128fSAndroid Build Coastguard Worker 
52*6a54128fSAndroid Build Coastguard Worker /*
53*6a54128fSAndroid Build Coastguard Worker  * Helper function which parses a block number.
54*6a54128fSAndroid Build Coastguard Worker  */
parse_block(const char * request,const char * desc,const char * str,blk_t * blk)55*6a54128fSAndroid Build Coastguard Worker static int parse_block(const char *request, const char *desc,
56*6a54128fSAndroid Build Coastguard Worker 		       const char *str, blk_t *blk)
57*6a54128fSAndroid Build Coastguard Worker {
58*6a54128fSAndroid Build Coastguard Worker 	char *tmp;
59*6a54128fSAndroid Build Coastguard Worker 
60*6a54128fSAndroid Build Coastguard Worker 	*blk = strtoul(str, &tmp, 0);
61*6a54128fSAndroid Build Coastguard Worker 	if (*tmp) {
62*6a54128fSAndroid Build Coastguard Worker 		com_err(request, 0, "Bad %s - %s", desc, str);
63*6a54128fSAndroid Build Coastguard Worker 		return 1;
64*6a54128fSAndroid Build Coastguard Worker 	}
65*6a54128fSAndroid Build Coastguard Worker 	return 0;
66*6a54128fSAndroid Build Coastguard Worker }
67*6a54128fSAndroid Build Coastguard Worker 
68*6a54128fSAndroid Build Coastguard Worker /*
69*6a54128fSAndroid Build Coastguard Worker  * Helper function which assures that a brel table is open
70*6a54128fSAndroid Build Coastguard Worker  */
check_brel(char * request)71*6a54128fSAndroid Build Coastguard Worker static int check_brel(char *request)
72*6a54128fSAndroid Build Coastguard Worker {
73*6a54128fSAndroid Build Coastguard Worker 	if (brel)
74*6a54128fSAndroid Build Coastguard Worker 		return 0;
75*6a54128fSAndroid Build Coastguard Worker 	com_err(request, 0, "A block relocation table must be open.");
76*6a54128fSAndroid Build Coastguard Worker 	return 1;
77*6a54128fSAndroid Build Coastguard Worker }
78*6a54128fSAndroid Build Coastguard Worker 
79*6a54128fSAndroid Build Coastguard Worker /*
80*6a54128fSAndroid Build Coastguard Worker  * Helper function which assures that an irel table is open
81*6a54128fSAndroid Build Coastguard Worker  */
check_irel(char * request)82*6a54128fSAndroid Build Coastguard Worker static int check_irel(char *request)
83*6a54128fSAndroid Build Coastguard Worker {
84*6a54128fSAndroid Build Coastguard Worker 	if (irel)
85*6a54128fSAndroid Build Coastguard Worker 		return 0;
86*6a54128fSAndroid Build Coastguard Worker 	com_err(request, 0, "An inode relocation table must be open.");
87*6a54128fSAndroid Build Coastguard Worker 	return 1;
88*6a54128fSAndroid Build Coastguard Worker }
89*6a54128fSAndroid Build Coastguard Worker 
90*6a54128fSAndroid Build Coastguard Worker /*
91*6a54128fSAndroid Build Coastguard Worker  * Helper function which displays a brel entry
92*6a54128fSAndroid Build Coastguard Worker  */
display_brel_entry(blk_t old,struct ext2_block_relocate_entry * ent)93*6a54128fSAndroid Build Coastguard Worker static void display_brel_entry(blk_t old,
94*6a54128fSAndroid Build Coastguard Worker 			       struct ext2_block_relocate_entry *ent)
95*6a54128fSAndroid Build Coastguard Worker {
96*6a54128fSAndroid Build Coastguard Worker 	printf("Old= %u, New= %u, Owner= %u:%u\n", old, ent->new,
97*6a54128fSAndroid Build Coastguard Worker 	       ent->owner.block_ref, ent->offset);
98*6a54128fSAndroid Build Coastguard Worker }
99*6a54128fSAndroid Build Coastguard Worker 
100*6a54128fSAndroid Build Coastguard Worker /*
101*6a54128fSAndroid Build Coastguard Worker  * Helper function which displays an irel entry
102*6a54128fSAndroid Build Coastguard Worker  */
display_irel_entry(ext2_ino_t old,struct ext2_inode_relocate_entry * ent,int do_refs)103*6a54128fSAndroid Build Coastguard Worker static void display_irel_entry(ext2_ino_t old,
104*6a54128fSAndroid Build Coastguard Worker 			       struct ext2_inode_relocate_entry *ent,
105*6a54128fSAndroid Build Coastguard Worker 			       int do_refs)
106*6a54128fSAndroid Build Coastguard Worker {
107*6a54128fSAndroid Build Coastguard Worker 	struct ext2_inode_reference ref;
108*6a54128fSAndroid Build Coastguard Worker 	errcode_t	retval;
109*6a54128fSAndroid Build Coastguard Worker 	int		first = 1;
110*6a54128fSAndroid Build Coastguard Worker 
111*6a54128fSAndroid Build Coastguard Worker 	printf("Old= %lu, New= %lu, Original=%lu, Max_refs=%u\n", old,
112*6a54128fSAndroid Build Coastguard Worker 	       ent->new, ent->orig, ent->max_refs);
113*6a54128fSAndroid Build Coastguard Worker 	if (!do_refs)
114*6a54128fSAndroid Build Coastguard Worker 		return;
115*6a54128fSAndroid Build Coastguard Worker 
116*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_start_iter_ref(irel, old);
117*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
118*6a54128fSAndroid Build Coastguard Worker 		printf("\tCouldn't get references: %s\n",
119*6a54128fSAndroid Build Coastguard Worker 		       error_message(retval));
120*6a54128fSAndroid Build Coastguard Worker 		return;
121*6a54128fSAndroid Build Coastguard Worker 	}
122*6a54128fSAndroid Build Coastguard Worker 	while (1) {
123*6a54128fSAndroid Build Coastguard Worker 		retval = ext2fs_irel_next_ref(irel, &ref);
124*6a54128fSAndroid Build Coastguard Worker 		if (retval) {
125*6a54128fSAndroid Build Coastguard Worker 			printf("(%s) ", error_message(retval));
126*6a54128fSAndroid Build Coastguard Worker 			break;
127*6a54128fSAndroid Build Coastguard Worker 		}
128*6a54128fSAndroid Build Coastguard Worker 		if (ref.block == 0)
129*6a54128fSAndroid Build Coastguard Worker 			break;
130*6a54128fSAndroid Build Coastguard Worker 		if (first) {
131*6a54128fSAndroid Build Coastguard Worker 			fputc('\t', stdout);
132*6a54128fSAndroid Build Coastguard Worker 			first = 0;
133*6a54128fSAndroid Build Coastguard Worker 		} else
134*6a54128fSAndroid Build Coastguard Worker 			printf(", ");
135*6a54128fSAndroid Build Coastguard Worker 		printf("%u:%u", ref.block, ref.offset);
136*6a54128fSAndroid Build Coastguard Worker 	}
137*6a54128fSAndroid Build Coastguard Worker 	if (!first)
138*6a54128fSAndroid Build Coastguard Worker 		fputc('\n', stdout);
139*6a54128fSAndroid Build Coastguard Worker }
140*6a54128fSAndroid Build Coastguard Worker 
141*6a54128fSAndroid Build Coastguard Worker /*
142*6a54128fSAndroid Build Coastguard Worker  * These are the actual command table procedures
143*6a54128fSAndroid Build Coastguard Worker  */
do_brel_ma_create(int argc,char ** argv)144*6a54128fSAndroid Build Coastguard Worker void do_brel_ma_create(int argc, char **argv)
145*6a54128fSAndroid Build Coastguard Worker {
146*6a54128fSAndroid Build Coastguard Worker 	const char *usage = "Usage: %s name max_blocks\n";
147*6a54128fSAndroid Build Coastguard Worker 	errcode_t	retval;
148*6a54128fSAndroid Build Coastguard Worker 	blk_t		max_blk;
149*6a54128fSAndroid Build Coastguard Worker 
150*6a54128fSAndroid Build Coastguard Worker 	if (argc < 3) {
151*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
152*6a54128fSAndroid Build Coastguard Worker 		return;
153*6a54128fSAndroid Build Coastguard Worker 	}
154*6a54128fSAndroid Build Coastguard Worker 	if (parse_block(argv[0], "max_blocks", argv[2], &max_blk))
155*6a54128fSAndroid Build Coastguard Worker 		return;
156*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_brel_memarray_create(argv[1], max_blk, &brel);
157*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
158*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while opening memarray brel");
159*6a54128fSAndroid Build Coastguard Worker 		return;
160*6a54128fSAndroid Build Coastguard Worker 	}
161*6a54128fSAndroid Build Coastguard Worker 	return;
162*6a54128fSAndroid Build Coastguard Worker }
163*6a54128fSAndroid Build Coastguard Worker 
do_brel_free(int argc,char ** argv)164*6a54128fSAndroid Build Coastguard Worker void do_brel_free(int argc, char **argv)
165*6a54128fSAndroid Build Coastguard Worker {
166*6a54128fSAndroid Build Coastguard Worker 	if (check_brel(argv[0]))
167*6a54128fSAndroid Build Coastguard Worker 		return;
168*6a54128fSAndroid Build Coastguard Worker 	ext2fs_brel_free(brel);
169*6a54128fSAndroid Build Coastguard Worker 	brel = NULL;
170*6a54128fSAndroid Build Coastguard Worker 	return;
171*6a54128fSAndroid Build Coastguard Worker }
172*6a54128fSAndroid Build Coastguard Worker 
do_brel_put(int argc,char ** argv)173*6a54128fSAndroid Build Coastguard Worker void do_brel_put(int argc, char **argv)
174*6a54128fSAndroid Build Coastguard Worker {
175*6a54128fSAndroid Build Coastguard Worker 	const char *usage = "usage: %s old_block new_block [owner] [offset]";
176*6a54128fSAndroid Build Coastguard Worker 	errcode_t retval;
177*6a54128fSAndroid Build Coastguard Worker 	struct ext2_block_relocate_entry ent;
178*6a54128fSAndroid Build Coastguard Worker 	blk_t	old, new, offset=0, owner=0;
179*6a54128fSAndroid Build Coastguard Worker 
180*6a54128fSAndroid Build Coastguard Worker 	if (check_brel(argv[0]))
181*6a54128fSAndroid Build Coastguard Worker 		return;
182*6a54128fSAndroid Build Coastguard Worker 
183*6a54128fSAndroid Build Coastguard Worker 	if (argc < 3) {
184*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
185*6a54128fSAndroid Build Coastguard Worker 		return;
186*6a54128fSAndroid Build Coastguard Worker 	}
187*6a54128fSAndroid Build Coastguard Worker 	if (parse_block(argv[0], "old block", argv[1], &old))
188*6a54128fSAndroid Build Coastguard Worker 		return;
189*6a54128fSAndroid Build Coastguard Worker 	if (parse_block(argv[0], "new block", argv[2], &new))
190*6a54128fSAndroid Build Coastguard Worker 		return;
191*6a54128fSAndroid Build Coastguard Worker 	if (argc > 3 &&
192*6a54128fSAndroid Build Coastguard Worker 	    parse_block(argv[0], "owner block", argv[3], &owner))
193*6a54128fSAndroid Build Coastguard Worker 		return;
194*6a54128fSAndroid Build Coastguard Worker 	if (argc > 4 &&
195*6a54128fSAndroid Build Coastguard Worker 	    parse_block(argv[0], "offset", argv[4], &offset))
196*6a54128fSAndroid Build Coastguard Worker 		return;
197*6a54128fSAndroid Build Coastguard Worker 	if (offset > 65535) {
198*6a54128fSAndroid Build Coastguard Worker 		printf("Offset too large.\n");
199*6a54128fSAndroid Build Coastguard Worker 		return;
200*6a54128fSAndroid Build Coastguard Worker 	}
201*6a54128fSAndroid Build Coastguard Worker 	ent.new = new;
202*6a54128fSAndroid Build Coastguard Worker 	ent.offset = (__u16) offset;
203*6a54128fSAndroid Build Coastguard Worker 	ent.flags = 0;
204*6a54128fSAndroid Build Coastguard Worker 	ent.owner.block_ref = owner;
205*6a54128fSAndroid Build Coastguard Worker 
206*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_brel_put(brel, old, &ent);
207*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
208*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_brel_put");
209*6a54128fSAndroid Build Coastguard Worker 		return;
210*6a54128fSAndroid Build Coastguard Worker 	}
211*6a54128fSAndroid Build Coastguard Worker 	return;
212*6a54128fSAndroid Build Coastguard Worker }
213*6a54128fSAndroid Build Coastguard Worker 
do_brel_get(int argc,char ** argv)214*6a54128fSAndroid Build Coastguard Worker void do_brel_get(int argc, char **argv)
215*6a54128fSAndroid Build Coastguard Worker {
216*6a54128fSAndroid Build Coastguard Worker 	const char *usage = "%s block";
217*6a54128fSAndroid Build Coastguard Worker 	errcode_t retval;
218*6a54128fSAndroid Build Coastguard Worker 	struct ext2_block_relocate_entry ent;
219*6a54128fSAndroid Build Coastguard Worker 	blk_t	blk;
220*6a54128fSAndroid Build Coastguard Worker 
221*6a54128fSAndroid Build Coastguard Worker 	if (check_brel(argv[0]))
222*6a54128fSAndroid Build Coastguard Worker 		return;
223*6a54128fSAndroid Build Coastguard Worker 	if (argc < 2) {
224*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
225*6a54128fSAndroid Build Coastguard Worker 		return;
226*6a54128fSAndroid Build Coastguard Worker 	}
227*6a54128fSAndroid Build Coastguard Worker 	if (parse_block(argv[0], "block", argv[1], &blk))
228*6a54128fSAndroid Build Coastguard Worker 		return;
229*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_brel_get(brel, blk, &ent);
230*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
231*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_brel_get");
232*6a54128fSAndroid Build Coastguard Worker 		return;
233*6a54128fSAndroid Build Coastguard Worker 	}
234*6a54128fSAndroid Build Coastguard Worker 	display_brel_entry(blk, &ent);
235*6a54128fSAndroid Build Coastguard Worker 	return;
236*6a54128fSAndroid Build Coastguard Worker }
237*6a54128fSAndroid Build Coastguard Worker 
do_brel_start_iter(int argc,char ** argv)238*6a54128fSAndroid Build Coastguard Worker void do_brel_start_iter(int argc, char **argv)
239*6a54128fSAndroid Build Coastguard Worker {
240*6a54128fSAndroid Build Coastguard Worker 	errcode_t retval;
241*6a54128fSAndroid Build Coastguard Worker 
242*6a54128fSAndroid Build Coastguard Worker 	if (check_brel(argv[0]))
243*6a54128fSAndroid Build Coastguard Worker 		return;
244*6a54128fSAndroid Build Coastguard Worker 
245*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_brel_start_iter(brel);
246*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
247*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_brel_start_iter");
248*6a54128fSAndroid Build Coastguard Worker 		return;
249*6a54128fSAndroid Build Coastguard Worker 	}
250*6a54128fSAndroid Build Coastguard Worker 	return;
251*6a54128fSAndroid Build Coastguard Worker }
252*6a54128fSAndroid Build Coastguard Worker 
do_brel_next(int argc,char ** argv)253*6a54128fSAndroid Build Coastguard Worker void do_brel_next(int argc, char **argv)
254*6a54128fSAndroid Build Coastguard Worker {
255*6a54128fSAndroid Build Coastguard Worker 	errcode_t retval;
256*6a54128fSAndroid Build Coastguard Worker 	struct ext2_block_relocate_entry ent;
257*6a54128fSAndroid Build Coastguard Worker 	blk_t	blk;
258*6a54128fSAndroid Build Coastguard Worker 
259*6a54128fSAndroid Build Coastguard Worker 	if (check_brel(argv[0]))
260*6a54128fSAndroid Build Coastguard Worker 		return;
261*6a54128fSAndroid Build Coastguard Worker 
262*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_brel_next(brel, &blk, &ent);
263*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
264*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_brel_next");
265*6a54128fSAndroid Build Coastguard Worker 		return;
266*6a54128fSAndroid Build Coastguard Worker 	}
267*6a54128fSAndroid Build Coastguard Worker 	if (blk == 0) {
268*6a54128fSAndroid Build Coastguard Worker 		printf("No more entries!\n");
269*6a54128fSAndroid Build Coastguard Worker 		return;
270*6a54128fSAndroid Build Coastguard Worker 	}
271*6a54128fSAndroid Build Coastguard Worker 	display_brel_entry(blk, &ent);
272*6a54128fSAndroid Build Coastguard Worker 	return;
273*6a54128fSAndroid Build Coastguard Worker }
274*6a54128fSAndroid Build Coastguard Worker 
do_brel_dump(int argc,char ** argv)275*6a54128fSAndroid Build Coastguard Worker void do_brel_dump(int argc, char **argv)
276*6a54128fSAndroid Build Coastguard Worker {
277*6a54128fSAndroid Build Coastguard Worker 	errcode_t retval;
278*6a54128fSAndroid Build Coastguard Worker 	struct ext2_block_relocate_entry ent;
279*6a54128fSAndroid Build Coastguard Worker 	blk_t	blk;
280*6a54128fSAndroid Build Coastguard Worker 
281*6a54128fSAndroid Build Coastguard Worker 	if (check_brel(argv[0]))
282*6a54128fSAndroid Build Coastguard Worker 		return;
283*6a54128fSAndroid Build Coastguard Worker 
284*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_brel_start_iter(brel);
285*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
286*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_brel_start_iter");
287*6a54128fSAndroid Build Coastguard Worker 		return;
288*6a54128fSAndroid Build Coastguard Worker 	}
289*6a54128fSAndroid Build Coastguard Worker 
290*6a54128fSAndroid Build Coastguard Worker 	while (1) {
291*6a54128fSAndroid Build Coastguard Worker 		retval = ext2fs_brel_next(brel, &blk, &ent);
292*6a54128fSAndroid Build Coastguard Worker 		if (retval) {
293*6a54128fSAndroid Build Coastguard Worker 			com_err(argv[0], retval, "while calling ext2fs_brel_next");
294*6a54128fSAndroid Build Coastguard Worker 			return;
295*6a54128fSAndroid Build Coastguard Worker 		}
296*6a54128fSAndroid Build Coastguard Worker 		if (blk == 0)
297*6a54128fSAndroid Build Coastguard Worker 			break;
298*6a54128fSAndroid Build Coastguard Worker 
299*6a54128fSAndroid Build Coastguard Worker 		display_brel_entry(blk, &ent);
300*6a54128fSAndroid Build Coastguard Worker 	}
301*6a54128fSAndroid Build Coastguard Worker 	return;
302*6a54128fSAndroid Build Coastguard Worker }
303*6a54128fSAndroid Build Coastguard Worker 
do_brel_move(int argc,char ** argv)304*6a54128fSAndroid Build Coastguard Worker void do_brel_move(int argc, char **argv)
305*6a54128fSAndroid Build Coastguard Worker {
306*6a54128fSAndroid Build Coastguard Worker 	const char *usage = "%s old_block new_block";
307*6a54128fSAndroid Build Coastguard Worker 	errcode_t retval;
308*6a54128fSAndroid Build Coastguard Worker 	blk_t	old, new;
309*6a54128fSAndroid Build Coastguard Worker 
310*6a54128fSAndroid Build Coastguard Worker 	if (check_brel(argv[0]))
311*6a54128fSAndroid Build Coastguard Worker 		return;
312*6a54128fSAndroid Build Coastguard Worker 	if (argc < 2) {
313*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
314*6a54128fSAndroid Build Coastguard Worker 		return;
315*6a54128fSAndroid Build Coastguard Worker 	}
316*6a54128fSAndroid Build Coastguard Worker 	if (parse_block(argv[0], "old block", argv[1], &old))
317*6a54128fSAndroid Build Coastguard Worker 		return;
318*6a54128fSAndroid Build Coastguard Worker 	if (parse_block(argv[0], "new block", argv[2], &new))
319*6a54128fSAndroid Build Coastguard Worker 		return;
320*6a54128fSAndroid Build Coastguard Worker 
321*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_brel_move(brel, old, new);
322*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
323*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_brel_move");
324*6a54128fSAndroid Build Coastguard Worker 		return;
325*6a54128fSAndroid Build Coastguard Worker 	}
326*6a54128fSAndroid Build Coastguard Worker 	return;
327*6a54128fSAndroid Build Coastguard Worker }
328*6a54128fSAndroid Build Coastguard Worker 
do_brel_delete(int argc,char ** argv)329*6a54128fSAndroid Build Coastguard Worker void do_brel_delete(int argc, char **argv)
330*6a54128fSAndroid Build Coastguard Worker {
331*6a54128fSAndroid Build Coastguard Worker 	const char *usage = "%s block";
332*6a54128fSAndroid Build Coastguard Worker 	errcode_t retval;
333*6a54128fSAndroid Build Coastguard Worker 	blk_t	blk;
334*6a54128fSAndroid Build Coastguard Worker 
335*6a54128fSAndroid Build Coastguard Worker 	if (check_brel(argv[0]))
336*6a54128fSAndroid Build Coastguard Worker 		return;
337*6a54128fSAndroid Build Coastguard Worker 	if (argc < 2) {
338*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
339*6a54128fSAndroid Build Coastguard Worker 		return;
340*6a54128fSAndroid Build Coastguard Worker 	}
341*6a54128fSAndroid Build Coastguard Worker 	if (parse_block(argv[0], "block", argv[1], &blk))
342*6a54128fSAndroid Build Coastguard Worker 		return;
343*6a54128fSAndroid Build Coastguard Worker 
344*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_brel_delete(brel, blk);
345*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
346*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_brel_delete");
347*6a54128fSAndroid Build Coastguard Worker 		return;
348*6a54128fSAndroid Build Coastguard Worker 	}
349*6a54128fSAndroid Build Coastguard Worker }
350*6a54128fSAndroid Build Coastguard Worker 
do_irel_ma_create(int argc,char ** argv)351*6a54128fSAndroid Build Coastguard Worker void do_irel_ma_create(int argc, char **argv)
352*6a54128fSAndroid Build Coastguard Worker {
353*6a54128fSAndroid Build Coastguard Worker 	const char	*usage = "Usage: %s name max_inode\n";
354*6a54128fSAndroid Build Coastguard Worker 	errcode_t	retval;
355*6a54128fSAndroid Build Coastguard Worker 	ext2_ino_t	max_ino;
356*6a54128fSAndroid Build Coastguard Worker 
357*6a54128fSAndroid Build Coastguard Worker 	if (argc < 3) {
358*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
359*6a54128fSAndroid Build Coastguard Worker 		return;
360*6a54128fSAndroid Build Coastguard Worker 	}
361*6a54128fSAndroid Build Coastguard Worker 	if (parse_inode(argv[0], "max_inodes", argv[2], &max_ino))
362*6a54128fSAndroid Build Coastguard Worker 		return;
363*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_memarray_create(argv[1], max_ino, &irel);
364*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
365*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while opening memarray irel");
366*6a54128fSAndroid Build Coastguard Worker 		return;
367*6a54128fSAndroid Build Coastguard Worker 	}
368*6a54128fSAndroid Build Coastguard Worker 	return;
369*6a54128fSAndroid Build Coastguard Worker }
370*6a54128fSAndroid Build Coastguard Worker 
do_irel_free(int argc,char ** argv)371*6a54128fSAndroid Build Coastguard Worker void do_irel_free(int argc, char **argv)
372*6a54128fSAndroid Build Coastguard Worker {
373*6a54128fSAndroid Build Coastguard Worker 	if (check_irel(argv[0]))
374*6a54128fSAndroid Build Coastguard Worker 		return;
375*6a54128fSAndroid Build Coastguard Worker 
376*6a54128fSAndroid Build Coastguard Worker 	ext2fs_irel_free(irel);
377*6a54128fSAndroid Build Coastguard Worker 	irel = NULL;
378*6a54128fSAndroid Build Coastguard Worker 	return;
379*6a54128fSAndroid Build Coastguard Worker }
380*6a54128fSAndroid Build Coastguard Worker 
do_irel_put(int argc,char ** argv)381*6a54128fSAndroid Build Coastguard Worker void do_irel_put(int argc, char **argv)
382*6a54128fSAndroid Build Coastguard Worker {
383*6a54128fSAndroid Build Coastguard Worker 	const char	*usage = "%s old new max_refs";
384*6a54128fSAndroid Build Coastguard Worker 	errcode_t	retval;
385*6a54128fSAndroid Build Coastguard Worker 	ext2_ino_t	old, new, max_refs;
386*6a54128fSAndroid Build Coastguard Worker 	struct ext2_inode_relocate_entry ent;
387*6a54128fSAndroid Build Coastguard Worker 
388*6a54128fSAndroid Build Coastguard Worker 	if (check_irel(argv[0]))
389*6a54128fSAndroid Build Coastguard Worker 		return;
390*6a54128fSAndroid Build Coastguard Worker 
391*6a54128fSAndroid Build Coastguard Worker 	if (argc < 4) {
392*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
393*6a54128fSAndroid Build Coastguard Worker 		return;
394*6a54128fSAndroid Build Coastguard Worker 	}
395*6a54128fSAndroid Build Coastguard Worker 	if (parse_inode(argv[0], "old inode", argv[1], &old))
396*6a54128fSAndroid Build Coastguard Worker 		return;
397*6a54128fSAndroid Build Coastguard Worker 	if (parse_inode(argv[0], "new inode", argv[2], &new))
398*6a54128fSAndroid Build Coastguard Worker 		return;
399*6a54128fSAndroid Build Coastguard Worker 	if (parse_inode(argv[0], "max_refs", argv[3], &max_refs))
400*6a54128fSAndroid Build Coastguard Worker 		return;
401*6a54128fSAndroid Build Coastguard Worker 	if (max_refs > 65535) {
402*6a54128fSAndroid Build Coastguard Worker 		printf("max_refs too big\n");
403*6a54128fSAndroid Build Coastguard Worker 		return;
404*6a54128fSAndroid Build Coastguard Worker 	}
405*6a54128fSAndroid Build Coastguard Worker 	ent.new = new;
406*6a54128fSAndroid Build Coastguard Worker 	ent.max_refs = (__u16) max_refs;
407*6a54128fSAndroid Build Coastguard Worker 	ent.flags = 0;
408*6a54128fSAndroid Build Coastguard Worker 
409*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_put(irel, old, &ent);
410*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
411*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_irel_put");
412*6a54128fSAndroid Build Coastguard Worker 		return;
413*6a54128fSAndroid Build Coastguard Worker 	}
414*6a54128fSAndroid Build Coastguard Worker 	return;
415*6a54128fSAndroid Build Coastguard Worker }
416*6a54128fSAndroid Build Coastguard Worker 
do_irel_get(int argc,char ** argv)417*6a54128fSAndroid Build Coastguard Worker void do_irel_get(int argc, char **argv)
418*6a54128fSAndroid Build Coastguard Worker {
419*6a54128fSAndroid Build Coastguard Worker 	const char	*usage = "%s inode";
420*6a54128fSAndroid Build Coastguard Worker 	errcode_t	retval;
421*6a54128fSAndroid Build Coastguard Worker 	ext2_ino_t	old;
422*6a54128fSAndroid Build Coastguard Worker 	struct ext2_inode_relocate_entry ent;
423*6a54128fSAndroid Build Coastguard Worker 
424*6a54128fSAndroid Build Coastguard Worker 	if (check_irel(argv[0]))
425*6a54128fSAndroid Build Coastguard Worker 		return;
426*6a54128fSAndroid Build Coastguard Worker 
427*6a54128fSAndroid Build Coastguard Worker 	if (argc < 2) {
428*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
429*6a54128fSAndroid Build Coastguard Worker 		return;
430*6a54128fSAndroid Build Coastguard Worker 	}
431*6a54128fSAndroid Build Coastguard Worker 	if (parse_inode(argv[0], "inode", argv[1], &old))
432*6a54128fSAndroid Build Coastguard Worker 		return;
433*6a54128fSAndroid Build Coastguard Worker 
434*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_get(irel, old, &ent);
435*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
436*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_irel_get");
437*6a54128fSAndroid Build Coastguard Worker 		return;
438*6a54128fSAndroid Build Coastguard Worker 	}
439*6a54128fSAndroid Build Coastguard Worker 	display_irel_entry(old, &ent, 1);
440*6a54128fSAndroid Build Coastguard Worker 	return;
441*6a54128fSAndroid Build Coastguard Worker }
442*6a54128fSAndroid Build Coastguard Worker 
do_irel_get_by_orig(int argc,char ** argv)443*6a54128fSAndroid Build Coastguard Worker void do_irel_get_by_orig(int argc, char **argv)
444*6a54128fSAndroid Build Coastguard Worker {
445*6a54128fSAndroid Build Coastguard Worker 	const char	*usage = "%s orig_inode";
446*6a54128fSAndroid Build Coastguard Worker 	errcode_t	retval;
447*6a54128fSAndroid Build Coastguard Worker 	ext2_ino_t	orig, old;
448*6a54128fSAndroid Build Coastguard Worker 	struct ext2_inode_relocate_entry ent;
449*6a54128fSAndroid Build Coastguard Worker 
450*6a54128fSAndroid Build Coastguard Worker 	if (check_irel(argv[0]))
451*6a54128fSAndroid Build Coastguard Worker 		return;
452*6a54128fSAndroid Build Coastguard Worker 
453*6a54128fSAndroid Build Coastguard Worker 	if (argc < 2) {
454*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
455*6a54128fSAndroid Build Coastguard Worker 		return;
456*6a54128fSAndroid Build Coastguard Worker 	}
457*6a54128fSAndroid Build Coastguard Worker 	if (parse_inode(argv[0], "original inode", argv[1], &orig))
458*6a54128fSAndroid Build Coastguard Worker 		return;
459*6a54128fSAndroid Build Coastguard Worker 
460*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_get_by_orig(irel, orig, &old, &ent);
461*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
462*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_irel_get_by_orig");
463*6a54128fSAndroid Build Coastguard Worker 		return;
464*6a54128fSAndroid Build Coastguard Worker 	}
465*6a54128fSAndroid Build Coastguard Worker 	display_irel_entry(old, &ent, 1);
466*6a54128fSAndroid Build Coastguard Worker 	return;
467*6a54128fSAndroid Build Coastguard Worker }
468*6a54128fSAndroid Build Coastguard Worker 
do_irel_start_iter(int argc,char ** argv)469*6a54128fSAndroid Build Coastguard Worker void do_irel_start_iter(int argc, char **argv)
470*6a54128fSAndroid Build Coastguard Worker {
471*6a54128fSAndroid Build Coastguard Worker 	errcode_t retval;
472*6a54128fSAndroid Build Coastguard Worker 
473*6a54128fSAndroid Build Coastguard Worker 	if (check_irel(argv[0]))
474*6a54128fSAndroid Build Coastguard Worker 		return;
475*6a54128fSAndroid Build Coastguard Worker 
476*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_start_iter(irel);
477*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
478*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_irel_start_iter");
479*6a54128fSAndroid Build Coastguard Worker 		return;
480*6a54128fSAndroid Build Coastguard Worker 	}
481*6a54128fSAndroid Build Coastguard Worker 	return;
482*6a54128fSAndroid Build Coastguard Worker }
483*6a54128fSAndroid Build Coastguard Worker 
do_irel_next(int argc,char ** argv)484*6a54128fSAndroid Build Coastguard Worker void do_irel_next(int argc, char **argv)
485*6a54128fSAndroid Build Coastguard Worker {
486*6a54128fSAndroid Build Coastguard Worker 	errcode_t	retval;
487*6a54128fSAndroid Build Coastguard Worker 	ext2_ino_t	old;
488*6a54128fSAndroid Build Coastguard Worker 	struct ext2_inode_relocate_entry ent;
489*6a54128fSAndroid Build Coastguard Worker 
490*6a54128fSAndroid Build Coastguard Worker 	if (check_irel(argv[0]))
491*6a54128fSAndroid Build Coastguard Worker 		return;
492*6a54128fSAndroid Build Coastguard Worker 
493*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_next(irel, &old, &ent);
494*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
495*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_irel_next");
496*6a54128fSAndroid Build Coastguard Worker 		return;
497*6a54128fSAndroid Build Coastguard Worker 	}
498*6a54128fSAndroid Build Coastguard Worker 	if (old == 0) {
499*6a54128fSAndroid Build Coastguard Worker 		printf("No more entries!\n");
500*6a54128fSAndroid Build Coastguard Worker 		return;
501*6a54128fSAndroid Build Coastguard Worker 	}
502*6a54128fSAndroid Build Coastguard Worker 	display_irel_entry(old, &ent, 1);
503*6a54128fSAndroid Build Coastguard Worker 	return;
504*6a54128fSAndroid Build Coastguard Worker }
505*6a54128fSAndroid Build Coastguard Worker 
do_irel_dump(int argc,char ** argv)506*6a54128fSAndroid Build Coastguard Worker void do_irel_dump(int argc, char **argv)
507*6a54128fSAndroid Build Coastguard Worker {
508*6a54128fSAndroid Build Coastguard Worker 	errcode_t	retval;
509*6a54128fSAndroid Build Coastguard Worker 	ext2_ino_t	ino;
510*6a54128fSAndroid Build Coastguard Worker 	struct ext2_inode_relocate_entry ent;
511*6a54128fSAndroid Build Coastguard Worker 
512*6a54128fSAndroid Build Coastguard Worker 	if (check_irel(argv[0]))
513*6a54128fSAndroid Build Coastguard Worker 		return;
514*6a54128fSAndroid Build Coastguard Worker 
515*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_start_iter(irel);
516*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
517*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_irel_start_iter");
518*6a54128fSAndroid Build Coastguard Worker 		return;
519*6a54128fSAndroid Build Coastguard Worker 	}
520*6a54128fSAndroid Build Coastguard Worker 
521*6a54128fSAndroid Build Coastguard Worker 	while (1) {
522*6a54128fSAndroid Build Coastguard Worker 		retval = ext2fs_irel_next(irel, &ino, &ent);
523*6a54128fSAndroid Build Coastguard Worker 		if (retval) {
524*6a54128fSAndroid Build Coastguard Worker 			com_err(argv[0], retval, "while calling ext2fs_irel_next");
525*6a54128fSAndroid Build Coastguard Worker 			return;
526*6a54128fSAndroid Build Coastguard Worker 		}
527*6a54128fSAndroid Build Coastguard Worker 		if (ino == 0)
528*6a54128fSAndroid Build Coastguard Worker 			break;
529*6a54128fSAndroid Build Coastguard Worker 
530*6a54128fSAndroid Build Coastguard Worker 		display_irel_entry(ino, &ent, 1);
531*6a54128fSAndroid Build Coastguard Worker 	}
532*6a54128fSAndroid Build Coastguard Worker 	return;
533*6a54128fSAndroid Build Coastguard Worker }
534*6a54128fSAndroid Build Coastguard Worker 
do_irel_add_ref(int argc,char ** argv)535*6a54128fSAndroid Build Coastguard Worker void do_irel_add_ref(int argc, char **argv)
536*6a54128fSAndroid Build Coastguard Worker {
537*6a54128fSAndroid Build Coastguard Worker 	const char	*usage = "%s inode block offset";
538*6a54128fSAndroid Build Coastguard Worker 	errcode_t	retval;
539*6a54128fSAndroid Build Coastguard Worker 	blk_t		block, offset;
540*6a54128fSAndroid Build Coastguard Worker 	ext2_ino_t	ino;
541*6a54128fSAndroid Build Coastguard Worker 	struct ext2_inode_reference ref;
542*6a54128fSAndroid Build Coastguard Worker 
543*6a54128fSAndroid Build Coastguard Worker 
544*6a54128fSAndroid Build Coastguard Worker 	if (check_irel(argv[0]))
545*6a54128fSAndroid Build Coastguard Worker 		return;
546*6a54128fSAndroid Build Coastguard Worker 
547*6a54128fSAndroid Build Coastguard Worker 	if (argc < 4) {
548*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
549*6a54128fSAndroid Build Coastguard Worker 		return;
550*6a54128fSAndroid Build Coastguard Worker 	}
551*6a54128fSAndroid Build Coastguard Worker 	if (parse_inode(argv[0], "inode", argv[1], &ino))
552*6a54128fSAndroid Build Coastguard Worker 		return;
553*6a54128fSAndroid Build Coastguard Worker 	if (parse_block(argv[0], "block", argv[2], &block))
554*6a54128fSAndroid Build Coastguard Worker 		return;
555*6a54128fSAndroid Build Coastguard Worker 	if (parse_block(argv[0], "offset", argv[3], &offset))
556*6a54128fSAndroid Build Coastguard Worker 		return;
557*6a54128fSAndroid Build Coastguard Worker 	if (offset > 65535) {
558*6a54128fSAndroid Build Coastguard Worker 		printf("Offset too big.\n");
559*6a54128fSAndroid Build Coastguard Worker 		return;
560*6a54128fSAndroid Build Coastguard Worker 	}
561*6a54128fSAndroid Build Coastguard Worker 	ref.block = block;
562*6a54128fSAndroid Build Coastguard Worker 	ref.offset = offset;
563*6a54128fSAndroid Build Coastguard Worker 
564*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_add_ref(irel, ino, &ref);
565*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
566*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_irel_add_ref");
567*6a54128fSAndroid Build Coastguard Worker 		return;
568*6a54128fSAndroid Build Coastguard Worker 	}
569*6a54128fSAndroid Build Coastguard Worker 	return;
570*6a54128fSAndroid Build Coastguard Worker }
571*6a54128fSAndroid Build Coastguard Worker 
do_irel_start_iter_ref(int argc,char ** argv)572*6a54128fSAndroid Build Coastguard Worker void do_irel_start_iter_ref(int argc, char **argv)
573*6a54128fSAndroid Build Coastguard Worker {
574*6a54128fSAndroid Build Coastguard Worker 	const char	*usage = "%s inode";
575*6a54128fSAndroid Build Coastguard Worker 	errcode_t	retval;
576*6a54128fSAndroid Build Coastguard Worker 	ext2_ino_t	ino;
577*6a54128fSAndroid Build Coastguard Worker 
578*6a54128fSAndroid Build Coastguard Worker 	if (check_irel(argv[0]))
579*6a54128fSAndroid Build Coastguard Worker 		return;
580*6a54128fSAndroid Build Coastguard Worker 
581*6a54128fSAndroid Build Coastguard Worker 	if (argc < 2) {
582*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
583*6a54128fSAndroid Build Coastguard Worker 		return;
584*6a54128fSAndroid Build Coastguard Worker 	}
585*6a54128fSAndroid Build Coastguard Worker 
586*6a54128fSAndroid Build Coastguard Worker 	if (parse_inode(argv[0], "inode", argv[1], &ino))
587*6a54128fSAndroid Build Coastguard Worker 		return;
588*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_start_iter_ref(irel, ino);
589*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
590*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_irel_start_iter_ref");
591*6a54128fSAndroid Build Coastguard Worker 		return;
592*6a54128fSAndroid Build Coastguard Worker 	}
593*6a54128fSAndroid Build Coastguard Worker 	return;
594*6a54128fSAndroid Build Coastguard Worker }
595*6a54128fSAndroid Build Coastguard Worker 
do_irel_next_ref(int argc,char ** argv)596*6a54128fSAndroid Build Coastguard Worker void do_irel_next_ref(int argc, char **argv)
597*6a54128fSAndroid Build Coastguard Worker {
598*6a54128fSAndroid Build Coastguard Worker 	struct ext2_inode_reference ref;
599*6a54128fSAndroid Build Coastguard Worker 	errcode_t retval;
600*6a54128fSAndroid Build Coastguard Worker 
601*6a54128fSAndroid Build Coastguard Worker 	if (check_irel(argv[0]))
602*6a54128fSAndroid Build Coastguard Worker 		return;
603*6a54128fSAndroid Build Coastguard Worker 
604*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_next_ref(irel, &ref);
605*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
606*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_irel_next_ref");
607*6a54128fSAndroid Build Coastguard Worker 		return;
608*6a54128fSAndroid Build Coastguard Worker 	}
609*6a54128fSAndroid Build Coastguard Worker 	printf("Inode reference: %u:%u\n", ref.block, ref.offset);
610*6a54128fSAndroid Build Coastguard Worker 	return;
611*6a54128fSAndroid Build Coastguard Worker }
612*6a54128fSAndroid Build Coastguard Worker 
do_irel_move(int argc,char ** argv)613*6a54128fSAndroid Build Coastguard Worker void do_irel_move(int argc, char **argv)
614*6a54128fSAndroid Build Coastguard Worker {
615*6a54128fSAndroid Build Coastguard Worker 	const char	*usage = "%s old new";
616*6a54128fSAndroid Build Coastguard Worker 	errcode_t	retval;
617*6a54128fSAndroid Build Coastguard Worker 	ext2_ino_t	old, new;
618*6a54128fSAndroid Build Coastguard Worker 
619*6a54128fSAndroid Build Coastguard Worker 	if (check_irel(argv[0]))
620*6a54128fSAndroid Build Coastguard Worker 		return;
621*6a54128fSAndroid Build Coastguard Worker 
622*6a54128fSAndroid Build Coastguard Worker 	if (argc < 3) {
623*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
624*6a54128fSAndroid Build Coastguard Worker 		return;
625*6a54128fSAndroid Build Coastguard Worker 	}
626*6a54128fSAndroid Build Coastguard Worker 	if (parse_inode(argv[0], "old inode", argv[1], &old))
627*6a54128fSAndroid Build Coastguard Worker 		return;
628*6a54128fSAndroid Build Coastguard Worker 	if (parse_inode(argv[0], "new inode", argv[2], &new))
629*6a54128fSAndroid Build Coastguard Worker 		return;
630*6a54128fSAndroid Build Coastguard Worker 
631*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_move(irel, old, new);
632*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
633*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_irel_move");
634*6a54128fSAndroid Build Coastguard Worker 		return;
635*6a54128fSAndroid Build Coastguard Worker 	}
636*6a54128fSAndroid Build Coastguard Worker 	return;
637*6a54128fSAndroid Build Coastguard Worker }
638*6a54128fSAndroid Build Coastguard Worker 
do_irel_delete(int argc,char ** argv)639*6a54128fSAndroid Build Coastguard Worker void do_irel_delete(int argc, char **argv)
640*6a54128fSAndroid Build Coastguard Worker {
641*6a54128fSAndroid Build Coastguard Worker 	const char	*usage = "%s inode";
642*6a54128fSAndroid Build Coastguard Worker 	errcode_t	retval;
643*6a54128fSAndroid Build Coastguard Worker 	ext2_ino_t	ino;
644*6a54128fSAndroid Build Coastguard Worker 
645*6a54128fSAndroid Build Coastguard Worker 	if (check_irel(argv[0]))
646*6a54128fSAndroid Build Coastguard Worker 		return;
647*6a54128fSAndroid Build Coastguard Worker 
648*6a54128fSAndroid Build Coastguard Worker 	if (argc < 2) {
649*6a54128fSAndroid Build Coastguard Worker 		printf(usage, argv[0]);
650*6a54128fSAndroid Build Coastguard Worker 		return;
651*6a54128fSAndroid Build Coastguard Worker 	}
652*6a54128fSAndroid Build Coastguard Worker 	if (parse_inode(argv[0], "inode", argv[1], &ino))
653*6a54128fSAndroid Build Coastguard Worker 		return;
654*6a54128fSAndroid Build Coastguard Worker 
655*6a54128fSAndroid Build Coastguard Worker 	retval = ext2fs_irel_delete(irel, ino);
656*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
657*6a54128fSAndroid Build Coastguard Worker 		com_err(argv[0], retval, "while calling ext2fs_irel_delete");
658*6a54128fSAndroid Build Coastguard Worker 		return;
659*6a54128fSAndroid Build Coastguard Worker 	}
660*6a54128fSAndroid Build Coastguard Worker 	return;
661*6a54128fSAndroid Build Coastguard Worker }
662*6a54128fSAndroid Build Coastguard Worker 
source_file(const char * cmd_file,int sci_idx)663*6a54128fSAndroid Build Coastguard Worker static int source_file(const char *cmd_file, int sci_idx)
664*6a54128fSAndroid Build Coastguard Worker {
665*6a54128fSAndroid Build Coastguard Worker 	FILE		*f;
666*6a54128fSAndroid Build Coastguard Worker 	char		buf[256];
667*6a54128fSAndroid Build Coastguard Worker 	char		*cp;
668*6a54128fSAndroid Build Coastguard Worker 	int		exit_status = 0;
669*6a54128fSAndroid Build Coastguard Worker 	int		retval;
670*6a54128fSAndroid Build Coastguard Worker 	int 		noecho;
671*6a54128fSAndroid Build Coastguard Worker 
672*6a54128fSAndroid Build Coastguard Worker 	if (strcmp(cmd_file, "-") == 0)
673*6a54128fSAndroid Build Coastguard Worker 		f = stdin;
674*6a54128fSAndroid Build Coastguard Worker 	else {
675*6a54128fSAndroid Build Coastguard Worker 		f = fopen(cmd_file, "r");
676*6a54128fSAndroid Build Coastguard Worker 		if (!f) {
677*6a54128fSAndroid Build Coastguard Worker 			perror(cmd_file);
678*6a54128fSAndroid Build Coastguard Worker 			exit(1);
679*6a54128fSAndroid Build Coastguard Worker 		}
680*6a54128fSAndroid Build Coastguard Worker 	}
681*6a54128fSAndroid Build Coastguard Worker 	fflush(stdout);
682*6a54128fSAndroid Build Coastguard Worker 	fflush(stderr);
683*6a54128fSAndroid Build Coastguard Worker 	setbuf(stdout, NULL);
684*6a54128fSAndroid Build Coastguard Worker 	setbuf(stderr, NULL);
685*6a54128fSAndroid Build Coastguard Worker 	while (!feof(f)) {
686*6a54128fSAndroid Build Coastguard Worker 		if (fgets(buf, sizeof(buf), f) == NULL)
687*6a54128fSAndroid Build Coastguard Worker 			break;
688*6a54128fSAndroid Build Coastguard Worker 		if (buf[0] == '#')
689*6a54128fSAndroid Build Coastguard Worker 			continue;
690*6a54128fSAndroid Build Coastguard Worker 		noecho = 0;
691*6a54128fSAndroid Build Coastguard Worker 		if (buf[0] == '-') {
692*6a54128fSAndroid Build Coastguard Worker 			noecho = 1;
693*6a54128fSAndroid Build Coastguard Worker 			buf[0] = ' ';
694*6a54128fSAndroid Build Coastguard Worker 		}
695*6a54128fSAndroid Build Coastguard Worker 		cp = strchr(buf, '\n');
696*6a54128fSAndroid Build Coastguard Worker 		if (cp)
697*6a54128fSAndroid Build Coastguard Worker 			*cp = 0;
698*6a54128fSAndroid Build Coastguard Worker 		cp = strchr(buf, '\r');
699*6a54128fSAndroid Build Coastguard Worker 		if (cp)
700*6a54128fSAndroid Build Coastguard Worker 			*cp = 0;
701*6a54128fSAndroid Build Coastguard Worker 		if (!noecho)
702*6a54128fSAndroid Build Coastguard Worker 			printf("test_rel: %s\n", buf);
703*6a54128fSAndroid Build Coastguard Worker 		retval = ss_execute_line(sci_idx, buf);
704*6a54128fSAndroid Build Coastguard Worker 		if (retval) {
705*6a54128fSAndroid Build Coastguard Worker 			ss_perror(sci_idx, retval, buf);
706*6a54128fSAndroid Build Coastguard Worker 			exit_status++;
707*6a54128fSAndroid Build Coastguard Worker 		}
708*6a54128fSAndroid Build Coastguard Worker 	}
709*6a54128fSAndroid Build Coastguard Worker 	return exit_status;
710*6a54128fSAndroid Build Coastguard Worker }
711*6a54128fSAndroid Build Coastguard Worker 
main(int argc,char ** argv)712*6a54128fSAndroid Build Coastguard Worker void main(int argc, char **argv)
713*6a54128fSAndroid Build Coastguard Worker {
714*6a54128fSAndroid Build Coastguard Worker 	int		retval;
715*6a54128fSAndroid Build Coastguard Worker 	int		sci_idx;
716*6a54128fSAndroid Build Coastguard Worker 	const char	*usage = "Usage: test_rel [-R request] [-f cmd_file]";
717*6a54128fSAndroid Build Coastguard Worker 	int		c;
718*6a54128fSAndroid Build Coastguard Worker 	char		*request = 0;
719*6a54128fSAndroid Build Coastguard Worker 	int		exit_status = 0;
720*6a54128fSAndroid Build Coastguard Worker 	char		*cmd_file = 0;
721*6a54128fSAndroid Build Coastguard Worker 
722*6a54128fSAndroid Build Coastguard Worker 	initialize_ext2_error_table();
723*6a54128fSAndroid Build Coastguard Worker 
724*6a54128fSAndroid Build Coastguard Worker 	while ((c = getopt (argc, argv, "wR:f:")) != EOF) {
725*6a54128fSAndroid Build Coastguard Worker 		switch (c) {
726*6a54128fSAndroid Build Coastguard Worker 		case 'R':
727*6a54128fSAndroid Build Coastguard Worker 			request = optarg;
728*6a54128fSAndroid Build Coastguard Worker 			break;
729*6a54128fSAndroid Build Coastguard Worker 		case 'f':
730*6a54128fSAndroid Build Coastguard Worker 			cmd_file = optarg;
731*6a54128fSAndroid Build Coastguard Worker 			break;
732*6a54128fSAndroid Build Coastguard Worker 		default:
733*6a54128fSAndroid Build Coastguard Worker 			com_err(argv[0], 0, usage);
734*6a54128fSAndroid Build Coastguard Worker 			return;
735*6a54128fSAndroid Build Coastguard Worker 		}
736*6a54128fSAndroid Build Coastguard Worker 	}
737*6a54128fSAndroid Build Coastguard Worker 	sci_idx = ss_create_invocation("test_rel", "0.0", (char *) NULL,
738*6a54128fSAndroid Build Coastguard Worker 				       &test_cmds, &retval);
739*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
740*6a54128fSAndroid Build Coastguard Worker 		ss_perror(sci_idx, retval, "creating invocation");
741*6a54128fSAndroid Build Coastguard Worker 		exit(1);
742*6a54128fSAndroid Build Coastguard Worker 	}
743*6a54128fSAndroid Build Coastguard Worker 
744*6a54128fSAndroid Build Coastguard Worker 	(void) ss_add_request_table (sci_idx, &ss_std_requests, 1, &retval);
745*6a54128fSAndroid Build Coastguard Worker 	if (retval) {
746*6a54128fSAndroid Build Coastguard Worker 		ss_perror(sci_idx, retval, "adding standard requests");
747*6a54128fSAndroid Build Coastguard Worker 		exit (1);
748*6a54128fSAndroid Build Coastguard Worker 	}
749*6a54128fSAndroid Build Coastguard Worker 	if (request) {
750*6a54128fSAndroid Build Coastguard Worker 		retval = 0;
751*6a54128fSAndroid Build Coastguard Worker 		retval = ss_execute_line(sci_idx, request);
752*6a54128fSAndroid Build Coastguard Worker 		if (retval) {
753*6a54128fSAndroid Build Coastguard Worker 			ss_perror(sci_idx, retval, request);
754*6a54128fSAndroid Build Coastguard Worker 			exit_status++;
755*6a54128fSAndroid Build Coastguard Worker 		}
756*6a54128fSAndroid Build Coastguard Worker 	} else if (cmd_file) {
757*6a54128fSAndroid Build Coastguard Worker 		exit_status = source_file(cmd_file, sci_idx);
758*6a54128fSAndroid Build Coastguard Worker 	} else {
759*6a54128fSAndroid Build Coastguard Worker 		ss_listen(sci_idx);
760*6a54128fSAndroid Build Coastguard Worker 	}
761*6a54128fSAndroid Build Coastguard Worker 
762*6a54128fSAndroid Build Coastguard Worker 	exit(exit_status);
763*6a54128fSAndroid Build Coastguard Worker }
764*6a54128fSAndroid Build Coastguard Worker 
765