4 |
* |
* |
5 |
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
6 |
*/ |
*/ |
7 |
#include "busybox.h" |
#include "libbb.h" |
8 |
#include "unarchive.h" |
#include "unarchive.h" |
9 |
|
|
10 |
#define DPKG_DEB_OPT_CONTENTS 1 |
#define DPKG_DEB_OPT_CONTENTS 1 |
13 |
#define DPKG_DEB_OPT_EXTRACT 8 |
#define DPKG_DEB_OPT_EXTRACT 8 |
14 |
#define DPKG_DEB_OPT_EXTRACT_VERBOSE 16 |
#define DPKG_DEB_OPT_EXTRACT_VERBOSE 16 |
15 |
|
|
16 |
|
int dpkg_deb_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
17 |
int dpkg_deb_main(int argc, char **argv) |
int dpkg_deb_main(int argc, char **argv) |
18 |
{ |
{ |
19 |
archive_handle_t *ar_archive; |
archive_handle_t *ar_archive; |
20 |
archive_handle_t *tar_archive; |
archive_handle_t *tar_archive; |
21 |
llist_t *control_tar_llist = NULL; |
llist_t *control_tar_llist = NULL; |
22 |
unsigned opt; |
unsigned opt; |
23 |
char *extract_dir = NULL; |
const char *extract_dir; |
24 |
short argcount = 1; |
int need_args; |
25 |
|
|
26 |
/* Setup the tar archive handle */ |
/* Setup the tar archive handle */ |
27 |
tar_archive = init_handle(); |
tar_archive = init_handle(); |
31 |
ar_archive->sub_archive = tar_archive; |
ar_archive->sub_archive = tar_archive; |
32 |
ar_archive->filter = filter_accept_list_reassign; |
ar_archive->filter = filter_accept_list_reassign; |
33 |
|
|
34 |
#ifdef CONFIG_FEATURE_DEB_TAR_GZ |
#if ENABLE_FEATURE_SEAMLESS_GZ |
35 |
llist_add_to(&(ar_archive->accept), "data.tar.gz"); |
llist_add_to(&(ar_archive->accept), (char*)"data.tar.gz"); |
36 |
llist_add_to(&control_tar_llist, "control.tar.gz"); |
llist_add_to(&control_tar_llist, (char*)"control.tar.gz"); |
37 |
#endif |
#endif |
38 |
|
|
39 |
#ifdef CONFIG_FEATURE_DEB_TAR_BZ2 |
#if ENABLE_FEATURE_SEAMLESS_BZ2 |
40 |
llist_add_to(&(ar_archive->accept), "data.tar.bz2"); |
llist_add_to(&(ar_archive->accept), (char*)"data.tar.bz2"); |
41 |
llist_add_to(&control_tar_llist, "control.tar.bz2"); |
llist_add_to(&control_tar_llist, (char*)"control.tar.bz2"); |
42 |
#endif |
#endif |
43 |
|
|
44 |
opt_complementary = "?c--efXx:e--cfXx:f--ceXx:X--cefx:x--cefX"; |
opt_complementary = "c--efXx:e--cfXx:f--ceXx:X--cefx:x--cefX"; |
45 |
opt = getopt32(argc, argv, "cefXx"); |
opt = getopt32(argv, "cefXx"); |
46 |
|
argv += optind; |
47 |
|
argc -= optind; |
48 |
|
|
49 |
if (opt & DPKG_DEB_OPT_CONTENTS) { |
if (opt & DPKG_DEB_OPT_CONTENTS) { |
50 |
tar_archive->action_header = header_verbose_list; |
tar_archive->action_header = header_verbose_list; |
51 |
} |
} |
52 |
|
extract_dir = NULL; |
53 |
|
need_args = 1; |
54 |
if (opt & DPKG_DEB_OPT_CONTROL) { |
if (opt & DPKG_DEB_OPT_CONTROL) { |
55 |
ar_archive->accept = control_tar_llist; |
ar_archive->accept = control_tar_llist; |
56 |
tar_archive->action_data = data_extract_all; |
tar_archive->action_data = data_extract_all; |
57 |
if (optind + 1 == argc) { |
if (1 == argc) { |
58 |
extract_dir = "./DEBIAN"; |
extract_dir = "./DEBIAN"; |
59 |
} else { |
} else { |
60 |
argcount++; |
need_args++; |
61 |
} |
} |
62 |
} |
} |
63 |
if (opt & DPKG_DEB_OPT_FIELD) { |
if (opt & DPKG_DEB_OPT_FIELD) { |
65 |
* it should accept a second argument which specifies a |
* it should accept a second argument which specifies a |
66 |
* specific field to print */ |
* specific field to print */ |
67 |
ar_archive->accept = control_tar_llist; |
ar_archive->accept = control_tar_llist; |
68 |
llist_add_to(&(tar_archive->accept), "./control"); |
llist_add_to(&(tar_archive->accept), (char*)"./control"); |
69 |
tar_archive->filter = filter_accept_list; |
tar_archive->filter = filter_accept_list; |
70 |
tar_archive->action_data = data_extract_to_stdout; |
tar_archive->action_data = data_extract_to_stdout; |
71 |
} |
} |
74 |
} |
} |
75 |
if (opt & (DPKG_DEB_OPT_EXTRACT_VERBOSE | DPKG_DEB_OPT_EXTRACT)) { |
if (opt & (DPKG_DEB_OPT_EXTRACT_VERBOSE | DPKG_DEB_OPT_EXTRACT)) { |
76 |
tar_archive->action_data = data_extract_all; |
tar_archive->action_data = data_extract_all; |
77 |
argcount = 2; |
need_args = 2; |
78 |
} |
} |
79 |
|
|
80 |
if ((optind + argcount) != argc) { |
if (need_args != argc) { |
81 |
bb_show_usage(); |
bb_show_usage(); |
82 |
} |
} |
83 |
|
|
84 |
tar_archive->src_fd = ar_archive->src_fd = xopen(argv[optind++], O_RDONLY); |
tar_archive->src_fd = ar_archive->src_fd = xopen(argv[0], O_RDONLY); |
85 |
|
|
86 |
/* Workout where to extract the files */ |
/* Work out where to extract the files */ |
87 |
/* 2nd argument is a dir name */ |
/* 2nd argument is a dir name */ |
88 |
if (argv[optind]) { |
if (argv[1]) { |
89 |
extract_dir = argv[optind]; |
extract_dir = argv[1]; |
90 |
} |
} |
91 |
if (extract_dir) { |
if (extract_dir) { |
92 |
mkdir(extract_dir, 0777); /* bb_make_directory(extract_dir, 0777, 0) */ |
mkdir(extract_dir, 0777); /* bb_make_directory(extract_dir, 0777, 0) */ |
93 |
xchdir(extract_dir); |
xchdir(extract_dir); |
94 |
} |
} |
95 |
|
|
96 |
|
/* Do it */ |
97 |
unpack_ar_archive(ar_archive); |
unpack_ar_archive(ar_archive); |
98 |
|
|
99 |
/* Cleanup */ |
/* Cleanup */ |
100 |
close(ar_archive->src_fd); |
if (ENABLE_FEATURE_CLEAN_UP) |
101 |
|
close(ar_archive->src_fd); |
102 |
|
|
103 |
return EXIT_SUCCESS; |
return EXIT_SUCCESS; |
104 |
} |
} |