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 i
No binary (build failed)
—
(log yok)
| @@ -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", | |
| @@ -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 | |
| @@ -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); | |
| } | |
| - | |