diff options
author | Eric Andersen <andersen@codepoet.org> | 2002-04-13 08:43:01 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2002-04-13 08:43:01 +0000 |
commit | 114de5566849b3ab533f2892d5edfdf16c542db5 (patch) | |
tree | b5e67628ab1b4724225bea5b599b8169032a202b /archival/libunarchive | |
parent | 1d1d2f9b1879775a8e04bcd189b66a058405c9c1 (diff) | |
download | busybox-114de5566849b3ab533f2892d5edfdf16c542db5.tar.gz |
Patch from Laurence Anderson <L.D.Anderson@warwick.ac.uk> for
better tape drive support in tar/cpio by using an intervening
pipe...
Diffstat (limited to 'archival/libunarchive')
-rw-r--r-- | archival/libunarchive/unarchive.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/archival/libunarchive/unarchive.c b/archival/libunarchive/unarchive.c index 41be963ef..49908affb 100644 --- a/archival/libunarchive/unarchive.c +++ b/archival/libunarchive/unarchive.c @@ -21,8 +21,10 @@ #include <string.h> #include <unistd.h> #include <utime.h> +#include <sys/wait.h> +#include <signal.h> #include "unarchive.h" -#include "libbb.h" +#include "busybox.h" /* Extract the data postioned at src_stream to either filesystem, stdout or * buffer depending on the value of 'function' which is defined in libbb.h @@ -202,7 +204,22 @@ char *unarchive(FILE *src_stream, FILE *out_stream, file_header_t *(*get_headers int extract_flag = TRUE; int i; char *buffer = NULL; +#ifdef CONFIG_FEATURE_UNARCHIVE_TAPE + int pid, tape_pipe[2]; + if (pipe(tape_pipe) != 0) error_msg_and_die("Can't create pipe\n"); + if ((pid = fork()) == -1) error_msg_and_die("Fork failed\n"); + if (pid==0) { /* child process */ + close(tape_pipe[0]); /* We don't wan't to read from the pipe */ + copyfd(fileno(src_stream), tape_pipe[1]); + close(tape_pipe[1]); /* Send EOF */ + exit(0); + /* notreached */ + } + close(tape_pipe[1]); /* Don't want to write down the pipe */ + fclose(src_stream); + src_stream = fdopen(tape_pipe[0], "r"); +#endif archive_offset = 0; while ((file_entry = get_headers(src_stream)) != NULL) { @@ -238,5 +255,9 @@ char *unarchive(FILE *src_stream, FILE *out_stream, file_header_t *(*get_headers free(file_entry->link_name); free(file_entry); } +#ifdef CONFIG_FEATURE_UNARCHIVE_TAPE + kill(pid, SIGTERM); + waitpid(pid, NULL, 0); +#endif return(buffer); } |