From 33b6ee5047c8992fe65c494313b6c0f468969188 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Fri, 20 Jan 2023 09:00:31 +0100 Subject: [PATCH] wkd: Support option --output for command --check. * tools/wks-util.c (write_to_file): Rename to ... (wks_write_to_file): this, make global, and support NULL for fname. * tools/gpg-wks-client.c (command_check): Write to key. --- doc/wks.texi | 4 +++- tools/gpg-wks-client.c | 13 +++++++++++++ tools/gpg-wks.h | 1 + tools/wks-util.c | 32 ++++++++++++++++++++++---------- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/doc/wks.texi b/doc/wks.texi index a7805a34a..39e345f15 100644 --- a/doc/wks.texi +++ b/doc/wks.texi @@ -189,7 +189,9 @@ fields are (future versions may specify additional fields): @itemx -o @opindex output Write the created mail to @var{file} instead of stdout. Note that the -value @code{-} for @var{file} is the same as writing to stdout. +value @code{-} for @var{file} is the same as writing to stdout. If +this option is used with the @option{--check} command and a key was +found it is written to the given file. @item --status-fd @var{n} @opindex status-fd diff --git a/tools/gpg-wks-client.c b/tools/gpg-wks-client.c index c603cc043..521222631 100644 --- a/tools/gpg-wks-client.c +++ b/tools/gpg-wks-client.c @@ -1126,6 +1126,19 @@ command_check (char *userid) addrspec); err = gpg_error (GPG_ERR_CERT_REVOKED); } + else if (opt.output) + { + /* Save to file. */ + const char *fname = opt.output; + + if (*fname == '-' && !fname[1]) + fname = NULL; + es_rewind (key); + err = wks_write_to_file (key, fname); + if (err) + log_error ("writing key to '%s' failed: %s\n", + fname? fname : "[stdout]", gpg_strerror (err)); + } leave: xfree (fpr); diff --git a/tools/gpg-wks.h b/tools/gpg-wks.h index a7c17ca52..93039c1e8 100644 --- a/tools/gpg-wks.h +++ b/tools/gpg-wks.h @@ -106,6 +106,7 @@ gpg_error_t wks_send_mime (mime_maker_t mime); gpg_error_t wks_parse_policy (policy_flags_t flags, estream_t stream, int ignore_unknown); void wks_free_policy (policy_flags_t policy); +gpg_error_t wks_write_to_file (estream_t src, const char *fname); gpg_error_t wks_fname_from_userid (const char *userid, int hash_only, char **r_fname, char **r_addrspec); diff --git a/tools/wks-util.c b/tools/wks-util.c index 6caa4ee82..0aeb94b1d 100644 --- a/tools/wks-util.c +++ b/tools/wks-util.c @@ -892,18 +892,27 @@ wks_free_policy (policy_flags_t policy) } -/* Write the content of SRC to the new file FNAME. */ -static gpg_error_t -write_to_file (estream_t src, const char *fname) +/* Write the content of SRC to the new file FNAME. If FNAME is NULL + * SRC is written to stdout. */ +gpg_error_t +wks_write_to_file (estream_t src, const char *fname) { gpg_error_t err; estream_t dst; char buffer[4096]; size_t nread, written; - dst = es_fopen (fname, "wb"); - if (!dst) - return gpg_error_from_syserror (); + if (!fname) + { + dst = es_stdout; + es_set_binary (es_stdout); + } + else + { + dst = es_fopen (fname, "wb"); + if (!dst) + return gpg_error_from_syserror (); + } do { @@ -918,12 +927,15 @@ write_to_file (estream_t src, const char *fname) if (!es_feof (src) || es_ferror (src) || es_ferror (dst)) { err = gpg_error_from_syserror (); - es_fclose (dst); - gnupg_remove (fname); + if (dst != es_stdout) + { + es_fclose (dst); + gnupg_remove (fname); + } return err; } - if (es_fclose (dst)) + if (dst != es_stdout && es_fclose (dst)) { err = gpg_error_from_syserror (); log_error ("error closing '%s': %s\n", fname, gpg_strerror (err)); @@ -1225,7 +1237,7 @@ wks_install_key_core (estream_t key, const char *addrspec) goto leave; /* Publish. */ - err = write_to_file (key, huname); + err = wks_write_to_file (key, huname); if (err) { log_error ("copying key to '%s' failed: %s\n", huname,gpg_strerror (err));