aboutsummaryrefslogtreecommitdiff
path: root/archival/ar.c
diff options
context:
space:
mode:
Diffstat (limited to 'archival/ar.c')
-rw-r--r--archival/ar.c59
1 files changed, 31 insertions, 28 deletions
diff --git a/archival/ar.c b/archival/ar.c
index af9793f23..71f949e79 100644
--- a/archival/ar.c
+++ b/archival/ar.c
@@ -48,16 +48,6 @@
48 48
49//kbuild:lib-$(CONFIG_AR) += ar.o 49//kbuild:lib-$(CONFIG_AR) += ar.o
50 50
51//usage:#define ar_trivial_usage
52//usage: "[-optxv] ARCHIVE FILES"
53//usage:#define ar_full_usage "\n\n"
54//usage: "Extract or list FILES from an ar archive\n"
55//usage: "\n -o Preserve original dates"
56//usage: "\n -p Extract to stdout"
57//usage: "\n -t List"
58//usage: "\n -x Extract"
59//usage: "\n -v Verbose"
60
61#include "libbb.h" 51#include "libbb.h"
62#include "bb_archive.h" 52#include "bb_archive.h"
63#include "ar_.h" 53#include "ar_.h"
@@ -220,23 +210,36 @@ static void FAST_FUNC header_verbose_list_ar(const file_header_t *file_header)
220 ); 210 );
221} 211}
222 212
223#define AR_OPT_VERBOSE (1 << 0) 213//usage:#define ar_trivial_usage
224#define AR_OPT_PRESERVE_DATE (1 << 1) 214//usage: "x|p|t"IF_FEATURE_AR_CREATE("|r")" [-ov] ARCHIVE [FILE]..."
225/* "ar r" implies create, but warns about it. c suppresses warning. 215//usage:#define ar_full_usage "\n\n"
226 * bbox accepts but ignores it: */ 216//usage: "Extract or list FILEs from an ar archive"IF_FEATURE_AR_CREATE(", or create it")"\n"
227#define AR_OPT_CREATE (1 << 2) 217//usage: "\n x Extract"
228 218//usage: "\n p Extract to stdout"
229#define AR_CMD_PRINT (1 << 3) 219//usage: "\n t List"
230#define FIRST_CMD AR_CMD_PRINT 220//usage: IF_FEATURE_AR_CREATE(
231#define AR_CMD_LIST (1 << 4) 221//usage: "\n r Create"
232#define AR_CMD_EXTRACT (1 << 5) 222//usage: )
233#define AR_CMD_INSERT (1 << 6) 223//usage: "\n -o Restore mtime"
224//usage: "\n -v Verbose"
234 225
235int ar_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 226int ar_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
236int ar_main(int argc UNUSED_PARAM, char **argv) 227int ar_main(int argc UNUSED_PARAM, char **argv)
237{ 228{
238 archive_handle_t *archive_handle; 229 archive_handle_t *archive_handle;
239 unsigned opt, t; 230 unsigned opt, t;
231 enum {
232 OPT_VERBOSE = (1 << 0),
233 OPT_PRESERVE_DATE = (1 << 1),
234 /* "ar r" implies create, but warns about it. c suppresses warning.
235 * bbox accepts but ignores it: */
236 OPT_CREATE = (1 << 2),
237 CMD_PRINT = (1 << 3),
238 FIRST_CMD = CMD_PRINT,
239 CMD_LIST = (1 << 4),
240 CMD_EXTRACT = (1 << 5),
241 CMD_INSERT = ((1 << 6) * ENABLE_FEATURE_AR_CREATE),
242 };
240 243
241 archive_handle = init_handle(); 244 archive_handle = init_handle();
242 245
@@ -256,26 +259,26 @@ int ar_main(int argc UNUSED_PARAM, char **argv)
256 if (t & (t-1)) /* more than one of p,t,x[,r] are specified */ 259 if (t & (t-1)) /* more than one of p,t,x[,r] are specified */
257 bb_show_usage(); 260 bb_show_usage();
258 261
259 if (opt & AR_CMD_PRINT) { 262 if (opt & CMD_PRINT) {
260 archive_handle->action_data = data_extract_to_stdout; 263 archive_handle->action_data = data_extract_to_stdout;
261 } 264 }
262 if (opt & AR_CMD_LIST) { 265 if (opt & CMD_LIST) {
263 archive_handle->action_header = header_list; 266 archive_handle->action_header = header_list;
264 } 267 }
265 if (opt & AR_CMD_EXTRACT) { 268 if (opt & CMD_EXTRACT) {
266 archive_handle->action_data = data_extract_all; 269 archive_handle->action_data = data_extract_all;
267 } 270 }
268 if (opt & AR_OPT_PRESERVE_DATE) { 271 if (opt & OPT_PRESERVE_DATE) {
269 archive_handle->ah_flags |= ARCHIVE_RESTORE_DATE; 272 archive_handle->ah_flags |= ARCHIVE_RESTORE_DATE;
270 } 273 }
271 if (opt & AR_OPT_VERBOSE) { 274 if (opt & OPT_VERBOSE) {
272 archive_handle->action_header = header_verbose_list_ar; 275 archive_handle->action_header = header_verbose_list_ar;
273 } 276 }
274#if ENABLE_FEATURE_AR_CREATE 277#if ENABLE_FEATURE_AR_CREATE
275 archive_handle->ar__name = *argv; 278 archive_handle->ar__name = *argv;
276#endif 279#endif
277 archive_handle->src_fd = xopen(*argv++, 280 archive_handle->src_fd = xopen(*argv++,
278 (opt & AR_CMD_INSERT) 281 (opt & CMD_INSERT)
279 ? O_RDWR | O_CREAT 282 ? O_RDWR | O_CREAT
280 : O_RDONLY 283 : O_RDONLY
281 ); 284 );
@@ -287,7 +290,7 @@ int ar_main(int argc UNUSED_PARAM, char **argv)
287 } 290 }
288 291
289#if ENABLE_FEATURE_AR_CREATE 292#if ENABLE_FEATURE_AR_CREATE
290 if (opt & AR_CMD_INSERT) 293 if (opt & CMD_INSERT)
291 return write_ar_archive(archive_handle); 294 return write_ar_archive(archive_handle);
292#endif 295#endif
293 296