Patch from Laurence Anderson <L.D.Anderson@warwick.ac.uk> for
better tape drive support in tar/cpio by using an intervening pipe...
This commit is contained in:
parent
1d1d2f9b18
commit
114de55668
@ -20,5 +20,8 @@ if [ "$CONFIG_TAR" = "y" ] ; then
|
||||
bool ' Enable -X and --exclude options (exclude files)' CONFIG_FEATURE_TAR_EXCLUDE
|
||||
bool ' Enable -z option (currently only for extracting)' CONFIG_FEATURE_TAR_GZIP
|
||||
fi
|
||||
if [ "$CONFIG_CPIO" = "y" -o "$CONFIG_TAR" = "y" ] ; then
|
||||
bool ' Enable tape drive support' CONFIG_FEATURE_UNARCHIVE_TAPE
|
||||
fi
|
||||
bool 'unzip' CONFIG_UNZIP
|
||||
endmenu
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user