diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2003-11-05 04:55:58 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2003-11-05 04:55:58 +0000 |
commit | 2685724e2374ef74669d39aa2b1f5d1ae8799450 (patch) | |
tree | 04c0232694e68ed2ba2f396ee0e56e754d84e260 | |
parent | 6d687817a8433906107dc40b4a95ec1da40c3df0 (diff) | |
download | busybox-2685724e2374ef74669d39aa2b1f5d1ae8799450.tar.gz |
Fix tar -j support
Use the old fork() method of tar compression support, rather than
read_bz2....
- (*uncompress)(int in, int out) seems like a more natural interface
for compression code.
- it might improve performance by seperating the work into one cpu
bound and one io bound process.
- There is extra code required to do read_[gz|bunzip] since (*uncompress)(int in,
int out) will normally be used by the standalone compression applet.
There have been problems with this method so if you see a "Short read"
error let me know.
-rw-r--r-- | archival/libunarchive/decompress_bunzip2.c | 16 | ||||
-rw-r--r-- | archival/libunarchive/get_header_tar.c | 2 | ||||
-rw-r--r-- | archival/libunarchive/get_header_tar_bz2.c | 48 |
3 files changed, 43 insertions, 23 deletions
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 <sys/types.h> +#include <sys/wait.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> @@ -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); } - |