aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2016-11-27 04:48:53 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2016-11-27 04:48:53 +0100
commit351ab8278e9719cfdc2abb348017b4e5909bcee8 (patch)
tree52cd838a80b4f8285877b75fd5a516d0bcff5816
parent6747bdac88d44d1b3729f56760ae7f6829c85d9f (diff)
downloadbusybox-w32-351ab8278e9719cfdc2abb348017b4e5909bcee8.tar.gz
busybox-w32-351ab8278e9719cfdc2abb348017b4e5909bcee8.tar.bz2
busybox-w32-351ab8278e9719cfdc2abb348017b4e5909bcee8.zip
dpkg-deb: shorten code, improve help text
function old new delta packed_usage 30261 30236 -25 dpkg_deb_main 437 401 -36 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-61) Total: -61 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--archival/dpkg_deb.c77
1 files changed, 34 insertions, 43 deletions
diff --git a/archival/dpkg_deb.c b/archival/dpkg_deb.c
index d34de254a..86850469d 100644
--- a/archival/dpkg_deb.c
+++ b/archival/dpkg_deb.c
@@ -22,14 +22,14 @@
22//kbuild:lib-$(CONFIG_DPKG_DEB) += dpkg_deb.o 22//kbuild:lib-$(CONFIG_DPKG_DEB) += dpkg_deb.o
23 23
24//usage:#define dpkg_deb_trivial_usage 24//usage:#define dpkg_deb_trivial_usage
25//usage: "[-cefxX] FILE [argument]" 25//usage: "[-cefxX] FILE [DIR]"
26//usage:#define dpkg_deb_full_usage "\n\n" 26//usage:#define dpkg_deb_full_usage "\n\n"
27//usage: "Perform actions on Debian packages (.debs)\n" 27//usage: "Perform actions on Debian packages (.deb)\n"
28//usage: "\n -c List contents of filesystem tree" 28//usage: "\n -c List files"
29//usage: "\n -e Extract control files to [argument] directory" 29//usage: "\n -f Print control fields"
30//usage: "\n -f Display control field name starting with [argument]" 30//usage: "\n -e Extract control files to DIR (default: ./DEBIAN)"
31//usage: "\n -x Extract packages filesystem tree to directory" 31//usage: "\n -x Extract files to DIR (no default)"
32//usage: "\n -X Verbose extract" 32//usage: "\n -X Verbose -x"
33//usage: 33//usage:
34//usage:#define dpkg_deb_example_usage 34//usage:#define dpkg_deb_example_usage
35//usage: "$ dpkg-deb -X ./busybox_0.48-1_i386.deb /tmp\n" 35//usage: "$ dpkg-deb -X ./busybox_0.48-1_i386.deb /tmp\n"
@@ -40,18 +40,17 @@
40#define DPKG_DEB_OPT_CONTENTS 1 40#define DPKG_DEB_OPT_CONTENTS 1
41#define DPKG_DEB_OPT_CONTROL 2 41#define DPKG_DEB_OPT_CONTROL 2
42#define DPKG_DEB_OPT_FIELD 4 42#define DPKG_DEB_OPT_FIELD 4
43#define DPKG_DEB_OPT_EXTRACT 8 43#define DPKG_DEB_OPT_EXTRACT_VERBOSE 8
44#define DPKG_DEB_OPT_EXTRACT_VERBOSE 16 44#define DPKG_DEB_OPT_EXTRACT 16
45 45
46int dpkg_deb_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 46int dpkg_deb_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
47int dpkg_deb_main(int argc, char **argv) 47int dpkg_deb_main(int argc UNUSED_PARAM, char **argv)
48{ 48{
49 archive_handle_t *ar_archive; 49 archive_handle_t *ar_archive;
50 archive_handle_t *tar_archive; 50 archive_handle_t *tar_archive;
51 llist_t *control_tar_llist = NULL; 51 llist_t *control_tar_llist = NULL;
52 unsigned opt; 52 unsigned opt;
53 const char *extract_dir; 53 const char *extract_dir;
54 int need_args;
55 54
56 /* Setup the tar archive handle */ 55 /* Setup the tar archive handle */
57 tar_archive = init_handle(); 56 tar_archive = init_handle();
@@ -80,53 +79,45 @@ int dpkg_deb_main(int argc, char **argv)
80 llist_add_to(&control_tar_llist, (char*)"control.tar.xz"); 79 llist_add_to(&control_tar_llist, (char*)"control.tar.xz");
81#endif 80#endif
82 81
83 opt_complementary = "c--efXx:e--cfXx:f--ceXx:X--cefx:x--cefX"; 82 /* Must have 1 or 2 args */
83 opt_complementary = "-1:?2:c--efXx:e--cfXx:f--ceXx:X--cefx:x--cefX";
84 opt = getopt32(argv, "cefXx"); 84 opt = getopt32(argv, "cefXx");
85 argv += optind; 85 argv += optind;
86 argc -= optind; 86 //argc -= optind;
87 87
88 if (opt & DPKG_DEB_OPT_CONTENTS) { 88 extract_dir = argv[1];
89 if (opt & DPKG_DEB_OPT_CONTENTS) { // -c
89 tar_archive->action_header = header_verbose_list; 90 tar_archive->action_header = header_verbose_list;
91 if (extract_dir)
92 bb_show_usage();
90 } 93 }
91 extract_dir = NULL; 94 if (opt & DPKG_DEB_OPT_FIELD) { // -f
92 need_args = 1; 95 /* Print the entire control file */
93 if (opt & DPKG_DEB_OPT_CONTROL) { 96//TODO: standard tool accepts an optional list of fields to print
94 ar_archive->accept = control_tar_llist;
95 tar_archive->action_data = data_extract_all;
96 if (1 == argc) {
97 extract_dir = "./DEBIAN";
98 } else {
99 need_args++;
100 }
101 }
102 if (opt & DPKG_DEB_OPT_FIELD) {
103 /* Print the entire control file
104 * it should accept a second argument which specifies a
105 * specific field to print */
106 ar_archive->accept = control_tar_llist; 97 ar_archive->accept = control_tar_llist;
107 llist_add_to(&(tar_archive->accept), (char*)"./control"); 98 llist_add_to(&(tar_archive->accept), (char*)"./control");
108 tar_archive->filter = filter_accept_list; 99 tar_archive->filter = filter_accept_list;
109 tar_archive->action_data = data_extract_to_stdout; 100 tar_archive->action_data = data_extract_to_stdout;
101 if (extract_dir)
102 bb_show_usage();
110 } 103 }
111 if (opt & DPKG_DEB_OPT_EXTRACT) { 104 if (opt & DPKG_DEB_OPT_CONTROL) { // -e
112 tar_archive->action_header = header_list; 105 ar_archive->accept = control_tar_llist;
113 }
114 if (opt & (DPKG_DEB_OPT_EXTRACT_VERBOSE | DPKG_DEB_OPT_EXTRACT)) {
115 tar_archive->action_data = data_extract_all; 106 tar_archive->action_data = data_extract_all;
116 need_args = 2; 107 if (!extract_dir)
108 extract_dir = "./DEBIAN";
117 } 109 }
118 110 if (opt & (DPKG_DEB_OPT_EXTRACT_VERBOSE | DPKG_DEB_OPT_EXTRACT)) { // -Xx
119 if (need_args != argc) { 111 if (opt & DPKG_DEB_OPT_EXTRACT_VERBOSE)
120 bb_show_usage(); 112 tar_archive->action_header = header_list;
113 tar_archive->action_data = data_extract_all;
114 if (!extract_dir)
115 bb_show_usage();
121 } 116 }
122 117
123 tar_archive->src_fd = ar_archive->src_fd = xopen(argv[0], O_RDONLY); 118 /* Standard tool supports "-" */
119 tar_archive->src_fd = ar_archive->src_fd = xopen_stdin(argv[0]);
124 120
125 /* Work out where to extract the files */
126 /* 2nd argument is a dir name */
127 if (argv[1]) {
128 extract_dir = argv[1];
129 }
130 if (extract_dir) { 121 if (extract_dir) {
131 mkdir(extract_dir, 0777); /* bb_make_directory(extract_dir, 0777, 0) */ 122 mkdir(extract_dir, 0777); /* bb_make_directory(extract_dir, 0777, 0) */
132 xchdir(extract_dir); 123 xchdir(extract_dir);