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-w32-2685724e2374ef74669d39aa2b1f5d1ae8799450.tar.gz busybox-w32-2685724e2374ef74669d39aa2b1f5d1ae8799450.tar.bz2 busybox-w32-2685724e2374ef74669d39aa2b1f5d1ae8799450.zip |
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) | |||
590 | return i; | 590 | return i; |
591 | } | 591 | } |
592 | 592 | ||
593 | /* This new version is not yet properly integrated with tar */ | ||
594 | extern ssize_t read_bz2(int fd, void *buf, size_t count) | ||
595 | { | ||
596 | #warning FIXME "bzip2 tar support is broken!" | ||
597 | return(0); | ||
598 | } | ||
599 | |||
600 | extern void BZ2_bzReadOpen(int fd, void *unused, int nUnused) | ||
601 | { | ||
602 | #warning FIXME "bzip2 tar support is broken!" | ||
603 | } | ||
604 | extern void BZ2_bzReadClose(void) | ||
605 | { | ||
606 | #warning FIXME "bzip2 tar support is broken!" | ||
607 | } | ||
608 | |||
609 | #ifdef TESTING | 593 | #ifdef TESTING |
610 | 594 | ||
611 | static char * const bunzip_errors[]={NULL,"Bad file checksum","Not bzip data", | 595 | 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) | |||
65 | 65 | ||
66 | /* If there is no filename its an empty header */ | 66 | /* If there is no filename its an empty header */ |
67 | if (tar.formated.name[0] == 0) { | 67 | if (tar.formated.name[0] == 0) { |
68 | return(EXIT_SUCCESS); | 68 | return(EXIT_FAILURE); |
69 | } | 69 | } |
70 | 70 | ||
71 | /* Check header has valid magic, "ustar" is for the proper tar | 71 | /* 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 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include <sys/types.h> | 17 | #include <sys/types.h> |
18 | #include <sys/wait.h> | ||
18 | #include <signal.h> | 19 | #include <signal.h> |
19 | #include <stdio.h> | 20 | #include <stdio.h> |
20 | #include <stdlib.h> | 21 | #include <stdlib.h> |
@@ -25,18 +26,53 @@ | |||
25 | 26 | ||
26 | extern char get_header_tar_bz2(archive_handle_t *archive_handle) | 27 | extern char get_header_tar_bz2(archive_handle_t *archive_handle) |
27 | { | 28 | { |
28 | BZ2_bzReadOpen(archive_handle->src_fd, NULL, 0); | 29 | int fd_pipe[2]; |
30 | int pid; | ||
29 | 31 | ||
30 | archive_handle->read = read_bz2; | 32 | /* Cant lseek over pipe's */ |
33 | archive_handle->read = safe_read; | ||
31 | archive_handle->seek = seek_by_char; | 34 | archive_handle->seek = seek_by_char; |
32 | 35 | ||
36 | if (pipe(fd_pipe) != 0) { | ||
37 | bb_error_msg_and_die("Can't create pipe"); | ||
38 | } | ||
39 | |||
40 | pid = fork(); | ||
41 | if (pid == -1) { | ||
42 | bb_error_msg_and_die("Fork failed\n"); | ||
43 | } | ||
44 | |||
45 | if (pid == 0) { | ||
46 | /* child process */ | ||
47 | close(fd_pipe[0]); /* We don't wan't to read from the pipe */ | ||
48 | uncompressStream(archive_handle->src_fd, fd_pipe[1]); | ||
49 | check_trailer_gzip(archive_handle->src_fd); | ||
50 | close(fd_pipe[1]); /* Send EOF */ | ||
51 | exit(0); | ||
52 | /* notreached */ | ||
53 | } | ||
54 | /* parent process */ | ||
55 | close(fd_pipe[1]); /* Don't want to write down the pipe */ | ||
56 | close(archive_handle->src_fd); | ||
57 | |||
58 | archive_handle->src_fd = fd_pipe[0]; | ||
59 | |||
33 | archive_handle->offset = 0; | 60 | archive_handle->offset = 0; |
34 | while (get_header_tar(archive_handle) == EXIT_SUCCESS); | 61 | while (get_header_tar(archive_handle) == EXIT_SUCCESS); |
35 | 62 | ||
36 | /* Cleanup */ | 63 | close(fd_pipe[0]); |
37 | BZ2_bzReadClose(); | 64 | printf("finished\n"); |
65 | #if 0 | ||
66 | if (kill(pid, SIGTERM) == -1) { | ||
67 | bb_error_msg_and_die("Couldnt kill gunzip process"); | ||
68 | } | ||
69 | #endif | ||
38 | 70 | ||
39 | /* Can only do one tar.bz2 per archive */ | 71 | /* I dont think this is needed */ |
72 | if (waitpid(pid, NULL, 0) == -1) { | ||
73 | bb_error_msg("Couldnt wait ?"); | ||
74 | } | ||
75 | |||
76 | /* Can only do one file at a time */ | ||
40 | return(EXIT_FAILURE); | 77 | return(EXIT_FAILURE); |
41 | } | 78 | } |
42 | |||