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