1 /* vi: set sw=4 ts=4: */
3 * Mini ar implementation for busybox
5 * Copyright (C) 2000 by Glenn McGrath
7 * Based in part on BusyBox tar, Debian dpkg-deb and GNU ar.
9 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
11 * There is no single standard to adhere to so ar may not portable
12 * between different systems
13 * http://www.unix-systems.org/single_unix_specification_v2/xcu/ar.html
17 #include "unarchive.h"
19 static void FAST_FUNC
header_verbose_list_ar(const file_header_t
*file_header
)
21 const char *mode
= bb_mode_string(file_header
->mode
);
24 mtime
= ctime(&file_header
->mtime
);
26 memmove(&mtime
[17], &mtime
[20], 4);
28 printf("%s %d/%d%7d %s %s\n", &mode
[1], file_header
->uid
, file_header
->gid
,
29 (int) file_header
->size
, &mtime
[4], file_header
->name
);
32 #define AR_CTX_PRINT 0x01
33 #define AR_CTX_LIST 0x02
34 #define AR_CTX_EXTRACT 0x04
35 #define AR_OPT_PRESERVE_DATE 0x08
36 #define AR_OPT_VERBOSE 0x10
37 #define AR_OPT_CREATE 0x20
38 #define AR_OPT_INSERT 0x40
40 int ar_main(int argc
, char **argv
) MAIN_EXTERNALLY_VISIBLE
;
41 int ar_main(int argc
, char **argv
)
43 static const char msg_unsupported_err
[] ALIGN1
=
44 "archive %s is not supported";
46 archive_handle_t
*archive_handle
;
49 archive_handle
= init_handle();
51 /* Prepend '-' to the first argument if required */
52 opt_complementary
= "--:p:t:x:-1:p--tx:t--px:x--pt";
53 opt
= getopt32(argv
, "ptxovcr");
55 if (opt
& AR_CTX_PRINT
) {
56 archive_handle
->action_data
= data_extract_to_stdout
;
58 if (opt
& AR_CTX_LIST
) {
59 archive_handle
->action_header
= header_list
;
61 if (opt
& AR_CTX_EXTRACT
) {
62 archive_handle
->action_data
= data_extract_all
;
64 if (opt
& AR_OPT_PRESERVE_DATE
) {
65 archive_handle
->ah_flags
|= ARCHIVE_PRESERVE_DATE
;
67 if (opt
& AR_OPT_VERBOSE
) {
68 archive_handle
->action_header
= header_verbose_list_ar
;
70 if (opt
& AR_OPT_CREATE
) {
71 bb_error_msg_and_die(msg_unsupported_err
, "creation");
73 if (opt
& AR_OPT_INSERT
) {
74 bb_error_msg_and_die(msg_unsupported_err
, "insertion");
77 archive_handle
->src_fd
= xopen(argv
[optind
++], O_RDONLY
);
79 while (optind
< argc
) {
80 archive_handle
->filter
= filter_accept_list
;
81 llist_add_to(&(archive_handle
->accept
), argv
[optind
++]);
84 unpack_ar_archive(archive_handle
);