diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2004-02-25 09:30:06 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2004-02-25 09:30:06 +0000 |
commit | 10b781345f549f4a6a72f6d205cf5acc92967c19 (patch) | |
tree | bf4331bafef247c71496ad889da5f4df0fc6523a | |
parent | d8746cdc40b619f14223893f0e9401c4357352be (diff) | |
download | busybox-w32-10b781345f549f4a6a72f6d205cf5acc92967c19.tar.gz busybox-w32-10b781345f549f4a6a72f6d205cf5acc92967c19.tar.bz2 busybox-w32-10b781345f549f4a6a72f6d205cf5acc92967c19.zip |
Fix option handling, -i or -t must be given, if both ignore the -t.
Use bb_getopt_ulflags.
-rw-r--r-- | archival/cpio.c | 83 |
1 files changed, 44 insertions, 39 deletions
diff --git a/archival/cpio.c b/archival/cpio.c index beee83d31..8f85779c9 100644 --- a/archival/cpio.c +++ b/archival/cpio.c | |||
@@ -31,56 +31,61 @@ | |||
31 | #include "unarchive.h" | 31 | #include "unarchive.h" |
32 | #include "busybox.h" | 32 | #include "busybox.h" |
33 | 33 | ||
34 | #define CPIO_OPT_EXTRACT 0x01 | ||
35 | #define CPIO_OPT_TEST 0x02 | ||
36 | #define CPIO_OPT_UNCONDITIONAL 0x04 | ||
37 | #define CPIO_OPT_VERBOSE 0x08 | ||
38 | #define CPIO_OPT_FILE 0x10 | ||
39 | #define CPIO_OPT_CREATE_LEADING_DIR 0x20 | ||
40 | #define CPIO_OPT_PRESERVE_MTIME 0x40 | ||
41 | |||
34 | extern int cpio_main(int argc, char **argv) | 42 | extern int cpio_main(int argc, char **argv) |
35 | { | 43 | { |
36 | archive_handle_t *archive_handle; | 44 | archive_handle_t *archive_handle; |
37 | int opt; | 45 | char *cpio_filename = NULL; |
46 | unsigned long opt; | ||
38 | 47 | ||
39 | /* Initialise */ | 48 | /* Initialise */ |
40 | archive_handle = init_handle(); | 49 | archive_handle = init_handle(); |
41 | archive_handle->src_fd = fileno(stdin); | 50 | archive_handle->src_fd = fileno(stdin); |
42 | archive_handle->seek = seek_by_char; | 51 | archive_handle->seek = seek_by_char; |
43 | archive_handle->flags = ARCHIVE_EXTRACT_NEWER | ARCHIVE_PRESERVE_DATE; | 52 | archive_handle->flags = ARCHIVE_EXTRACT_NEWER | ARCHIVE_PRESERVE_DATE; |
44 | 53 | ||
45 | while ((opt = getopt(argc, argv, "idmuvtF:")) != -1) { | 54 | opt = bb_getopt_ulflags(argc, argv, "ituvF:dm", &cpio_filename); |
46 | switch (opt) { | 55 | |
47 | case 'i': /* extract */ | 56 | /* One of either extract or test options must be given */ |
48 | archive_handle->action_data = data_extract_all; | 57 | if ((opt & (CPIO_OPT_TEST | CPIO_OPT_EXTRACT)) == 0) { |
49 | break; | 58 | bb_show_usage(); |
50 | case 'd': /* create _leading_ directories */ | 59 | } |
51 | archive_handle->flags |= ARCHIVE_CREATE_LEADING_DIRS; | 60 | |
52 | break; | 61 | if (opt & CPIO_OPT_TEST) { |
53 | #if 0 | 62 | /* if both extract and test option are given, ignore extract option */ |
54 | case 'm': /* preserve modification time */ | 63 | if (opt & CPIO_OPT_EXTRACT) { |
55 | archive_handle->flags |= ARCHIVE_PRESERVE_DATE; | 64 | opt &= ~CPIO_OPT_EXTRACT; |
56 | break; | 65 | } |
57 | #endif | 66 | archive_handle->action_header = header_list; |
58 | case 'v': /* verbosly list files */ | 67 | } |
59 | if (archive_handle->action_header == header_list) { | 68 | if (opt & CPIO_OPT_EXTRACT) { |
60 | archive_handle->action_header = header_verbose_list; | 69 | archive_handle->action_data = data_extract_all; |
61 | } else { | 70 | } |
62 | archive_handle->action_header = header_list; | 71 | if (opt & CPIO_OPT_UNCONDITIONAL) { |
63 | } | 72 | archive_handle->flags |= ARCHIVE_EXTRACT_UNCONDITIONAL; |
64 | break; | 73 | archive_handle->flags &= ~ARCHIVE_EXTRACT_NEWER; |
65 | case 'u': /* unconditional */ | 74 | } |
66 | archive_handle->flags |= ARCHIVE_EXTRACT_UNCONDITIONAL; | 75 | if (opt & CPIO_OPT_VERBOSE) { |
67 | archive_handle->flags &= ~ARCHIVE_EXTRACT_NEWER; | 76 | if (archive_handle->action_header == header_list) { |
68 | break; | 77 | archive_handle->action_header = header_verbose_list; |
69 | case 't': /* list files */ | 78 | } else { |
70 | if (archive_handle->action_header == header_list) { | 79 | archive_handle->action_header = header_list; |
71 | archive_handle->action_header = header_verbose_list; | ||
72 | } else { | ||
73 | archive_handle->action_header = header_list; | ||
74 | } | ||
75 | break; | ||
76 | case 'F': | ||
77 | archive_handle->src_fd = bb_xopen(optarg, O_RDONLY); | ||
78 | archive_handle->seek = seek_by_jump; | ||
79 | break; | ||
80 | default: | ||
81 | bb_show_usage(); | ||
82 | } | 80 | } |
83 | } | 81 | } |
82 | if (cpio_filename) { /* CPIO_OPT_FILE */ | ||
83 | archive_handle->src_fd = bb_xopen(cpio_filename, O_RDONLY); | ||
84 | archive_handle->seek = seek_by_jump; | ||
85 | } | ||
86 | if (opt & CPIO_OPT_CREATE_LEADING_DIR) { | ||
87 | archive_handle->flags |= ARCHIVE_CREATE_LEADING_DIRS; | ||
88 | } | ||
84 | 89 | ||
85 | while (optind < argc) { | 90 | while (optind < argc) { |
86 | archive_handle->filter = filter_accept_list; | 91 | archive_handle->filter = filter_accept_list; |