aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--applets/usage.h6
-rw-r--r--archival/dpkg_deb.c5
-rw-r--r--dpkg_deb.c5
-rw-r--r--include/usage.h6
-rw-r--r--libbb/deb_extract.c16
-rw-r--r--libbb/untar.c21
-rw-r--r--usage.h6
7 files changed, 41 insertions, 24 deletions
diff --git a/applets/usage.h b/applets/usage.h
index 5712c4413..31c749e2f 100644
--- a/applets/usage.h
+++ b/applets/usage.h
@@ -265,13 +265,13 @@
"WORK IN PROGRESS, only usefull for debian-installer"
#define dpkg_deb_trivial_usage \
- "[-cexX] file directory"
+ "[-cefxX] file directory"
#define dpkg_deb_full_usage \
"Perform actions on debian packages (.debs)\n\n" \
"Options:\n" \
- "\t-c\tList contents of filesystem tree (verbose)\n" \
- "\t-l\tList contents of filesystem tree (.list format)\n" \
+ "\t-c\tList contents of filesystem tree\n" \
"\t-e\tExtract control files to directory\n" \
+ "\t-f\tExtract filesystem tree to stdout in tar format\n" \
"\t-x\tExctract packages filesystem tree to directory\n" \
"\t-X\tVerbose extract"
#define dpkg_deb_example_usage \
diff --git a/archival/dpkg_deb.c b/archival/dpkg_deb.c
index 6653f2a7c..3bec8cfc7 100644
--- a/archival/dpkg_deb.c
+++ b/archival/dpkg_deb.c
@@ -24,7 +24,7 @@ extern int dpkg_deb_main(int argc, char **argv)
int opt = 0;
int optflag = 0;
- while ((opt = getopt(argc, argv, "cexXl")) != -1) {
+ while ((opt = getopt(argc, argv, "cetXxl")) != -1) {
switch (opt) {
case 'c':
optflag |= extract_contents;
@@ -32,6 +32,9 @@ extern int dpkg_deb_main(int argc, char **argv)
case 'e':
optflag |= extract_control;
break;
+ case 't':
+ optflag |= extract_fsys_tarfile;
+ break;
case 'X':
optflag |= extract_verbose_extract;
break;
diff --git a/dpkg_deb.c b/dpkg_deb.c
index 6653f2a7c..3bec8cfc7 100644
--- a/dpkg_deb.c
+++ b/dpkg_deb.c
@@ -24,7 +24,7 @@ extern int dpkg_deb_main(int argc, char **argv)
int opt = 0;
int optflag = 0;
- while ((opt = getopt(argc, argv, "cexXl")) != -1) {
+ while ((opt = getopt(argc, argv, "cetXxl")) != -1) {
switch (opt) {
case 'c':
optflag |= extract_contents;
@@ -32,6 +32,9 @@ extern int dpkg_deb_main(int argc, char **argv)
case 'e':
optflag |= extract_control;
break;
+ case 't':
+ optflag |= extract_fsys_tarfile;
+ break;
case 'X':
optflag |= extract_verbose_extract;
break;
diff --git a/include/usage.h b/include/usage.h
index 5712c4413..31c749e2f 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -265,13 +265,13 @@
"WORK IN PROGRESS, only usefull for debian-installer"
#define dpkg_deb_trivial_usage \
- "[-cexX] file directory"
+ "[-cefxX] file directory"
#define dpkg_deb_full_usage \
"Perform actions on debian packages (.debs)\n\n" \
"Options:\n" \
- "\t-c\tList contents of filesystem tree (verbose)\n" \
- "\t-l\tList contents of filesystem tree (.list format)\n" \
+ "\t-c\tList contents of filesystem tree\n" \
"\t-e\tExtract control files to directory\n" \
+ "\t-f\tExtract filesystem tree to stdout in tar format\n" \
"\t-x\tExctract packages filesystem tree to directory\n" \
"\t-X\tVerbose extract"
#define dpkg_deb_example_usage \
diff --git a/libbb/deb_extract.c b/libbb/deb_extract.c
index e982c14bb..d3e615305 100644
--- a/libbb/deb_extract.c
+++ b/libbb/deb_extract.c
@@ -26,6 +26,7 @@
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
+#include <string.h>
#include <signal.h>
#include "libbb.h"
@@ -42,14 +43,9 @@ extern int deb_extract(const char *package_filename, int function, char *target_
case (extract_control):
ared_file = xstrdup("control.tar.gz");
break;
- case (extract_contents):
- case (extract_extract):
- case (extract_verbose_extract):
- case (extract_list):
+ default:
ared_file = xstrdup("data.tar.gz");
break;
- default:
- error_msg("Unknown extraction function");
}
/* open the debian package to be worked on */
@@ -71,9 +67,11 @@ extern int deb_extract(const char *package_filename, int function, char *target_
/* open a stream of decompressed data */
uncompressed_file = fdopen(gz_open(deb_file, &gunzip_pid), "r");
- /* get a list of all tar headers inside the .gz file */
- untar(uncompressed_file, function, target_dir);
-
+ if (function & extract_fsys_tarfile) {
+ copy_file_chunk(uncompressed_file, stdout, -1);
+ } else {
+ untar(uncompressed_file, function, target_dir);
+ }
/* we are deliberately terminating the child so we can safely ignore this */
gz_close(gunzip_pid);
diff --git a/libbb/untar.c b/libbb/untar.c
index 9f7bd303c..11c55df7c 100644
--- a/libbb/untar.c
+++ b/libbb/untar.c
@@ -55,13 +55,26 @@ extern int untar(FILE *src_tar_file, int untar_function, char *base_path)
while (fread((char *) &raw_tar_header, 1, 512, src_tar_file) == 512) {
long sum = 0;
char *dir = NULL;
+
+ if (ferror(src_tar_file) || feof(src_tar_file)) {
+ break;
+ }
uncompressed_count += 512;
/* Check header has valid magic */
if (strncmp(raw_tar_header.magic, "ustar", 5) != 0) {
- /* Put this pack after TODO (check child still alive) is done */
- error_msg("Invalid tar magic");
+/*
+ * FIXME, Need HELP with this
+ *
+ * This has to fail silently or it incorrectly reports errors when called from
+ * deb_extract.
+ * The problem is deb_extract decompresses the .gz file in a child process and
+ * untar reads from the child proccess. The child process finishes and exits,
+ * but fread reads 0's from the src_tar_file even though the child
+ * closed its handle.
+ */
+// error_msg("Invalid tar magic");
break;
}
@@ -109,7 +122,7 @@ extern int untar(FILE *src_tar_file, int untar_function, char *base_path)
}
*/
- if (untar_function & (extract_verbose_extract | extract_contents)) {
+ if (untar_function & (extract_contents | extract_verbose_extract)) {
printf("%s\n", raw_tar_header.name);
}
@@ -144,7 +157,7 @@ extern int untar(FILE *src_tar_file, int untar_function, char *base_path)
break;
}
case '5':
- if (untar_function & (extract_extract | extract_verbose_extract)) {
+ if (untar_function & extract_extract) {
if (create_path(dir, mode) != TRUE) {
free(dir);
perror_msg("%s: Cannot mkdir", raw_tar_header.name);
diff --git a/usage.h b/usage.h
index 5712c4413..31c749e2f 100644
--- a/usage.h
+++ b/usage.h
@@ -265,13 +265,13 @@
"WORK IN PROGRESS, only usefull for debian-installer"
#define dpkg_deb_trivial_usage \
- "[-cexX] file directory"
+ "[-cefxX] file directory"
#define dpkg_deb_full_usage \
"Perform actions on debian packages (.debs)\n\n" \
"Options:\n" \
- "\t-c\tList contents of filesystem tree (verbose)\n" \
- "\t-l\tList contents of filesystem tree (.list format)\n" \
+ "\t-c\tList contents of filesystem tree\n" \
"\t-e\tExtract control files to directory\n" \
+ "\t-f\tExtract filesystem tree to stdout in tar format\n" \
"\t-x\tExctract packages filesystem tree to directory\n" \
"\t-X\tVerbose extract"
#define dpkg_deb_example_usage \