New dpkg-deb function -t, stands for --fsys-tarfile
This commit is contained in:
parent
c9cac5be23
commit
3e2ab88ee2
@ -265,13 +265,13 @@
|
|||||||
"WORK IN PROGRESS, only usefull for debian-installer"
|
"WORK IN PROGRESS, only usefull for debian-installer"
|
||||||
|
|
||||||
#define dpkg_deb_trivial_usage \
|
#define dpkg_deb_trivial_usage \
|
||||||
"[-cexX] file directory"
|
"[-cefxX] file directory"
|
||||||
#define dpkg_deb_full_usage \
|
#define dpkg_deb_full_usage \
|
||||||
"Perform actions on debian packages (.debs)\n\n" \
|
"Perform actions on debian packages (.debs)\n\n" \
|
||||||
"Options:\n" \
|
"Options:\n" \
|
||||||
"\t-c\tList contents of filesystem tree (verbose)\n" \
|
"\t-c\tList contents of filesystem tree\n" \
|
||||||
"\t-l\tList contents of filesystem tree (.list format)\n" \
|
|
||||||
"\t-e\tExtract control files to directory\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\tExctract packages filesystem tree to directory\n" \
|
||||||
"\t-X\tVerbose extract"
|
"\t-X\tVerbose extract"
|
||||||
#define dpkg_deb_example_usage \
|
#define dpkg_deb_example_usage \
|
||||||
|
@ -24,7 +24,7 @@ extern int dpkg_deb_main(int argc, char **argv)
|
|||||||
int opt = 0;
|
int opt = 0;
|
||||||
int optflag = 0;
|
int optflag = 0;
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "cexXl")) != -1) {
|
while ((opt = getopt(argc, argv, "cetXxl")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'c':
|
case 'c':
|
||||||
optflag |= extract_contents;
|
optflag |= extract_contents;
|
||||||
@ -32,6 +32,9 @@ extern int dpkg_deb_main(int argc, char **argv)
|
|||||||
case 'e':
|
case 'e':
|
||||||
optflag |= extract_control;
|
optflag |= extract_control;
|
||||||
break;
|
break;
|
||||||
|
case 't':
|
||||||
|
optflag |= extract_fsys_tarfile;
|
||||||
|
break;
|
||||||
case 'X':
|
case 'X':
|
||||||
optflag |= extract_verbose_extract;
|
optflag |= extract_verbose_extract;
|
||||||
break;
|
break;
|
||||||
|
@ -24,7 +24,7 @@ extern int dpkg_deb_main(int argc, char **argv)
|
|||||||
int opt = 0;
|
int opt = 0;
|
||||||
int optflag = 0;
|
int optflag = 0;
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "cexXl")) != -1) {
|
while ((opt = getopt(argc, argv, "cetXxl")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'c':
|
case 'c':
|
||||||
optflag |= extract_contents;
|
optflag |= extract_contents;
|
||||||
@ -32,6 +32,9 @@ extern int dpkg_deb_main(int argc, char **argv)
|
|||||||
case 'e':
|
case 'e':
|
||||||
optflag |= extract_control;
|
optflag |= extract_control;
|
||||||
break;
|
break;
|
||||||
|
case 't':
|
||||||
|
optflag |= extract_fsys_tarfile;
|
||||||
|
break;
|
||||||
case 'X':
|
case 'X':
|
||||||
optflag |= extract_verbose_extract;
|
optflag |= extract_verbose_extract;
|
||||||
break;
|
break;
|
||||||
|
@ -265,13 +265,13 @@
|
|||||||
"WORK IN PROGRESS, only usefull for debian-installer"
|
"WORK IN PROGRESS, only usefull for debian-installer"
|
||||||
|
|
||||||
#define dpkg_deb_trivial_usage \
|
#define dpkg_deb_trivial_usage \
|
||||||
"[-cexX] file directory"
|
"[-cefxX] file directory"
|
||||||
#define dpkg_deb_full_usage \
|
#define dpkg_deb_full_usage \
|
||||||
"Perform actions on debian packages (.debs)\n\n" \
|
"Perform actions on debian packages (.debs)\n\n" \
|
||||||
"Options:\n" \
|
"Options:\n" \
|
||||||
"\t-c\tList contents of filesystem tree (verbose)\n" \
|
"\t-c\tList contents of filesystem tree\n" \
|
||||||
"\t-l\tList contents of filesystem tree (.list format)\n" \
|
|
||||||
"\t-e\tExtract control files to directory\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\tExctract packages filesystem tree to directory\n" \
|
||||||
"\t-X\tVerbose extract"
|
"\t-X\tVerbose extract"
|
||||||
#define dpkg_deb_example_usage \
|
#define dpkg_deb_example_usage \
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include "libbb.h"
|
#include "libbb.h"
|
||||||
|
|
||||||
@ -42,14 +43,9 @@ extern int deb_extract(const char *package_filename, int function, char *target_
|
|||||||
case (extract_control):
|
case (extract_control):
|
||||||
ared_file = xstrdup("control.tar.gz");
|
ared_file = xstrdup("control.tar.gz");
|
||||||
break;
|
break;
|
||||||
case (extract_contents):
|
default:
|
||||||
case (extract_extract):
|
|
||||||
case (extract_verbose_extract):
|
|
||||||
case (extract_list):
|
|
||||||
ared_file = xstrdup("data.tar.gz");
|
ared_file = xstrdup("data.tar.gz");
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
error_msg("Unknown extraction function");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* open the debian package to be worked on */
|
/* 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 */
|
/* open a stream of decompressed data */
|
||||||
uncompressed_file = fdopen(gz_open(deb_file, &gunzip_pid), "r");
|
uncompressed_file = fdopen(gz_open(deb_file, &gunzip_pid), "r");
|
||||||
|
|
||||||
/* get a list of all tar headers inside the .gz file */
|
if (function & extract_fsys_tarfile) {
|
||||||
untar(uncompressed_file, function, target_dir);
|
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 */
|
/* we are deliberately terminating the child so we can safely ignore this */
|
||||||
gz_close(gunzip_pid);
|
gz_close(gunzip_pid);
|
||||||
|
|
||||||
|
@ -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) {
|
while (fread((char *) &raw_tar_header, 1, 512, src_tar_file) == 512) {
|
||||||
long sum = 0;
|
long sum = 0;
|
||||||
char *dir = NULL;
|
char *dir = NULL;
|
||||||
|
|
||||||
|
if (ferror(src_tar_file) || feof(src_tar_file)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
uncompressed_count += 512;
|
uncompressed_count += 512;
|
||||||
|
|
||||||
/* Check header has valid magic */
|
/* Check header has valid magic */
|
||||||
if (strncmp(raw_tar_header.magic, "ustar", 5) != 0) {
|
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;
|
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);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case '5':
|
case '5':
|
||||||
if (untar_function & (extract_extract | extract_verbose_extract)) {
|
if (untar_function & extract_extract) {
|
||||||
if (create_path(dir, mode) != TRUE) {
|
if (create_path(dir, mode) != TRUE) {
|
||||||
free(dir);
|
free(dir);
|
||||||
perror_msg("%s: Cannot mkdir", raw_tar_header.name);
|
perror_msg("%s: Cannot mkdir", raw_tar_header.name);
|
||||||
|
6
usage.h
6
usage.h
@ -265,13 +265,13 @@
|
|||||||
"WORK IN PROGRESS, only usefull for debian-installer"
|
"WORK IN PROGRESS, only usefull for debian-installer"
|
||||||
|
|
||||||
#define dpkg_deb_trivial_usage \
|
#define dpkg_deb_trivial_usage \
|
||||||
"[-cexX] file directory"
|
"[-cefxX] file directory"
|
||||||
#define dpkg_deb_full_usage \
|
#define dpkg_deb_full_usage \
|
||||||
"Perform actions on debian packages (.debs)\n\n" \
|
"Perform actions on debian packages (.debs)\n\n" \
|
||||||
"Options:\n" \
|
"Options:\n" \
|
||||||
"\t-c\tList contents of filesystem tree (verbose)\n" \
|
"\t-c\tList contents of filesystem tree\n" \
|
||||||
"\t-l\tList contents of filesystem tree (.list format)\n" \
|
|
||||||
"\t-e\tExtract control files to directory\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\tExctract packages filesystem tree to directory\n" \
|
||||||
"\t-X\tVerbose extract"
|
"\t-X\tVerbose extract"
|
||||||
#define dpkg_deb_example_usage \
|
#define dpkg_deb_example_usage \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user