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 -X and --exclude options (exclude files)' CONFIG_FEATURE_TAR_EXCLUDE
|
||||||
bool ' Enable -z option (currently only for extracting)' CONFIG_FEATURE_TAR_GZIP
|
bool ' Enable -z option (currently only for extracting)' CONFIG_FEATURE_TAR_GZIP
|
||||||
fi
|
fi
|
||||||
|
if [ "$CONFIG_CPIO" = "y" -o "$CONFIG_TAR" = "y" ] ; then
|
||||||
|
bool ' Enable tape drive support' CONFIG_FEATURE_UNARCHIVE_TAPE
|
||||||
|
fi
|
||||||
bool 'unzip' CONFIG_UNZIP
|
bool 'unzip' CONFIG_UNZIP
|
||||||
endmenu
|
endmenu
|
||||||
|
@ -21,8 +21,10 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <signal.h>
|
||||||
#include "unarchive.h"
|
#include "unarchive.h"
|
||||||
#include "libbb.h"
|
#include "busybox.h"
|
||||||
|
|
||||||
/* Extract the data postioned at src_stream to either filesystem, stdout or
|
/* 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
|
* 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 extract_flag = TRUE;
|
||||||
int i;
|
int i;
|
||||||
char *buffer = NULL;
|
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;
|
archive_offset = 0;
|
||||||
while ((file_entry = get_headers(src_stream)) != NULL) {
|
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->link_name);
|
||||||
free(file_entry);
|
free(file_entry);
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_FEATURE_UNARCHIVE_TAPE
|
||||||
|
kill(pid, SIGTERM);
|
||||||
|
waitpid(pid, NULL, 0);
|
||||||
|
#endif
|
||||||
return(buffer);
|
return(buffer);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user