parent
63a09f826d
commit
b67be025eb
51
rpm-4.16.1.3-rpm2archive-error-handling.patch
Normal file
51
rpm-4.16.1.3-rpm2archive-error-handling.patch
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
From f1634250587479d664b34b6de1a6546b2c2b9de5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Florian Festi <ffesti@redhat.com>
|
||||||
|
Date: Mon, 18 Jan 2021 15:02:34 +0100
|
||||||
|
Subject: [PATCH] rpm2archive: Add more error handling
|
||||||
|
|
||||||
|
Cleanly error out if file can't be written instead of segfaulting
|
||||||
|
|
||||||
|
Resolves: #1091
|
||||||
|
---
|
||||||
|
rpm2archive.c | 17 ++++++++++++-----
|
||||||
|
1 file changed, 12 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/rpm2archive.c b/rpm2archive.c
|
||||||
|
index 646f1663d..15c5da016 100644
|
||||||
|
--- a/rpm2archive.c
|
||||||
|
+++ b/rpm2archive.c
|
||||||
|
@@ -119,9 +119,14 @@ static int process_package(rpmts ts, char * filename)
|
||||||
|
|
||||||
|
/* create archive */
|
||||||
|
a = archive_write_new();
|
||||||
|
- archive_write_add_filter_gzip(a);
|
||||||
|
- archive_write_set_format_pax_restricted(a);
|
||||||
|
-
|
||||||
|
+ if (archive_write_add_filter_gzip(a) != ARCHIVE_OK) {
|
||||||
|
+ fprintf(stderr, "Error: Could not create gzip output filter\n");
|
||||||
|
+ exit(EXIT_FAILURE);
|
||||||
|
+ }
|
||||||
|
+ if (archive_write_set_format_pax_restricted(a) != ARCHIVE_OK) {
|
||||||
|
+ fprintf(stderr, "Error: Format pax restricted is not supported\n");
|
||||||
|
+ exit(EXIT_FAILURE);
|
||||||
|
+ }
|
||||||
|
if (!strcmp(filename, "-")) {
|
||||||
|
if (isatty(STDOUT_FILENO)) {
|
||||||
|
fprintf(stderr, "Error: refusing to output archive data to a terminal.\n");
|
||||||
|
@@ -130,9 +135,11 @@ static int process_package(rpmts ts, char * filename)
|
||||||
|
archive_write_open_fd(a, STDOUT_FILENO);
|
||||||
|
} else {
|
||||||
|
char * outname = rstrscat(NULL, filename, ".tgz", NULL);
|
||||||
|
- archive_write_open_filename(a, outname);
|
||||||
|
+ if (archive_write_open_filename(a, outname) != ARCHIVE_OK) {
|
||||||
|
+ fprintf(stderr, "Error: Can't open output file: %s\n", outname);
|
||||||
|
+ exit(EXIT_FAILURE);
|
||||||
|
+ }
|
||||||
|
_free(outname);
|
||||||
|
- // XXX error handling
|
||||||
|
}
|
||||||
|
|
||||||
|
entry = archive_entry_new();
|
||||||
|
--
|
||||||
|
2.38.1
|
||||||
|
|
173
rpm-4.16.1.3-rpm2archive-nocompression.patch
Normal file
173
rpm-4.16.1.3-rpm2archive-nocompression.patch
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
From d8a169164cf40fc1cf6448792c1fa991f19bb375 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Florian Festi <ffesti@redhat.com>
|
||||||
|
Date: Thu, 22 Apr 2021 14:50:34 +0200
|
||||||
|
Subject: [PATCH] Add --nocompression option to rpm2archive
|
||||||
|
|
||||||
|
Also use popt for the command line handling. As we are using librpm
|
||||||
|
anyway there is no reason to keep the dependencies low (as with
|
||||||
|
rpm2cpio).
|
||||||
|
|
||||||
|
Resolves: #1530
|
||||||
|
---
|
||||||
|
doc/rpm2archive.8 | 16 ++++++++++---
|
||||||
|
rpm2archive.c | 60 ++++++++++++++++++++++++++++++++++-------------
|
||||||
|
2 files changed, 57 insertions(+), 19 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/doc/rpm2archive.8 b/doc/rpm2archive.8
|
||||||
|
index 8bd6d4ed9d..3895d01981 100644
|
||||||
|
--- a/doc/rpm2archive.8
|
||||||
|
+++ b/doc/rpm2archive.8
|
||||||
|
@@ -3,10 +3,10 @@
|
||||||
|
.SH NAME
|
||||||
|
rpm2archive \- Create tar archive from RPM Package Manager (RPM) package.
|
||||||
|
.SH SYNOPSIS
|
||||||
|
-\fBrpm2archive\fP [filename]
|
||||||
|
+\fBrpm2archive\fP \fB{-n|--nocompression}\fR \fB\fIFILES\fB\fR
|
||||||
|
.SH DESCRIPTION
|
||||||
|
-\fBrpm2archive\fP converts the .rpm files specified as arguments to gz
|
||||||
|
-compressed tar files with suffix ".tgz".
|
||||||
|
+\fBrpm2archive\fP converts the .rpm files specified as arguments to
|
||||||
|
+tar files. By default they are gzip compressed and saved with postfix ".tgz".
|
||||||
|
|
||||||
|
If '-' is given as argument, an rpm stream is read from standard in and
|
||||||
|
written to standard out.
|
||||||
|
@@ -16,6 +16,16 @@ containing files greater than 4GB which are not supported by cpio. Unless
|
||||||
|
\fBrpm2cpio\fP \fBrpm2archive\fP needs a working rpm installation which limits
|
||||||
|
its usefulness for some disaster recovery scenarios.
|
||||||
|
|
||||||
|
+.SH "OPTIONS"
|
||||||
|
+.TP
|
||||||
|
+\fB\-n, --nocompression\fR
|
||||||
|
+Generate uncompressed tar archive and use ".tar" as postfix of the
|
||||||
|
+file name.
|
||||||
|
+.PP
|
||||||
|
+
|
||||||
|
+.SH EXAMPLES
|
||||||
|
+.PP
|
||||||
|
+
|
||||||
|
.br
|
||||||
|
.I "\fBrpm2archive glint-1.0-1.i386.rpm ; tar -xvz glint-1.0-1.i386.rpm.tgz\fP"
|
||||||
|
.br
|
||||||
|
diff --git a/rpm2archive.c b/rpm2archive.c
|
||||||
|
index d96db006ea..cb39c7a712 100644
|
||||||
|
--- a/rpm2archive.c
|
||||||
|
+++ b/rpm2archive.c
|
||||||
|
@@ -10,6 +10,8 @@
|
||||||
|
|
||||||
|
#include <rpm/rpmts.h>
|
||||||
|
|
||||||
|
+#include <popt.h>
|
||||||
|
+
|
||||||
|
#include <archive.h>
|
||||||
|
#include <archive_entry.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
@@ -18,6 +20,16 @@
|
||||||
|
|
||||||
|
#define BUFSIZE (128*1024)
|
||||||
|
|
||||||
|
+int compress = 1;
|
||||||
|
+
|
||||||
|
+static struct poptOption optionsTable[] = {
|
||||||
|
+ { "nocompression", 'n', POPT_ARG_VAL, &compress, 0,
|
||||||
|
+ N_("create uncompressed tar file"),
|
||||||
|
+ NULL },
|
||||||
|
+ POPT_AUTOHELP
|
||||||
|
+ POPT_TABLEEND
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static void fill_archive_entry(struct archive * a, struct archive_entry * entry, rpmfi fi)
|
||||||
|
{
|
||||||
|
archive_entry_clear(entry);
|
||||||
|
@@ -60,7 +72,7 @@ static void write_file_content(struct archive * a, char * buf, rpmfi fi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int process_package(rpmts ts, char * filename)
|
||||||
|
+static int process_package(rpmts ts, const char * filename)
|
||||||
|
{
|
||||||
|
FD_t fdi;
|
||||||
|
FD_t gzdi;
|
||||||
|
@@ -119,9 +131,11 @@ static int process_package(rpmts ts, char * filename)
|
||||||
|
|
||||||
|
/* create archive */
|
||||||
|
a = archive_write_new();
|
||||||
|
- if (archive_write_add_filter_gzip(a) != ARCHIVE_OK) {
|
||||||
|
- fprintf(stderr, "Error: Could not create gzip output filter\n");
|
||||||
|
- exit(EXIT_FAILURE);
|
||||||
|
+ if (compress) {
|
||||||
|
+ if (archive_write_add_filter_gzip(a) != ARCHIVE_OK) {
|
||||||
|
+ fprintf(stderr, "%s\n", archive_error_string(a));
|
||||||
|
+ exit(EXIT_FAILURE);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
if (archive_write_set_format_pax_restricted(a) != ARCHIVE_OK) {
|
||||||
|
fprintf(stderr, "Error: Format pax restricted is not supported\n");
|
||||||
|
@@ -142,7 +156,12 @@ static int process_package(rpmts ts, char * filename)
|
||||||
|
}
|
||||||
|
archive_write_open_fd(a, STDOUT_FILENO);
|
||||||
|
} else {
|
||||||
|
- char * outname = rstrscat(NULL, filename, ".tgz", NULL);
|
||||||
|
+ char * outname = rstrscat(NULL, filename, NULL);
|
||||||
|
+ if (compress) {
|
||||||
|
+ outname = rstrscat(&outname, ".tgz", NULL);
|
||||||
|
+ } else {
|
||||||
|
+ outname = rstrscat(&outname, ".tar", NULL);
|
||||||
|
+ }
|
||||||
|
if (archive_write_open_filename(a, outname) != ARCHIVE_OK) {
|
||||||
|
fprintf(stderr, "Error: Can't open output file: %s\n", outname);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
@@ -203,21 +222,22 @@ static int process_package(rpmts ts, char * filename)
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int main(int argc, char *argv[])
|
||||||
|
+int main(int argc, const char *argv[])
|
||||||
|
{
|
||||||
|
- int rc = 0, i;
|
||||||
|
+ int rc = 0;
|
||||||
|
+ poptContext optCon;
|
||||||
|
+ const char *fn;
|
||||||
|
|
||||||
|
xsetprogname(argv[0]); /* Portability call -- see system.h */
|
||||||
|
rpmReadConfigFiles(NULL, NULL);
|
||||||
|
|
||||||
|
- if (argc > 1 && (rstreq(argv[1], "-h") || rstreq(argv[1], "--help"))) {
|
||||||
|
- fprintf(stderr, "Usage: %s [file.rpm ...]\n", argv[0]);
|
||||||
|
+ optCon = poptGetContext(NULL, argc, argv, optionsTable, 0);
|
||||||
|
+ poptSetOtherOptionHelp(optCon, "[OPTIONS]* <FILES>");
|
||||||
|
+ if (argc < 2 || poptGetNextOpt(optCon) == 0) {
|
||||||
|
+ poptPrintUsage(optCon, stderr, 0);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (argc == 1)
|
||||||
|
- argv[argc++] = "-"; /* abuse NULL pointer at the end of argv */
|
||||||
|
-
|
||||||
|
rpmts ts = rpmtsCreate();
|
||||||
|
rpmVSFlags vsflags = 0;
|
||||||
|
|
||||||
|
@@ -227,13 +247,21 @@ int main(int argc, char *argv[])
|
||||||
|
vsflags |= RPMVSF_NOHDRCHK;
|
||||||
|
(void) rpmtsSetVSFlags(ts, vsflags);
|
||||||
|
|
||||||
|
- for (i = 1; i < argc; i++) {
|
||||||
|
+ /* if no file name is given use stdin/stdout */
|
||||||
|
+ if (!poptPeekArg(optCon)) {
|
||||||
|
+ rc = process_package(ts, "-");
|
||||||
|
+ if (rc != 0)
|
||||||
|
+ goto exit;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- rc = process_package(ts, argv[i]);
|
||||||
|
+ while ((fn = poptGetArg(optCon)) != NULL) {
|
||||||
|
+ rc = process_package(ts, fn);
|
||||||
|
if (rc != 0)
|
||||||
|
- return rc;
|
||||||
|
+ goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ exit:
|
||||||
|
+ poptFreeContext(optCon);
|
||||||
|
(void) rpmtsFree(ts);
|
||||||
|
return rc;
|
||||||
|
}
|
3
rpm.spec
3
rpm.spec
@ -88,6 +88,8 @@ Patch116: rpm-4.16.1.3-bcond-macros.patch
|
|||||||
Patch117: rpm-4.16.1.3-caret-query.patch
|
Patch117: rpm-4.16.1.3-caret-query.patch
|
||||||
Patch118: rpm-4.16.1.3-caret-query2.patch
|
Patch118: rpm-4.16.1.3-caret-query2.patch
|
||||||
Patch119: rpm-4.18-libselinux-log.patch
|
Patch119: rpm-4.18-libselinux-log.patch
|
||||||
|
Patch120: rpm-4.16.1.3-rpm2archive-error-handling.patch
|
||||||
|
Patch121: rpm-4.16.1.3-rpm2archive-nocompression.patch
|
||||||
|
|
||||||
# These are not yet upstream
|
# These are not yet upstream
|
||||||
Patch906: rpm-4.7.1-geode-i686.patch
|
Patch906: rpm-4.7.1-geode-i686.patch
|
||||||
@ -626,6 +628,7 @@ fi
|
|||||||
- Fix db queries with carets (#2129468)
|
- Fix db queries with carets (#2129468)
|
||||||
- Remove spurious Python rpm module (#2135731)
|
- Remove spurious Python rpm module (#2135731)
|
||||||
- Handle SELinux log messages (#2123719)
|
- Handle SELinux log messages (#2123719)
|
||||||
|
- Add --nocompression to rpm2archive (#2150804)
|
||||||
|
|
||||||
* Fri Oct 21 2022 Michal Domonkos <mdomonko@redhat.com> - 4.16.1.3-19
|
* Fri Oct 21 2022 Michal Domonkos <mdomonko@redhat.com> - 4.16.1.3-19
|
||||||
- Bump release for rebuild
|
- Bump release for rebuild
|
||||||
|
Loading…
Reference in New Issue
Block a user