1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46#include "libbb.h"
47#include "bb_archive.h"
48
49#define DPKG_DEB_OPT_CONTENTS 1
50#define DPKG_DEB_OPT_CONTROL 2
51#define DPKG_DEB_OPT_FIELD 4
52#define DPKG_DEB_OPT_EXTRACT 8
53#define DPKG_DEB_OPT_EXTRACT_VERBOSE 16
54
55int dpkg_deb_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
56int dpkg_deb_main(int argc, char **argv)
57{
58 archive_handle_t *ar_archive;
59 archive_handle_t *tar_archive;
60 llist_t *control_tar_llist = NULL;
61 unsigned opt;
62 const char *extract_dir;
63 int need_args;
64
65
66 tar_archive = init_handle();
67
68
69 ar_archive = init_handle();
70 ar_archive->dpkg__sub_archive = tar_archive;
71 ar_archive->filter = filter_accept_list_reassign;
72
73 llist_add_to(&ar_archive->accept, (char*)"data.tar");
74 llist_add_to(&control_tar_llist, (char*)"control.tar");
75#if ENABLE_FEATURE_SEAMLESS_GZ
76 llist_add_to(&ar_archive->accept, (char*)"data.tar.gz");
77 llist_add_to(&control_tar_llist, (char*)"control.tar.gz");
78#endif
79#if ENABLE_FEATURE_SEAMLESS_BZ2
80 llist_add_to(&ar_archive->accept, (char*)"data.tar.bz2");
81 llist_add_to(&control_tar_llist, (char*)"control.tar.bz2");
82#endif
83#if ENABLE_FEATURE_SEAMLESS_LZMA
84 llist_add_to(&ar_archive->accept, (char*)"data.tar.lzma");
85 llist_add_to(&control_tar_llist, (char*)"control.tar.lzma");
86#endif
87#if ENABLE_FEATURE_SEAMLESS_XZ
88 llist_add_to(&ar_archive->accept, (char*)"data.tar.xz");
89 llist_add_to(&control_tar_llist, (char*)"control.tar.xz");
90#endif
91
92 opt_complementary = "c--efXx:e--cfXx:f--ceXx:X--cefx:x--cefX";
93 opt = getopt32(argv, "cefXx");
94 argv += optind;
95 argc -= optind;
96
97 if (opt & DPKG_DEB_OPT_CONTENTS) {
98 tar_archive->action_header = header_verbose_list;
99 }
100 extract_dir = NULL;
101 need_args = 1;
102 if (opt & DPKG_DEB_OPT_CONTROL) {
103 ar_archive->accept = control_tar_llist;
104 tar_archive->action_data = data_extract_all;
105 if (1 == argc) {
106 extract_dir = "./DEBIAN";
107 } else {
108 need_args++;
109 }
110 }
111 if (opt & DPKG_DEB_OPT_FIELD) {
112
113
114
115 ar_archive->accept = control_tar_llist;
116 llist_add_to(&(tar_archive->accept), (char*)"./control");
117 tar_archive->filter = filter_accept_list;
118 tar_archive->action_data = data_extract_to_stdout;
119 }
120 if (opt & DPKG_DEB_OPT_EXTRACT) {
121 tar_archive->action_header = header_list;
122 }
123 if (opt & (DPKG_DEB_OPT_EXTRACT_VERBOSE | DPKG_DEB_OPT_EXTRACT)) {
124 tar_archive->action_data = data_extract_all;
125 need_args = 2;
126 }
127
128 if (need_args != argc) {
129 bb_show_usage();
130 }
131
132 tar_archive->src_fd = ar_archive->src_fd = xopen(argv[0], O_RDONLY);
133
134
135
136 if (argv[1]) {
137 extract_dir = argv[1];
138 }
139 if (extract_dir) {
140 mkdir(extract_dir, 0777);
141 xchdir(extract_dir);
142 }
143
144
145 unpack_ar_archive(ar_archive);
146
147
148 if (ENABLE_FEATURE_CLEAN_UP)
149 close(ar_archive->src_fd);
150
151 return EXIT_SUCCESS;
152}
153