annotate ffstools/tiffs-rd/xtr.c @ 418:a9bf3e92a30c

tfc139: clean exit on success
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Tue, 17 Jun 2014 20:59:59 +0000
parents 66a6f1652909
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
248
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
1 /*
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
2 * This C module implements the xtr command.
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
3 */
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
4
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
5 #include <sys/types.h>
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
6 #include <sys/file.h>
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
7 #include <stdio.h>
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
8 #include <stdlib.h>
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
9 #include <string.h>
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
10 #include <strings.h>
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
11 #include <unistd.h>
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
12 #include "types.h"
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
13 #include "struct.h"
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
14 #include "globals.h"
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
15 #include "pathname.h"
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
16
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
17 static void
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
18 dump_head_chunk(fd, headino)
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
19 {
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
20 struct inode_info *inf = inode_info[headino];
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
21 struct chunkinfo chi;
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
22
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
23 if (size_head_chunk(inf, &chi))
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
24 write(fd, chi.start, chi.len);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
25 }
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
26
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
27 static void
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
28 dump_extra_chunk(inf, opaque)
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
29 struct inode_info *inf;
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
30 u_long opaque;
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
31 {
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
32 int fd = (int)opaque;
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
33 struct chunkinfo chi;
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
34
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
35 size_extra_chunk(inf, &chi);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
36 write(fd, chi.start, chi.len);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
37 }
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
38
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
39 extract_file(relpath, headino)
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
40 char *relpath;
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
41 {
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
42 int fd;
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
43
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
44 fd = open(relpath, O_WRONLY|O_CREAT|O_TRUNC, 0666);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
45 if (fd < 0) {
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
46 perror(relpath);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
47 exit(1);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
48 }
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
49 dump_head_chunk(fd, headino);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
50 iterate_seg_file(headino, dump_extra_chunk, (u_long)fd, 0, 0);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
51 close(fd);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
52 }
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
53
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
54 void
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
55 xtr_tree_callback(pathname, ino, depth)
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
56 char *pathname;
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
57 {
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
58 struct inode_info *inf = inode_info[ino];
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
59
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
60 switch (inf->type) {
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
61 case 0xE1:
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
62 case 0xF1:
249
66a6f1652909 tiffs xtr: skip /.journal
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents: 248
diff changeset
63 /* skip /.journal; those who need it can cat it */
66a6f1652909 tiffs xtr: skip /.journal
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents: 248
diff changeset
64 if (strcmp(pathname, "/.journal"))
66a6f1652909 tiffs xtr: skip /.journal
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents: 248
diff changeset
65 extract_file(pathname + 1, ino);
248
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
66 return;
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
67 case 0xE2:
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
68 case 0xF2:
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
69 if (mkdir(pathname + 1, 0777) < 0) {
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
70 perror(pathname + 1);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
71 exit(1);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
72 }
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
73 return;
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
74 case 0xE3:
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
75 case 0xF3:
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
76 fprintf(stderr,
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
77 "symlink at %s ignored: symlink extraction not implemented yet\n",
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
78 pathname);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
79 return;
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
80 default:
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
81 fprintf(stderr,
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
82 "BUG: bad inode byte %02X reached xtr_tree_callback()\n",
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
83 inf->type);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
84 exit(1);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
85 }
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
86 }
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
87
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
88 cmd_xtr(argc, argv)
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
89 char **argv;
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
90 {
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
91 if (argc != 2) {
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
92 fprintf(stderr, "usage: xtr dest-dir\n");
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
93 exit(1);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
94 }
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
95 read_ffs_image();
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
96 find_inode_block();
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
97 alloc_inode_table();
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
98 find_root_inode();
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
99 if (chdir(argv[1]) < 0) {
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
100 perror(argv[1]);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
101 exit(1);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
102 }
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
103 traverse_visible_tree(xtr_tree_callback);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
104 exit(0);
10afa4d39a7b tiffs xtr implemented
Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
parents:
diff changeset
105 }