summaryrefslogtreecommitdiff
path: root/archival/libunarchive
diff options
context:
space:
mode:
authorEric Andersen2002-04-13 08:43:01 +0000
committerEric Andersen2002-04-13 08:43:01 +0000
commit114de5566849b3ab533f2892d5edfdf16c542db5 (patch)
treeb5e67628ab1b4724225bea5b599b8169032a202b /archival/libunarchive
parent1d1d2f9b1879775a8e04bcd189b66a058405c9c1 (diff)
downloadbusybox-114de5566849b3ab533f2892d5edfdf16c542db5.zip
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.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/archival/libunarchive/unarchive.c b/archival/libunarchive/unarchive.c
index 41be963..49908af 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);
}