}
int FAST_FUNC bbunpack(char **argv,
- IF_DESKTOP(long long) int FAST_FUNC (*unpacker)(transformer_aux_data_t *aux),
+ IF_DESKTOP(long long) int FAST_FUNC (*unpacker)(transformer_state_t *xstate),
char* FAST_FUNC (*make_new_name)(char *filename, const char *expected_ext),
const char *expected_ext
)
IF_DESKTOP(long long) int status = 0;
char *filename, *new_name;
smallint exitcode = 0;
- transformer_aux_data_t aux;
+ transformer_state_t xstate;
do {
/* NB: new_name is *maybe* malloc'ed! */
}
if (!(option_mask32 & SEAMLESS_MAGIC)) {
- init_transformer_aux_data(&aux);
- aux.check_signature = 1;
- status = unpacker(&aux);
+ init_transformer_state(&xstate);
+ xstate.check_signature = 1;
+ status = unpacker(&xstate);
if (status < 0)
exitcode = 1;
} else {
unsigned new_name_len;
/* TODO: restore other things? */
- if (aux.mtime != 0) {
+ if (xstate.mtime != 0) {
struct timeval times[2];
- times[1].tv_sec = times[0].tv_sec = aux.mtime;
+ times[1].tv_sec = times[0].tv_sec = xstate.mtime;
times[1].tv_usec = times[0].tv_usec = 0;
/* Note: we closed it first.
* On some systems calling utimes
//kbuild:lib-$(CONFIG_UNCOMPRESS) += bbunzip.o
#if ENABLE_UNCOMPRESS
static
-IF_DESKTOP(long long) int FAST_FUNC unpack_uncompress(transformer_aux_data_t *aux)
+IF_DESKTOP(long long) int FAST_FUNC unpack_uncompress(transformer_state_t *xstate)
{
- return unpack_Z_stream(aux, STDIN_FILENO, STDOUT_FILENO);
+ return unpack_Z_stream(xstate, STDIN_FILENO, STDOUT_FILENO);
}
int uncompress_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int uncompress_main(int argc UNUSED_PARAM, char **argv)
return filename;
}
static
-IF_DESKTOP(long long) int FAST_FUNC unpack_gunzip(transformer_aux_data_t *aux)
+IF_DESKTOP(long long) int FAST_FUNC unpack_gunzip(transformer_state_t *xstate)
{
- return unpack_gz_stream(aux, STDIN_FILENO, STDOUT_FILENO);
+ return unpack_gz_stream(xstate, STDIN_FILENO, STDOUT_FILENO);
}
/*
* Linux kernel build uses gzip -d -n. We accept and ignore it.
//kbuild:lib-$(CONFIG_BUNZIP2) += bbunzip.o
#if ENABLE_BUNZIP2
static
-IF_DESKTOP(long long) int FAST_FUNC unpack_bunzip2(transformer_aux_data_t *aux)
+IF_DESKTOP(long long) int FAST_FUNC unpack_bunzip2(transformer_state_t *xstate)
{
- return unpack_bz2_stream(aux, STDIN_FILENO, STDOUT_FILENO);
+ return unpack_bz2_stream(xstate, STDIN_FILENO, STDOUT_FILENO);
}
int bunzip2_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int bunzip2_main(int argc UNUSED_PARAM, char **argv)
//kbuild:lib-$(CONFIG_UNLZMA) += bbunzip.o
#if ENABLE_UNLZMA
static
-IF_DESKTOP(long long) int FAST_FUNC unpack_unlzma(transformer_aux_data_t *aux)
+IF_DESKTOP(long long) int FAST_FUNC unpack_unlzma(transformer_state_t *xstate)
{
- return unpack_lzma_stream(aux, STDIN_FILENO, STDOUT_FILENO);
+ return unpack_lzma_stream(xstate, STDIN_FILENO, STDOUT_FILENO);
}
int unlzma_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int unlzma_main(int argc UNUSED_PARAM, char **argv)
//kbuild:lib-$(CONFIG_UNXZ) += bbunzip.o
#if ENABLE_UNXZ
static
-IF_DESKTOP(long long) int FAST_FUNC unpack_unxz(transformer_aux_data_t *aux)
+IF_DESKTOP(long long) int FAST_FUNC unpack_unxz(transformer_state_t *xstate)
{
- return unpack_xz_stream(aux, STDIN_FILENO, STDOUT_FILENO);
+ return unpack_xz_stream(xstate, STDIN_FILENO, STDOUT_FILENO);
}
int unxz_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int unxz_main(int argc UNUSED_PARAM, char **argv)
}
static
-IF_DESKTOP(long long) int FAST_FUNC compressStream(transformer_aux_data_t *aux UNUSED_PARAM)
+IF_DESKTOP(long long) int FAST_FUNC compressStream(transformer_state_t *xstate UNUSED_PARAM)
{
IF_DESKTOP(long long) int total;
ssize_t count;
/* ======================================================================== */
static
-IF_DESKTOP(long long) int FAST_FUNC pack_gzip(transformer_aux_data_t *aux UNUSED_PARAM)
+IF_DESKTOP(long long) int FAST_FUNC pack_gzip(transformer_state_t *xstate UNUSED_PARAM)
{
struct stat s;
/* Decompress src_fd to dst_fd. Stops at end of bzip data, not end of file. */
IF_DESKTOP(long long) int FAST_FUNC
-unpack_bz2_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
+unpack_bz2_stream(transformer_state_t *xstate, int src_fd, int dst_fd)
{
IF_DESKTOP(long long total_written = 0;)
bunzip_data *bd;
int i;
unsigned len;
- if (check_signature16(aux, src_fd, BZIP2_MAGIC))
+ if (check_signature16(xstate, src_fd, BZIP2_MAGIC))
return -1;
outbuf = xmalloc(IOBUF_SIZE);
/* For unzip */
IF_DESKTOP(long long) int FAST_FUNC
-inflate_unzip(transformer_aux_data_t *aux, int in, int out)
+inflate_unzip(transformer_state_t *xstate, int in, int out)
{
IF_DESKTOP(long long) int n;
DECLARE_STATE;
ALLOC_STATE;
- to_read = aux->bytes_in;
+ to_read = xstate->bytes_in;
// bytebuffer_max = 0x8000;
bytebuffer_offset = 4;
bytebuffer = xmalloc(bytebuffer_max);
n = inflate_unzip_internal(PASS_STATE in, out);
free(bytebuffer);
- aux->crc32 = gunzip_crc;
- aux->bytes_out = gunzip_bytes_out;
+ xstate->crc32 = gunzip_crc;
+ xstate->bytes_out = gunzip_bytes_out;
DEALLOC_STATE;
return n;
}
return res;
}
-static int check_header_gzip(STATE_PARAM transformer_aux_data_t *aux)
+static int check_header_gzip(STATE_PARAM transformer_state_t *xstate)
{
union {
unsigned char raw[8];
}
}
- if (aux)
- aux->mtime = SWAP_LE32(header.formatted.mtime);
+ if (xstate)
+ xstate->mtime = SWAP_LE32(header.formatted.mtime);
/* Read the header checksum */
if (header.formatted.flags & 0x02) {
}
IF_DESKTOP(long long) int FAST_FUNC
-unpack_gz_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
+unpack_gz_stream(transformer_state_t *xstate, int src_fd, int dst_fd)
{
uint32_t v32;
IF_DESKTOP(long long) int total, n;
DECLARE_STATE;
#if !ENABLE_FEATURE_SEAMLESS_Z
- if (check_signature16(aux, src_fd, GZIP_MAGIC))
+ if (check_signature16(xstate, src_fd, GZIP_MAGIC))
return -1;
#else
- if (aux && aux->check_signature) {
+ if (xstate && xstate->check_signature) {
uint16_t magic2;
if (full_read(src_fd, &magic2, 2) != 2) {
return -1;
}
if (magic2 == COMPRESS_MAGIC) {
- aux->check_signature = 0;
- return unpack_Z_stream(aux, src_fd, dst_fd);
+ xstate->check_signature = 0;
+ return unpack_Z_stream(xstate, src_fd, dst_fd);
}
if (magic2 != GZIP_MAGIC)
goto bad_magic;
gunzip_src_fd = src_fd;
again:
- if (!check_header_gzip(PASS_STATE aux)) {
+ if (!check_header_gzip(PASS_STATE xstate)) {
bb_error_msg("corrupted data");
total = -1;
goto ret;
*/
IF_DESKTOP(long long) int FAST_FUNC
-unpack_Z_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
+unpack_Z_stream(transformer_state_t *xstate, int src_fd, int dst_fd)
{
IF_DESKTOP(long long total_written = 0;)
IF_DESKTOP(long long) int retval = -1;
/* block compress mode -C compatible with 2.0 */
int block_mode; /* = BLOCK_MODE; */
- if (check_signature16(aux, src_fd, COMPRESS_MAGIC))
+ if (check_signature16(xstate, src_fd, COMPRESS_MAGIC))
return -1;
inbuf = xzalloc(IBUFSIZ + 64);
IF_DESKTOP(long long) int FAST_FUNC
-unpack_lzma_stream(transformer_aux_data_t *aux UNUSED_PARAM, int src_fd, int dst_fd)
+unpack_lzma_stream(transformer_state_t *xstate UNUSED_PARAM, int src_fd, int dst_fd)
{
IF_DESKTOP(long long total_written = 0;)
lzma_header_t header;
#include "unxz/xz_dec_stream.c"
IF_DESKTOP(long long) int FAST_FUNC
-unpack_xz_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd)
+unpack_xz_stream(transformer_state_t *xstate, int src_fd, int dst_fd)
{
enum xz_ret xz_result;
struct xz_buf iobuf;
iobuf.out = membuf + BUFSIZ;
iobuf.out_size = BUFSIZ;
- if (!aux || aux->check_signature == 0) {
+ if (!xstate || xstate->check_signature == 0) {
/* Preload XZ file signature */
strcpy((char*)membuf, HEADER_MAGIC);
iobuf.in_size = HEADER_MAGIC_SIZE;
#include "libbb.h"
#include "bb_archive.h"
-void FAST_FUNC init_transformer_aux_data(transformer_aux_data_t *aux)
+void FAST_FUNC init_transformer_state(transformer_state_t *xstate)
{
- memset(aux, 0, sizeof(*aux));
+ memset(xstate, 0, sizeof(*xstate));
}
-int FAST_FUNC check_signature16(transformer_aux_data_t *aux, int src_fd, unsigned magic16)
+int FAST_FUNC check_signature16(transformer_state_t *xstate, int src_fd, unsigned magic16)
{
- if (aux && aux->check_signature) {
+ if (xstate && xstate->check_signature) {
uint16_t magic2;
if (full_read(src_fd, &magic2, 2) != 2 || magic2 != magic16) {
bb_error_msg("invalid magic");
#if 0 /* possible future extension */
- if (aux->check_signature > 1)
+ if (xstate->check_signature > 1)
xfunc_die();
#endif
return -1;
#if BB_MMU
void FAST_FUNC open_transformer(int fd,
int check_signature,
- IF_DESKTOP(long long) int FAST_FUNC (*transformer)(transformer_aux_data_t *aux, int src_fd, int dst_fd)
+ IF_DESKTOP(long long) int FAST_FUNC (*transformer)(transformer_state_t *xstate, int src_fd, int dst_fd)
)
#else
void FAST_FUNC open_transformer(int fd, const char *transform_prog)
#if BB_MMU
{
IF_DESKTOP(long long) int r;
- transformer_aux_data_t aux;
- init_transformer_aux_data(&aux);
- aux.check_signature = check_signature;
- r = transformer(&aux, fd, fd_pipe.wr);
+ transformer_state_t xstate;
+ init_transformer_state(&xstate);
+ xstate.check_signature = check_signature;
+ r = transformer(&xstate, fd, fd_pipe.wr);
if (ENABLE_FEATURE_CLEAN_UP) {
close(fd_pipe.wr); /* send EOF */
close(fd);
uint32_t b32[1];
} magic;
int offset = -2;
- USE_FOR_MMU(IF_DESKTOP(long long) int FAST_FUNC (*xformer)(transformer_aux_data_t *aux, int src_fd, int dst_fd);)
+ USE_FOR_MMU(IF_DESKTOP(long long) int FAST_FUNC (*xformer)(transformer_state_t *xstate, int src_fd, int dst_fd);)
USE_FOR_NOMMU(const char *xformer_prog;)
/* .gz and .bz2 both have 2-byte signature, and their
return xasprintf("%s.lzo", filename);
}
-static IF_DESKTOP(long long) int FAST_FUNC pack_lzop(transformer_aux_data_t *aux UNUSED_PARAM)
+static IF_DESKTOP(long long) int FAST_FUNC pack_lzop(transformer_state_t *xstate UNUSED_PARAM)
{
if (option_mask32 & OPT_DECOMPRESS)
return do_lzo_decompress();
}
if (opt & OPT_ANY_COMPRESS) {
- USE_FOR_MMU(IF_DESKTOP(long long) int FAST_FUNC (*xformer)(transformer_aux_data_t *aux, int src_fd, int dst_fd);)
+ USE_FOR_MMU(IF_DESKTOP(long long) int FAST_FUNC (*xformer)(transformer_state_t *xstate, int src_fd, int dst_fd);)
USE_FOR_NOMMU(const char *xformer_prog;)
if (opt & OPT_COMPRESS)
bb_copyfd_exact_size(zip_fd, dst_fd, size);
} else {
/* Method 8 - inflate */
- transformer_aux_data_t aux;
- init_transformer_aux_data(&aux);
- aux.bytes_in = zip_header->formatted.cmpsize;
- if (inflate_unzip(&aux, zip_fd, dst_fd) < 0)
+ transformer_state_t xstate;
+ init_transformer_state(&xstate);
+ xstate.bytes_in = zip_header->formatted.cmpsize;
+ if (inflate_unzip(&xstate, zip_fd, dst_fd) < 0)
bb_error_msg_and_die("inflate error");
/* Validate decompression - crc */
- if (zip_header->formatted.crc32 != (aux.crc32 ^ 0xffffffffL)) {
+ if (zip_header->formatted.crc32 != (xstate.crc32 ^ 0xffffffffL)) {
bb_error_msg_and_die("crc error");
}
/* Validate decompression - size */
- if (zip_header->formatted.ucmpsize != aux.bytes_out) {
+ if (zip_header->formatted.ucmpsize != xstate.bytes_out) {
/* Don't die. Who knows, maybe len calculation
* was botched somewhere. After all, crc matched! */
bb_error_msg("bad length");
void dealloc_bunzip(bunzip_data *bd) FAST_FUNC;
/* Meaning and direction (input/output) of the fields are transformer-specific */
-typedef struct transformer_aux_data_t {
+typedef struct transformer_state_t {
smallint check_signature; /* most often referenced member */
off_t bytes_out;
off_t bytes_in; /* used in unzip code only: needs to know packed size */
uint32_t crc32;
time_t mtime; /* gunzip code may set this on exit */
-} transformer_aux_data_t;
+} transformer_state_t;
-void init_transformer_aux_data(transformer_aux_data_t *aux) FAST_FUNC;
-int FAST_FUNC check_signature16(transformer_aux_data_t *aux, int src_fd, unsigned magic16) FAST_FUNC;
+void init_transformer_state(transformer_state_t *xstate) FAST_FUNC;
+int FAST_FUNC check_signature16(transformer_state_t *xstate, int src_fd, unsigned magic16) FAST_FUNC;
-IF_DESKTOP(long long) int inflate_unzip(transformer_aux_data_t *aux, int src_fd, int dst_fd) FAST_FUNC;
-IF_DESKTOP(long long) int unpack_Z_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd) FAST_FUNC;
-IF_DESKTOP(long long) int unpack_gz_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd) FAST_FUNC;
-IF_DESKTOP(long long) int unpack_bz2_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd) FAST_FUNC;
-IF_DESKTOP(long long) int unpack_lzma_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd) FAST_FUNC;
-IF_DESKTOP(long long) int unpack_xz_stream(transformer_aux_data_t *aux, int src_fd, int dst_fd) FAST_FUNC;
+IF_DESKTOP(long long) int inflate_unzip(transformer_state_t *xstate, int src_fd, int dst_fd) FAST_FUNC;
+IF_DESKTOP(long long) int unpack_Z_stream(transformer_state_t *xstate, int src_fd, int dst_fd) FAST_FUNC;
+IF_DESKTOP(long long) int unpack_gz_stream(transformer_state_t *xstate, int src_fd, int dst_fd) FAST_FUNC;
+IF_DESKTOP(long long) int unpack_bz2_stream(transformer_state_t *xstate, int src_fd, int dst_fd) FAST_FUNC;
+IF_DESKTOP(long long) int unpack_lzma_stream(transformer_state_t *xstate, int src_fd, int dst_fd) FAST_FUNC;
+IF_DESKTOP(long long) int unpack_xz_stream(transformer_state_t *xstate, int src_fd, int dst_fd) FAST_FUNC;
char* append_ext(char *filename, const char *expected_ext) FAST_FUNC;
int bbunpack(char **argv,
- IF_DESKTOP(long long) int FAST_FUNC (*unpacker)(transformer_aux_data_t *aux),
+ IF_DESKTOP(long long) int FAST_FUNC (*unpacker)(transformer_state_t *xstate),
char* FAST_FUNC (*make_new_name)(char *filename, const char *expected_ext),
const char *expected_ext
) FAST_FUNC;
#if BB_MMU
void open_transformer(int fd,
int check_signature,
- IF_DESKTOP(long long) int FAST_FUNC (*transformer)(transformer_aux_data_t *aux, int src_fd, int dst_fd)
+ IF_DESKTOP(long long) int FAST_FUNC (*transformer)(transformer_state_t *xstate, int src_fd, int dst_fd)
) FAST_FUNC;
#define open_transformer_with_sig(fd, transformer, transform_prog) open_transformer((fd), 1, (transformer))
#define open_transformer_with_no_sig(fd, transformer) open_transformer((fd), 0, (transformer))