summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2022-03-22 10:19:55 +0100
committerWerner Koch <wk@gnupg.org>2022-03-22 10:19:55 +0100
commited53d41b4c463072bac30b0e4c73f8bf445bd22d (patch)
tree70e419b21ec837f0f864304962bfc084f0c9e62f
parentdirmngr: Make WKD_GET work even for servers not handling SRV RRs. (diff)
downloadgnupg2-ed53d41b4c463072bac30b0e4c73f8bf445bd22d.tar.xz
gnupg2-ed53d41b4c463072bac30b0e4c73f8bf445bd22d.zip
gpgtar: New option --with-log
* tools/gpgtar.c: New option --with-log. * tools/gpgtar.h (opt): Add field with_log. * tools/gpgtar-extract.c (gpgtar_extract): Move directory string building up. Add option --log-file if needed. * tools/gpgtar-create.c (gpgtar_create): Make tmpbuf static becuase it is used outside of its scope. * tools/gpgtar-list.c (gpgtar_list): Ditto.
-rw-r--r--doc/tools.texi5
-rw-r--r--tools/gpgtar-create.c2
-rw-r--r--tools/gpgtar-extract.c81
-rw-r--r--tools/gpgtar-list.c2
-rw-r--r--tools/gpgtar.c3
-rw-r--r--tools/gpgtar.h1
6 files changed, 56 insertions, 38 deletions
diff --git a/doc/tools.texi b/doc/tools.texi
index cff649752..1632b1212 100644
--- a/doc/tools.texi
+++ b/doc/tools.texi
@@ -2025,6 +2025,11 @@ This option is passed directly to @command{gpg}.
Write special status strings to the file descriptor @var{n}.
See the file DETAILS in the documentation for a listing of them.
+@item --with-log
+@opindex with-log
+When extracting an encrypted tarball also write a log file with the
+gpg output to a file named after the extraction directory with the
+suffix ".log".
@item --set-filename @var{file}
@opindex set-filename
diff --git a/tools/gpgtar-create.c b/tools/gpgtar-create.c
index 7d7844960..63d0e831b 100644
--- a/tools/gpgtar-create.c
+++ b/tools/gpgtar-create.c
@@ -1160,7 +1160,7 @@ gpgtar_create (char **inpattern, const char *files_from, int null_names,
ccparray_put (&ccp, "--require-compliance");
if (opt.status_fd != -1)
{
- char tmpbuf[40];
+ static char tmpbuf[40];
snprintf (tmpbuf, sizeof tmpbuf, "--status-fd=%d", opt.status_fd);
ccparray_put (&ccp, tmpbuf);
diff --git a/tools/gpgtar-extract.c b/tools/gpgtar-extract.c
index 5f907733b..832039b2c 100644
--- a/tools/gpgtar-extract.c
+++ b/tools/gpgtar-extract.c
@@ -325,9 +325,46 @@ gpgtar_extract (const char *filename, int decrypt)
struct tarinfo_s tarinfo_buffer;
tarinfo_t tarinfo = &tarinfo_buffer;
pid_t pid = (pid_t)(-1);
+ char *logfilename = NULL;
+
memset (&tarinfo_buffer, 0, sizeof tarinfo_buffer);
+ if (opt.directory)
+ dirname = xtrystrdup (opt.directory);
+ else
+ {
+ if (opt.filename)
+ {
+ dirprefix = strrchr (opt.filename, '/');
+ if (dirprefix)
+ dirprefix++;
+ else
+ dirprefix = opt.filename;
+ }
+ else if (filename)
+ {
+ dirprefix = strrchr (filename, '/');
+ if (dirprefix)
+ dirprefix++;
+ else
+ dirprefix = filename;
+ }
+
+ if (!dirprefix || !*dirprefix)
+ dirprefix = "GPGARCH";
+
+ dirname = create_directory (dirprefix);
+ if (!dirname)
+ {
+ err = gpg_error (GPG_ERR_GENERAL);
+ goto leave;
+ }
+ }
+
+ if (opt.verbose)
+ log_info ("extracting to '%s/'\n", dirname);
+
if (decrypt)
{
strlist_t arg;
@@ -341,11 +378,17 @@ gpgtar_extract (const char *filename, int decrypt)
ccparray_put (&ccp, "--require-compliance");
if (opt.status_fd != -1)
{
- char tmpbuf[40];
+ static char tmpbuf[40];
snprintf (tmpbuf, sizeof tmpbuf, "--status-fd=%d", opt.status_fd);
ccparray_put (&ccp, tmpbuf);
}
+ if (opt.with_log)
+ {
+ ccparray_put (&ccp, "--log-file");
+ logfilename = xstrconcat (dirname, ".log", NULL);
+ ccparray_put (&ccp, logfilename);
+ }
ccparray_put (&ccp, "--output");
ccparray_put (&ccp, "-");
ccparray_put (&ccp, "--decrypt");
@@ -396,41 +439,6 @@ gpgtar_extract (const char *filename, int decrypt)
}
- if (opt.directory)
- dirname = xtrystrdup (opt.directory);
- else
- {
- if (opt.filename)
- {
- dirprefix = strrchr (opt.filename, '/');
- if (dirprefix)
- dirprefix++;
- else
- dirprefix = opt.filename;
- }
- else if (filename)
- {
- dirprefix = strrchr (filename, '/');
- if (dirprefix)
- dirprefix++;
- else
- dirprefix = filename;
- }
-
- if (!dirprefix || !*dirprefix)
- dirprefix = "GPGARCH";
-
- dirname = create_directory (dirprefix);
- if (!dirname)
- {
- err = gpg_error (GPG_ERR_GENERAL);
- goto leave;
- }
- }
-
- if (opt.verbose)
- log_info ("extracting to '%s/'\n", dirname);
-
for (;;)
{
err = gpgtar_read_header (stream, tarinfo, &header, &extheader);
@@ -470,6 +478,7 @@ gpgtar_extract (const char *filename, int decrypt)
free_strlist (extheader);
xfree (header);
xfree (dirname);
+ xfree (logfilename);
if (stream != es_stdin)
es_fclose (stream);
return err;
diff --git a/tools/gpgtar-list.c b/tools/gpgtar-list.c
index 9e175437b..08ab9672e 100644
--- a/tools/gpgtar-list.c
+++ b/tools/gpgtar-list.c
@@ -477,7 +477,7 @@ gpgtar_list (const char *filename, int decrypt)
ccparray_put (&ccp, "--require-compliance");
if (opt.status_fd != -1)
{
- char tmpbuf[40];
+ static char tmpbuf[40];
snprintf (tmpbuf, sizeof tmpbuf, "--status-fd=%d", opt.status_fd);
ccparray_put (&ccp, tmpbuf);
diff --git a/tools/gpgtar.c b/tools/gpgtar.c
index 732a592fb..8461666b9 100644
--- a/tools/gpgtar.c
+++ b/tools/gpgtar.c
@@ -81,6 +81,7 @@ enum cmd_and_opt_values
oAnswerNo,
oStatusFD,
oRequireCompliance,
+ oWithLog,
/* Compatibility with gpg-zip. */
oGpgArgs,
@@ -124,6 +125,7 @@ static gpgrt_opt_t opts[] = {
ARGPARSE_s_n (oAnswerNo, "no", "@"),
ARGPARSE_s_i (oStatusFD, "status-fd", "@"),
ARGPARSE_s_n (oRequireCompliance, "require-compliance", "@"),
+ ARGPARSE_s_n (oWithLog, "with-log", "@"),
ARGPARSE_group (302, N_("@\nTar options:\n ")),
@@ -391,6 +393,7 @@ parse_arguments (gpgrt_argparse_t *pargs, gpgrt_opt_t *popts)
case oAnswerNo: opt.answer_no = 1; break;
case oStatusFD: opt.status_fd = pargs->r.ret_int; break;
case oRequireCompliance: opt.require_compliance = 1; break;
+ case oWithLog: opt.with_log = 1; break;
case oGpgArgs:;
{
diff --git a/tools/gpgtar.h b/tools/gpgtar.h
index c403835b5..0854064fb 100644
--- a/tools/gpgtar.h
+++ b/tools/gpgtar.h
@@ -46,6 +46,7 @@ struct
int answer_no;
int status_fd;
int require_compliance;
+ int with_log;
} opt;