1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-12-22 10:19:57 +01:00

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.
This commit is contained in:
Werner Koch 2022-03-22 10:19:55 +01:00
parent 6d30fb6940
commit ce69d55f70
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
6 changed files with 56 additions and 38 deletions

View File

@ -1971,6 +1971,11 @@ This option is passed directly to @command{gpg}.
Write special status strings to the file descriptor @var{n}. Write special status strings to the file descriptor @var{n}.
See the file DETAILS in the documentation for a listing of them. 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} @item --set-filename @var{file}
@opindex set-filename @opindex set-filename

View File

@ -1170,7 +1170,7 @@ gpgtar_create (char **inpattern, const char *files_from, int null_names,
ccparray_put (&ccp, "--require-compliance"); ccparray_put (&ccp, "--require-compliance");
if (opt.status_fd != -1) if (opt.status_fd != -1)
{ {
char tmpbuf[40]; static char tmpbuf[40];
snprintf (tmpbuf, sizeof tmpbuf, "--status-fd=%d", opt.status_fd); snprintf (tmpbuf, sizeof tmpbuf, "--status-fd=%d", opt.status_fd);
ccparray_put (&ccp, tmpbuf); ccparray_put (&ccp, tmpbuf);

View File

@ -325,9 +325,46 @@ gpgtar_extract (const char *filename, int decrypt)
struct tarinfo_s tarinfo_buffer; struct tarinfo_s tarinfo_buffer;
tarinfo_t tarinfo = &tarinfo_buffer; tarinfo_t tarinfo = &tarinfo_buffer;
pid_t pid = (pid_t)(-1); pid_t pid = (pid_t)(-1);
char *logfilename = NULL;
memset (&tarinfo_buffer, 0, sizeof tarinfo_buffer); 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) if (decrypt)
{ {
strlist_t arg; strlist_t arg;
@ -341,11 +378,17 @@ gpgtar_extract (const char *filename, int decrypt)
ccparray_put (&ccp, "--require-compliance"); ccparray_put (&ccp, "--require-compliance");
if (opt.status_fd != -1) if (opt.status_fd != -1)
{ {
char tmpbuf[40]; static char tmpbuf[40];
snprintf (tmpbuf, sizeof tmpbuf, "--status-fd=%d", opt.status_fd); snprintf (tmpbuf, sizeof tmpbuf, "--status-fd=%d", opt.status_fd);
ccparray_put (&ccp, tmpbuf); 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, "--output");
ccparray_put (&ccp, "-"); ccparray_put (&ccp, "-");
ccparray_put (&ccp, "--decrypt"); 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 (;;) for (;;)
{ {
err = gpgtar_read_header (stream, tarinfo, &header, &extheader); err = gpgtar_read_header (stream, tarinfo, &header, &extheader);
@ -470,6 +478,7 @@ gpgtar_extract (const char *filename, int decrypt)
free_strlist (extheader); free_strlist (extheader);
xfree (header); xfree (header);
xfree (dirname); xfree (dirname);
xfree (logfilename);
if (stream != es_stdin) if (stream != es_stdin)
es_fclose (stream); es_fclose (stream);
return err; return err;

View File

@ -477,7 +477,7 @@ gpgtar_list (const char *filename, int decrypt)
ccparray_put (&ccp, "--require-compliance"); ccparray_put (&ccp, "--require-compliance");
if (opt.status_fd != -1) if (opt.status_fd != -1)
{ {
char tmpbuf[40]; static char tmpbuf[40];
snprintf (tmpbuf, sizeof tmpbuf, "--status-fd=%d", opt.status_fd); snprintf (tmpbuf, sizeof tmpbuf, "--status-fd=%d", opt.status_fd);
ccparray_put (&ccp, tmpbuf); ccparray_put (&ccp, tmpbuf);

View File

@ -81,6 +81,7 @@ enum cmd_and_opt_values
oAnswerNo, oAnswerNo,
oStatusFD, oStatusFD,
oRequireCompliance, oRequireCompliance,
oWithLog,
/* Compatibility with gpg-zip. */ /* Compatibility with gpg-zip. */
oGpgArgs, oGpgArgs,
@ -123,6 +124,7 @@ static ARGPARSE_OPTS opts[] = {
ARGPARSE_s_n (oAnswerNo, "no", "@"), ARGPARSE_s_n (oAnswerNo, "no", "@"),
ARGPARSE_s_i (oStatusFD, "status-fd", "@"), ARGPARSE_s_i (oStatusFD, "status-fd", "@"),
ARGPARSE_s_n (oRequireCompliance, "require-compliance", "@"), ARGPARSE_s_n (oRequireCompliance, "require-compliance", "@"),
ARGPARSE_s_n (oWithLog, "with-log", "@"),
ARGPARSE_group (302, N_("@\nTar options:\n ")), ARGPARSE_group (302, N_("@\nTar options:\n ")),
@ -389,6 +391,7 @@ parse_arguments (ARGPARSE_ARGS *pargs, ARGPARSE_OPTS *popts)
case oAnswerNo: opt.answer_no = 1; break; case oAnswerNo: opt.answer_no = 1; break;
case oStatusFD: opt.status_fd = pargs->r.ret_int; break; case oStatusFD: opt.status_fd = pargs->r.ret_int; break;
case oRequireCompliance: opt.require_compliance = 1; break; case oRequireCompliance: opt.require_compliance = 1; break;
case oWithLog: opt.with_log = 1; break;
case oGpgArgs:; case oGpgArgs:;
{ {

View File

@ -46,6 +46,7 @@ struct
int answer_no; int answer_no;
int status_fd; int status_fd;
int require_compliance; int require_compliance;
int with_log;
} opt; } opt;