ar_handle->sub_archive = tar_handle;
}
+static void FAST_FUNC data_extract_to_buffer(archive_handle_t *archive_handle)
+{
+ unsigned size = archive_handle->file_header->size;
+
+ archive_handle->ah_buffer = xzalloc(size + 1);
+ xread(archive_handle->src_fd, archive_handle->ah_buffer, size);
+}
+
static char *deb_extract_control_file_to_buffer(archive_handle_t *ar_handle, llist_t *myaccept)
{
ar_handle->sub_archive->action_data = data_extract_to_buffer;
unpack_ar_archive(ar_handle);
close(ar_handle->src_fd);
- return ar_handle->sub_archive->buffer;
+ return ar_handle->sub_archive->ah_buffer;
}
static void FAST_FUNC data_extract_all_prefix(archive_handle_t *archive_handle)
name_ptr += strspn(name_ptr, "./");
if (name_ptr[0] != '\0') {
- archive_handle->file_header->name = xasprintf("%s%s", archive_handle->buffer, name_ptr);
+ archive_handle->file_header->name = xasprintf("%s%s", archive_handle->ah_buffer, name_ptr);
data_extract_all(archive_handle);
}
}
archive_handle->sub_archive->accept = accept_list;
archive_handle->sub_archive->filter = filter_accept_list;
archive_handle->sub_archive->action_data = data_extract_all_prefix;
- archive_handle->sub_archive->buffer = info_prefix;
+ archive_handle->sub_archive->ah_buffer = info_prefix;
archive_handle->sub_archive->ah_flags |= ARCHIVE_UNLINK_OLD;
unpack_ar_archive(archive_handle);
archive_handle = init_archive_deb_ar(deb_file->filename);
init_archive_deb_data(archive_handle);
archive_handle->sub_archive->action_data = data_extract_all_prefix;
- archive_handle->sub_archive->buffer = (char*)"/"; /* huh? */
+ archive_handle->sub_archive->ah_buffer = (char*)"/"; /* huh? */
archive_handle->sub_archive->ah_flags |= ARCHIVE_UNLINK_OLD;
unpack_ar_archive(archive_handle);
data_skip.o \
data_extract_all.o \
data_extract_to_stdout.o \
- data_extract_to_buffer.o \
\
filter_accept_all.o \
filter_accept_list.o \
+++ /dev/null
-/* vi: set sw=4 ts=4: */
-/*
- * Copyright 2002 Glenn McGrath
- *
- * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
- */
-
-#include "libbb.h"
-#include "unarchive.h"
-
-void FAST_FUNC data_extract_to_buffer(archive_handle_t *archive_handle)
-{
- unsigned int size = archive_handle->file_header->size;
-
- archive_handle->buffer = xzalloc(size + 1);
- xread(archive_handle->src_fd, archive_handle->buffer, size);
-}
/* wait failed?! I'm confused... */
return;
- if (WIFEXITED(status) && WEXITSTATUS(status)==0)
+ if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
/* child exited with 0 */
return;
/* Cannot happen?
IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,)
IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,)
IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) // 16th bit
+#if ENABLE_FEATURE_TAR_LONG_OPTIONS
OPTBIT_NUMERIC_OWNER,
- OPTBIT_NOPRESERVE_OWNER,
OPTBIT_NOPRESERVE_PERM,
+#endif
OPT_TEST = 1 << 0, // t
OPT_EXTRACT = 1 << 1, // x
OPT_BASEDIR = 1 << 2, // C
OPT_TARNAME = 1 << 3, // f
OPT_2STDOUT = 1 << 4, // O
- OPT_NOPRESERVE_OWNER = 1 << 5, // no-same-owner
+ OPT_NOPRESERVE_OWNER = 1 << 5, // o == no-same-owner
OPT_P = 1 << 6, // p
OPT_VERBOSE = 1 << 7, // v
OPT_KEEP_OLD = 1 << 8, // k
OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X
OPT_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z
OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z
- OPT_NUMERIC_OWNER = 1 << OPTBIT_NUMERIC_OWNER,
- OPT_NOPRESERVE_PERM = 1 << OPTBIT_NOPRESERVE_PERM, // no-same-permissions
+ OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner
+ OPT_NOPRESERVE_PERM = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NOPRESERVE_PERM)) + 0, // no-same-permissions
};
#if ENABLE_FEATURE_TAR_LONG_OPTIONS
static const char tar_longopts[] ALIGN1 =
/* do not restore mode */
"no-same-permissions\0" No_argument "\xfe"
/* --exclude takes next bit position in option mask, */
- /* therefore we have to either put it _after_ --no-same-perm */
- /* or add OPT[BIT]_EXCLUDE before OPT[BIT]_NOPRESERVE_OWNER */
+ /* therefore we have to put it _after_ --no-same-permissions */
# if ENABLE_FEATURE_TAR_FROM
"exclude\0" Required_argument "\xff"
# endif
PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
-#define ARCHIVE_RESTORE_DATE (1 << 0)
-#define ARCHIVE_CREATE_LEADING_DIRS (1 << 1)
-#define ARCHIVE_UNLINK_OLD (1 << 2)
-#define ARCHIVE_EXTRACT_QUIET (1 << 3)
-#define ARCHIVE_EXTRACT_NEWER (1 << 4)
-#define ARCHIVE_DONT_RESTORE_OWNER (1 << 5)
-#define ARCHIVE_DONT_RESTORE_PERM (1 << 6)
-#define ARCHIVE_NUMERIC_OWNER (1 << 7)
-
typedef struct file_header_t {
char *name;
char *link_target;
void FAST_FUNC (*seek)(int fd, off_t amount);
/* Temporary storage */
- char *buffer;
+ char *ah_buffer;
/* Flags and misc. stuff */
unsigned char ah_flags;
void *ah_priv[8];
} archive_handle_t;
+/* bits in ah_flags */
+#define ARCHIVE_RESTORE_DATE (1 << 0)
+#define ARCHIVE_CREATE_LEADING_DIRS (1 << 1)
+#define ARCHIVE_UNLINK_OLD (1 << 2)
+#define ARCHIVE_EXTRACT_QUIET (1 << 3)
+#define ARCHIVE_EXTRACT_NEWER (1 << 4)
+#define ARCHIVE_DONT_RESTORE_OWNER (1 << 5)
+#define ARCHIVE_DONT_RESTORE_PERM (1 << 6)
+#define ARCHIVE_NUMERIC_OWNER (1 << 7)
/* Info struct unpackers can fill out to inform users of thing like
extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC;
extern void data_extract_all(archive_handle_t *archive_handle) FAST_FUNC;
extern void data_extract_to_stdout(archive_handle_t *archive_handle) FAST_FUNC;
-extern void data_extract_to_buffer(archive_handle_t *archive_handle) FAST_FUNC;
extern void header_skip(const file_header_t *file_header) FAST_FUNC;
extern void header_list(const file_header_t *file_header) FAST_FUNC;
# testing "test name" "script" "expected result" "file input" "stdin"
-testing "tar hardlinks and repeated files" \
-">input_hard1
+testing "tar hardlinks and repeated files" "\
+rm -rf input_* test.tar 2>/dev/null
+>input_hard1
ln input_hard1 input_hard2
mkdir input_dir
>input_dir/file
tar cf test.tar input input_dir/ input_hard1 input_hard2 input_hard1 input_dir/ input
tar tvf test.tar | sed 's/.*[0-9] input/input/'
tar xf test.tar 2>&1 && echo Ok
-" \
-"input
+" "\
+input
input_dir/
input_dir/file
input_hard1