diff --git a/archival/libunarchive/decompress_bunzip2.c b/archival/libunarchive/decompress_bunzip2.c index c66df5e6d..83232fbe8 100644 --- a/archival/libunarchive/decompress_bunzip2.c +++ b/archival/libunarchive/decompress_bunzip2.c @@ -590,22 +590,6 @@ extern int uncompressStream(int src_fd, int dst_fd) return i; } -/* This new version is not yet properly integrated with tar */ -extern ssize_t read_bz2(int fd, void *buf, size_t count) -{ -#warning FIXME "bzip2 tar support is broken!" - return(0); -} - -extern void BZ2_bzReadOpen(int fd, void *unused, int nUnused) -{ -#warning FIXME "bzip2 tar support is broken!" -} -extern void BZ2_bzReadClose(void) -{ -#warning FIXME "bzip2 tar support is broken!" -} - #ifdef TESTING static char * const bunzip_errors[]={NULL,"Bad file checksum","Not bzip data", diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c index cf5ac6b62..7fa0a0088 100644 --- a/archival/libunarchive/get_header_tar.c +++ b/archival/libunarchive/get_header_tar.c @@ -65,7 +65,7 @@ extern char get_header_tar(archive_handle_t *archive_handle) /* If there is no filename its an empty header */ if (tar.formated.name[0] == 0) { - return(EXIT_SUCCESS); + return(EXIT_FAILURE); } /* Check header has valid magic, "ustar" is for the proper tar diff --git a/archival/libunarchive/get_header_tar_bz2.c b/archival/libunarchive/get_header_tar_bz2.c index b49ccae18..3d50aecd3 100644 --- a/archival/libunarchive/get_header_tar_bz2.c +++ b/archival/libunarchive/get_header_tar_bz2.c @@ -15,6 +15,7 @@ */ #include +#include #include #include #include @@ -25,18 +26,53 @@ extern char get_header_tar_bz2(archive_handle_t *archive_handle) { - BZ2_bzReadOpen(archive_handle->src_fd, NULL, 0); + int fd_pipe[2]; + int pid; - archive_handle->read = read_bz2; + /* Cant lseek over pipe's */ + archive_handle->read = safe_read; archive_handle->seek = seek_by_char; + if (pipe(fd_pipe) != 0) { + bb_error_msg_and_die("Can't create pipe"); + } + + pid = fork(); + if (pid == -1) { + bb_error_msg_and_die("Fork failed\n"); + } + + if (pid == 0) { + /* child process */ + close(fd_pipe[0]); /* We don't wan't to read from the pipe */ + uncompressStream(archive_handle->src_fd, fd_pipe[1]); + check_trailer_gzip(archive_handle->src_fd); + close(fd_pipe[1]); /* Send EOF */ + exit(0); + /* notreached */ + } + /* parent process */ + close(fd_pipe[1]); /* Don't want to write down the pipe */ + close(archive_handle->src_fd); + + archive_handle->src_fd = fd_pipe[0]; + archive_handle->offset = 0; while (get_header_tar(archive_handle) == EXIT_SUCCESS); - /* Cleanup */ - BZ2_bzReadClose(); + close(fd_pipe[0]); +printf("finished\n"); +#if 0 + if (kill(pid, SIGTERM) == -1) { + bb_error_msg_and_die("Couldnt kill gunzip process"); + } +#endif - /* Can only do one tar.bz2 per archive */ + /* I dont think this is needed */ + if (waitpid(pid, NULL, 0) == -1) { + bb_error_msg("Couldnt wait ?"); + } + + /* Can only do one file at a time */ return(EXIT_FAILURE); } -