annotate pirollback/catino.c @ 51:e516128db432

pirollback: resurrect file descendant chains
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Wed, 24 Jul 2013 21:52:09 +0000
parents 18fa570685de
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
49
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
1 #include <stdio.h>
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
2 #include <stdlib.h>
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
3 #include <string.h>
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
4 #include <strings.h>
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
5 #include "types.h"
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
6 #include "struct.h"
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
7
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
8 extern char *imgfile;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
9 extern struct inode_info inode[];
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
10 extern int last_inode;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
11 extern int journal_start_ino;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
12
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
13 u8 *
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
14 find_end_of_chunk(ino)
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
15 {
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
16 struct inode_info *ch = inode + ino;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
17 u8 *p;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
18 int i;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
19
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
20 p = ch->dataptr + ch->len;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
21 for (i = 1; i <= 16; i++) {
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
22 if (!p[-i])
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
23 return(p - i);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
24 if (p[-1] != 0xFF)
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
25 break;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
26 }
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
27 fprintf(stderr,
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
28 "chunk starting at %x (inode #%x): no valid termination found\n",
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
29 ch->offset, ino);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
30 exit(1);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
31 }
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
32
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
33 dump_cont_chain(start)
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
34 {
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
35 int ino;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
36 struct inode_info *inf;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
37 u8 *endp;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
38
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
39 for (ino = start; ino; ino = inf->descend) {
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
40 inf = inode + ino;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
41 if (inf->type != 0xF4) {
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
42 fprintf(stderr,
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
43 "continuation chunk #%x does not have type F4\n",
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
44 ino);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
45 exit(1);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
46 }
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
47 endp = find_end_of_chunk(ino);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
48 write(1, inf->dataptr, endp - inf->dataptr);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
49 }
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
50 }
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
51
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
52 do_cat(ino)
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
53 {
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
54 struct inode_info *inf = inode + ino;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
55 u8 *endp;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
56
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
57 if (inf->type != 0xF1) {
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
58 fprintf(stderr, "error: requested inode is not a file\n");
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
59 exit(1);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
60 }
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
61 endp = find_end_of_chunk(ino);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
62 if (endp > inf->byte_after_name)
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
63 write(1, inf->byte_after_name, endp - inf->byte_after_name);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
64 dump_cont_chain(inf->descend);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
65 }
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
66
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
67 main(argc, argv)
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
68 char **argv;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
69 {
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
70 int ino;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
71 char *strtoul_endp;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
72
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
73 if (argc != 3) {
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
74 usage: fprintf(stderr, "usage: %s ffs-image inode\n", argv[0]);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
75 exit(1);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
76 }
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
77 imgfile = argv[1];
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
78 ino = strtoul(argv[2], &strtoul_endp, 16);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
79 if (!argv[2][0] || *strtoul_endp)
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
80 goto usage;
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
81 read_img_file();
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
82 read_inodes();
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
83 walk_tree();
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
84 check_object_names();
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
85 parse_journal();
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
86 check_object_names(); /* rerun for "undeleted" objects */
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
87 if (ino < 1 || ino > last_inode) {
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
88 fprintf(stderr, "%s: bad inode number specified\n", argv[0]);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
89 exit(1);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
90 }
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
91 do_cat(ino);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
92 exit(0);
18fa570685de pirollback: catino implemented, works
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
93 }