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}.
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

View File

@ -1170,7 +1170,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);

View File

@ -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;

View File

@ -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);

View File

@ -81,6 +81,7 @@ enum cmd_and_opt_values
oAnswerNo,
oStatusFD,
oRequireCompliance,
oWithLog,
/* Compatibility with gpg-zip. */
oGpgArgs,
@ -123,6 +124,7 @@ static ARGPARSE_OPTS 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 ")),
@ -389,6 +391,7 @@ parse_arguments (ARGPARSE_ARGS *pargs, ARGPARSE_OPTS *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:;
{

View File

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