diff options
author | Glenn L McGrath | 2003-11-05 04:55:58 +0000 |
---|---|---|
committer | Glenn L McGrath | 2003-11-05 04:55:58 +0000 |
commit | 2685724e2374ef74669d39aa2b1f5d1ae8799450 (patch) | |
tree | 04c0232694e68ed2ba2f396ee0e56e754d84e260 /archival/libunarchive/get_header_tar_bz2.c | |
parent | 6d687817a8433906107dc40b4a95ec1da40c3df0 (diff) | |
download | busybox-2685724e2374ef74669d39aa2b1f5d1ae8799450.zip 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.
Diffstat (limited to 'archival/libunarchive/get_header_tar_bz2.c')
-rw-r--r-- | archival/libunarchive/get_header_tar_bz2.c | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/archival/libunarchive/get_header_tar_bz2.c b/archival/libunarchive/get_header_tar_bz2.c index b49ccae..3d50aec 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); } - |