comparison ffstools/tiffs-rd/tree.c @ 233:ae9ff2d1e3da

tiffs IVA: basic ls integrated
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 26 Jan 2014 10:54:42 +0000
parents
children 024042383a26
comparison
equal deleted inserted replaced
232:73372cfdaf7f 233:ae9ff2d1e3da
1 /*
2 * This C module implements operations on the tree level.
3 */
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <strings.h>
9 #include "types.h"
10 #include "struct.h"
11 #include "globals.h"
12 #include "pathname.h"
13
14 static void
15 visible_walk_dir(pathbuf_start, pathbuf_ptr, dirino, depth, callback)
16 char *pathbuf_start, *pathbuf_ptr;
17 void (*callback)();
18 {
19 int ndepth = depth + 1;
20 int child;
21 struct inode_info *inf;
22
23 if (depth > MAX_DIR_NEST) {
24 fprintf(stderr,
25 "error: max dir nesting exceeded at inode #%x\n",
26 dirino);
27 return;
28 }
29 for (child = inode_info[dirino]->descend; child; child = inf->sibling) {
30 if (!validate_inode(child)) {
31 fprintf(stderr,
32 "error: walk of visible tree hit invalid inode #%x\n",
33 child);
34 return;
35 }
36 inf = inode_info[child];
37 switch (inf->type) {
38 case 0x00:
39 /* walking the *visible* tree: skip deleted objects */
40 continue;
41 case 0xF4:
42 fprintf(stderr,
43 "warning: directory #%x has child #%x of type segment (F4), skipping\n",
44 dirino, child);
45 continue;
46 }
47 if (!validate_obj_name(child, 0)) {
48 fprintf(stderr,
49 "visible tree walk error: no valid name for inode #%x\n",
50 child);
51 continue;
52 }
53 sprintf(pathbuf_ptr, "/%s", inf->dataptr);
54 callback(pathbuf_start, child, ndepth);
55 if (inf->type == 0xF2)
56 visible_walk_dir(pathbuf_start,
57 index(pathbuf_ptr, '\0'), child,
58 ndepth, callback);
59 }
60 }
61
62 traverse_visible_tree(callback)
63 void (*callback)();
64 {
65 char pathbuf[PATHNAME_BUF_SIZE];
66
67 visible_walk_dir(pathbuf, pathbuf, root_inode, 0, callback);
68 }