--- trunk/mkinitrd-magellan/busybox/archival/ar.c 2009/04/24 18:32:46 815 +++ trunk/mkinitrd-magellan/busybox/archival/ar.c 2009/04/24 18:33:46 816 @@ -3,7 +3,6 @@ * Mini ar implementation for busybox * * Copyright (C) 2000 by Glenn McGrath - * Written by Glenn McGrath 1 June 2000 * * Based in part on BusyBox tar, Debian dpkg-deb and GNU ar. * @@ -14,10 +13,10 @@ * http://www.unix-systems.org/single_unix_specification_v2/xcu/ar.html */ -#include "busybox.h" +#include "libbb.h" #include "unarchive.h" -static void header_verbose_list_ar(const file_header_t *file_header) +static void FAST_FUNC header_verbose_list_ar(const file_header_t *file_header) { const char *mode = bb_mode_string(file_header->mode); char *mtime; @@ -38,19 +37,20 @@ #define AR_OPT_CREATE 0x20 #define AR_OPT_INSERT 0x40 +int ar_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int ar_main(int argc, char **argv) { + static const char msg_unsupported_err[] ALIGN1 = + "archive %s is not supported"; + archive_handle_t *archive_handle; unsigned opt; - static const char msg_unsupported_err[] = - "Archive %s not supported. Install binutils 'ar'."; - char magic[8]; archive_handle = init_handle(); /* Prepend '-' to the first argument if required */ - opt_complementary = "--:p:t:x:-1:?:p--tx:t--px:x--pt"; - opt = getopt32(argc, argv, "ptxovcr"); + opt_complementary = "--:p:t:x:-1:p--tx:t--px:x--pt"; + opt = getopt32(argv, "ptxovcr"); if (opt & AR_CTX_PRINT) { archive_handle->action_data = data_extract_to_stdout; @@ -62,7 +62,7 @@ archive_handle->action_data = data_extract_all; } if (opt & AR_OPT_PRESERVE_DATE) { - archive_handle->flags |= ARCHIVE_PRESERVE_DATE; + archive_handle->ah_flags |= ARCHIVE_PRESERVE_DATE; } if (opt & AR_OPT_VERBOSE) { archive_handle->action_header = header_verbose_list_ar; @@ -81,13 +81,7 @@ llist_add_to(&(archive_handle->accept), argv[optind++]); } - xread(archive_handle->src_fd, magic, 7); - if (strncmp(magic, "!", 7) != 0) { - bb_error_msg_and_die("invalid ar magic"); - } - archive_handle->offset += 7; - - while (get_header_ar(archive_handle) == EXIT_SUCCESS) /* repeat */; + unpack_ar_archive(archive_handle); return EXIT_SUCCESS; }