Use bb_getopt_ulflags, save 100 bytes and strict argument checking.
No binary (build failed)
—
(log yok)
| @@ -12,24 +12,32 @@ | |
| * You should have received a copy of the GNU General Public License | |
| * along with this program; if not, write to the Free Software | |
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
| + | * |
| */ | |
| #include <fcntl.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <unistd.h> | |
| #include <getopt.h> | |
| + | |
| #include "unarchive.h" | |
| #include "busybox.h" | |
| + | #define DPKG_DEB_OPT_CONTENTS 1 |
| + | #define DPKG_DEB_OPT_CONTROL 2 |
| + | #define DPKG_DEB_OPT_FIELD 4 |
| + | #define DPKG_DEB_OPT_EXTRACT 8 |
| + | #define DPKG_DEB_OPT_EXTRACT_VERBOSE 16 |
| + | |
| extern int dpkg_deb_main(int argc, char **argv) | |
| { | |
| archive_handle_t *ar_archive; | |
| archive_handle_t *tar_archive; | |
| - | int opt = 0; |
| - | #ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY |
| llist_t *control_tar_llist = NULL; | |
| - | #endif |
| - | |
| + | unsigned long opt; |
| + | char *extract_dir = NULL; |
| + | short argcount = 1; |
| + | |
| /* Setup the tar archive handle */ | |
| tar_archive = init_handle(); | |
| @@ -40,53 +48,47 @@ extern int dpkg_deb_main(int argc, char **argv) | |
| #ifdef CONFIG_FEATURE_DEB_TAR_GZ | |
| ar_archive->accept = llist_add_to(NULL, "data.tar.gz"); | |
| - | # ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY |
| control_tar_llist = llist_add_to(NULL, "control.tar.gz"); | |
| - | # endif |
| #endif | |
| #ifdef CONFIG_FEATURE_DEB_TAR_BZ2 | |
| ar_archive->accept = llist_add_to(ar_archive->accept, "data.tar.bz2"); | |
| - | # ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY |
| control_tar_llist = llist_add_to(control_tar_llist, "control.tar.bz2"); | |
| - | # endif |
| #endif | |
| - | #ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY |
| - | while ((opt = getopt(argc, argv, "cefXx")) != -1) { |
| - | #else |
| - | while ((opt = getopt(argc, argv, "x")) != -1) { |
| - | #endif |
| - | switch (opt) { |
| - | #ifndef CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY |
| - | case 'c': |
| - | tar_archive->action_header = header_verbose_list; |
| - | break; |
| - | case 'e': |
| - | ar_archive->accept = control_tar_llist; |
| - | tar_archive->action_data = data_extract_all; |
| - | break; |
| - | case 'f': |
| - | /* Print the entire control file |
| - | * it should accept a second argument which specifies a |
| - | * specific field to print */ |
| - | ar_archive->accept = control_tar_llist; |
| - | tar_archive->accept = llist_add_to(NULL, "./control");; |
| - | tar_archive->filter = filter_accept_list; |
| - | tar_archive->action_data = data_extract_to_stdout; |
| - | break; |
| - | case 'X': |
| - | tar_archive->action_header = header_list; |
| - | #endif |
| - | case 'x': |
| - | tar_archive->action_data = data_extract_all; |
| - | break; |
| - | default: |
| - | bb_show_usage(); |
| + | bb_opt_complementaly = "c~efXx:e~cfXx:f~ceXx:X~cefx:x~cefX"; |
| + | opt = bb_getopt_ulflags(argc, argv, "cefXx"); |
| + | |
| + | if (opt & DPKG_DEB_OPT_CONTENTS) { |
| + | tar_archive->action_header = header_verbose_list; |
| + | } |
| + | if (opt & DPKG_DEB_OPT_CONTROL) { |
| + | ar_archive->accept = control_tar_llist; |
| + | tar_archive->action_data = data_extract_all; |
| + | if (optind + 1 == argc) { |
| + | extract_dir = "./DEBIAN"; |
| + | } else { |
| + | argcount++; |
| } | |
| } | |
| + | if (opt & DPKG_DEB_OPT_FIELD) { |
| + | /* Print the entire control file |
| + | * it should accept a second argument which specifies a |
| + | * specific field to print */ |
| + | ar_archive->accept = control_tar_llist; |
| + | tar_archive->accept = llist_add_to(NULL, "./control");; |
| + | tar_archive->filter = filter_accept_list; |
| + | tar_archive->action_data = data_extract_to_stdout; |
| + | } |
| + | if (opt & DPKG_DEB_OPT_EXTRACT) { |
| + | tar_archive->action_header = header_list; |
| + | } |
| + | if (opt & (DPKG_DEB_OPT_EXTRACT_VERBOSE | DPKG_DEB_OPT_EXTRACT)) { |
| + | tar_archive->action_data = data_extract_all; |
| + | argcount = 2; |
| + | } |
| - | if (optind + 2 < argc) { |
| + | if ((optind + argcount != argc) || (opt & 0x80000000UL)) { |
| bb_show_usage(); | |
| } | |
| @@ -94,9 +96,13 @@ extern int dpkg_deb_main(int argc, char **argv) | |
| /* Workout where to extract the files */ | |
| /* 2nd argument is a dir name */ | |
| - | mkdir(argv[optind], 0777); |
| - | chdir(argv[optind]); |
| - | |
| + | if (argv[optind]) { |
| + | extract_dir = argv[optind]; |
| + | } |
| + | if (extract_dir) { |
| + | mkdir(extract_dir, 0777); |
| + | chdir(extract_dir); |
| + | } |
| unpack_ar_archive(ar_archive); | |
| /* Cleanup */ | |
| @@ -104,4 +110,3 @@ extern int dpkg_deb_main(int argc, char **argv) | |
| return(EXIT_SUCCESS); | |
| } | |
| - | |