libunarchive: move dpkg-specific things into dpkg.c. 0 byte size differences
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
dbc6a7a8fd
commit
425ad9c93b
@ -1469,6 +1469,14 @@ static void init_archive_deb_data(archive_handle_t *ar_handle)
|
|||||||
ar_handle->sub_archive = tar_handle;
|
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)
|
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;
|
ar_handle->sub_archive->action_data = data_extract_to_buffer;
|
||||||
@ -1478,7 +1486,7 @@ static char *deb_extract_control_file_to_buffer(archive_handle_t *ar_handle, lli
|
|||||||
unpack_ar_archive(ar_handle);
|
unpack_ar_archive(ar_handle);
|
||||||
close(ar_handle->src_fd);
|
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)
|
static void FAST_FUNC data_extract_all_prefix(archive_handle_t *archive_handle)
|
||||||
@ -1487,7 +1495,7 @@ static void FAST_FUNC data_extract_all_prefix(archive_handle_t *archive_handle)
|
|||||||
|
|
||||||
name_ptr += strspn(name_ptr, "./");
|
name_ptr += strspn(name_ptr, "./");
|
||||||
if (name_ptr[0] != '\0') {
|
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);
|
data_extract_all(archive_handle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1530,7 +1538,7 @@ static void unpack_package(deb_file_t *deb_file)
|
|||||||
archive_handle->sub_archive->accept = accept_list;
|
archive_handle->sub_archive->accept = accept_list;
|
||||||
archive_handle->sub_archive->filter = filter_accept_list;
|
archive_handle->sub_archive->filter = filter_accept_list;
|
||||||
archive_handle->sub_archive->action_data = data_extract_all_prefix;
|
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;
|
archive_handle->sub_archive->ah_flags |= ARCHIVE_UNLINK_OLD;
|
||||||
unpack_ar_archive(archive_handle);
|
unpack_ar_archive(archive_handle);
|
||||||
|
|
||||||
@ -1541,7 +1549,7 @@ static void unpack_package(deb_file_t *deb_file)
|
|||||||
archive_handle = init_archive_deb_ar(deb_file->filename);
|
archive_handle = init_archive_deb_ar(deb_file->filename);
|
||||||
init_archive_deb_data(archive_handle);
|
init_archive_deb_data(archive_handle);
|
||||||
archive_handle->sub_archive->action_data = data_extract_all_prefix;
|
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;
|
archive_handle->sub_archive->ah_flags |= ARCHIVE_UNLINK_OLD;
|
||||||
unpack_ar_archive(archive_handle);
|
unpack_ar_archive(archive_handle);
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@ COMMON_FILES:= \
|
|||||||
data_skip.o \
|
data_skip.o \
|
||||||
data_extract_all.o \
|
data_extract_all.o \
|
||||||
data_extract_to_stdout.o \
|
data_extract_to_stdout.o \
|
||||||
data_extract_to_buffer.o \
|
|
||||||
\
|
\
|
||||||
filter_accept_all.o \
|
filter_accept_all.o \
|
||||||
filter_accept_list.o \
|
filter_accept_list.o \
|
||||||
|
@ -1,17 +0,0 @@
|
|||||||
/* 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);
|
|
||||||
}
|
|
@ -729,7 +729,7 @@ static void handle_SIGCHLD(int status)
|
|||||||
/* wait failed?! I'm confused... */
|
/* wait failed?! I'm confused... */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (WIFEXITED(status) && WEXITSTATUS(status)==0)
|
if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
|
||||||
/* child exited with 0 */
|
/* child exited with 0 */
|
||||||
return;
|
return;
|
||||||
/* Cannot happen?
|
/* Cannot happen?
|
||||||
@ -748,15 +748,16 @@ enum {
|
|||||||
IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,)
|
IF_FEATURE_TAR_FROM( OPTBIT_EXCLUDE_FROM,)
|
||||||
IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,)
|
IF_FEATURE_SEAMLESS_GZ( OPTBIT_GZIP ,)
|
||||||
IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) // 16th bit
|
IF_FEATURE_SEAMLESS_Z( OPTBIT_COMPRESS ,) // 16th bit
|
||||||
|
#if ENABLE_FEATURE_TAR_LONG_OPTIONS
|
||||||
OPTBIT_NUMERIC_OWNER,
|
OPTBIT_NUMERIC_OWNER,
|
||||||
OPTBIT_NOPRESERVE_OWNER,
|
|
||||||
OPTBIT_NOPRESERVE_PERM,
|
OPTBIT_NOPRESERVE_PERM,
|
||||||
|
#endif
|
||||||
OPT_TEST = 1 << 0, // t
|
OPT_TEST = 1 << 0, // t
|
||||||
OPT_EXTRACT = 1 << 1, // x
|
OPT_EXTRACT = 1 << 1, // x
|
||||||
OPT_BASEDIR = 1 << 2, // C
|
OPT_BASEDIR = 1 << 2, // C
|
||||||
OPT_TARNAME = 1 << 3, // f
|
OPT_TARNAME = 1 << 3, // f
|
||||||
OPT_2STDOUT = 1 << 4, // O
|
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_P = 1 << 6, // p
|
||||||
OPT_VERBOSE = 1 << 7, // v
|
OPT_VERBOSE = 1 << 7, // v
|
||||||
OPT_KEEP_OLD = 1 << 8, // k
|
OPT_KEEP_OLD = 1 << 8, // k
|
||||||
@ -768,8 +769,8 @@ enum {
|
|||||||
OPT_EXCLUDE_FROM = IF_FEATURE_TAR_FROM( (1 << OPTBIT_EXCLUDE_FROM)) + 0, // X
|
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_GZIP = IF_FEATURE_SEAMLESS_GZ( (1 << OPTBIT_GZIP )) + 0, // z
|
||||||
OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z
|
OPT_COMPRESS = IF_FEATURE_SEAMLESS_Z( (1 << OPTBIT_COMPRESS )) + 0, // Z
|
||||||
OPT_NUMERIC_OWNER = 1 << OPTBIT_NUMERIC_OWNER,
|
OPT_NUMERIC_OWNER = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NUMERIC_OWNER )) + 0, // numeric-owner
|
||||||
OPT_NOPRESERVE_PERM = 1 << OPTBIT_NOPRESERVE_PERM, // no-same-permissions
|
OPT_NOPRESERVE_PERM = IF_FEATURE_TAR_LONG_OPTIONS((1 << OPTBIT_NOPRESERVE_PERM)) + 0, // no-same-permissions
|
||||||
};
|
};
|
||||||
#if ENABLE_FEATURE_TAR_LONG_OPTIONS
|
#if ENABLE_FEATURE_TAR_LONG_OPTIONS
|
||||||
static const char tar_longopts[] ALIGN1 =
|
static const char tar_longopts[] ALIGN1 =
|
||||||
@ -810,8 +811,7 @@ static const char tar_longopts[] ALIGN1 =
|
|||||||
/* do not restore mode */
|
/* do not restore mode */
|
||||||
"no-same-permissions\0" No_argument "\xfe"
|
"no-same-permissions\0" No_argument "\xfe"
|
||||||
/* --exclude takes next bit position in option mask, */
|
/* --exclude takes next bit position in option mask, */
|
||||||
/* therefore we have to either put it _after_ --no-same-perm */
|
/* therefore we have to put it _after_ --no-same-permissions */
|
||||||
/* or add OPT[BIT]_EXCLUDE before OPT[BIT]_NOPRESERVE_OWNER */
|
|
||||||
# if ENABLE_FEATURE_TAR_FROM
|
# if ENABLE_FEATURE_TAR_FROM
|
||||||
"exclude\0" Required_argument "\xff"
|
"exclude\0" Required_argument "\xff"
|
||||||
# endif
|
# endif
|
||||||
|
@ -4,15 +4,6 @@
|
|||||||
|
|
||||||
PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
|
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 {
|
typedef struct file_header_t {
|
||||||
char *name;
|
char *name;
|
||||||
char *link_target;
|
char *link_target;
|
||||||
@ -64,7 +55,7 @@ typedef struct archive_handle_t {
|
|||||||
void FAST_FUNC (*seek)(int fd, off_t amount);
|
void FAST_FUNC (*seek)(int fd, off_t amount);
|
||||||
|
|
||||||
/* Temporary storage */
|
/* Temporary storage */
|
||||||
char *buffer;
|
char *ah_buffer;
|
||||||
|
|
||||||
/* Flags and misc. stuff */
|
/* Flags and misc. stuff */
|
||||||
unsigned char ah_flags;
|
unsigned char ah_flags;
|
||||||
@ -74,6 +65,15 @@ typedef struct archive_handle_t {
|
|||||||
void *ah_priv[8];
|
void *ah_priv[8];
|
||||||
|
|
||||||
} archive_handle_t;
|
} 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
|
/* Info struct unpackers can fill out to inform users of thing like
|
||||||
@ -94,7 +94,6 @@ extern void unpack_ar_archive(archive_handle_t *ar_archive) FAST_FUNC;
|
|||||||
extern void data_skip(archive_handle_t *archive_handle) FAST_FUNC;
|
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_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_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_skip(const file_header_t *file_header) FAST_FUNC;
|
||||||
extern void header_list(const file_header_t *file_header) FAST_FUNC;
|
extern void header_list(const file_header_t *file_header) FAST_FUNC;
|
||||||
|
@ -8,16 +8,17 @@ mkdir tempdir && cd tempdir || exit 1
|
|||||||
|
|
||||||
# testing "test name" "script" "expected result" "file input" "stdin"
|
# testing "test name" "script" "expected result" "file input" "stdin"
|
||||||
|
|
||||||
testing "tar hardlinks and repeated files" \
|
testing "tar hardlinks and repeated files" "\
|
||||||
">input_hard1
|
rm -rf input_* test.tar 2>/dev/null
|
||||||
|
>input_hard1
|
||||||
ln input_hard1 input_hard2
|
ln input_hard1 input_hard2
|
||||||
mkdir input_dir
|
mkdir input_dir
|
||||||
>input_dir/file
|
>input_dir/file
|
||||||
tar cf test.tar input input_dir/ input_hard1 input_hard2 input_hard1 input_dir/ input
|
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 tvf test.tar | sed 's/.*[0-9] input/input/'
|
||||||
tar xf test.tar 2>&1 && echo Ok
|
tar xf test.tar 2>&1 && echo Ok
|
||||||
" \
|
" "\
|
||||||
"input
|
input
|
||||||
input_dir/
|
input_dir/
|
||||||
input_dir/file
|
input_dir/file
|
||||||
input_hard1
|
input_hard1
|
||||||
|
Loading…
Reference in New Issue
Block a user