aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2016-12-08 16:55:36 +0000
committerWerner Koch <[email protected]>2016-12-08 16:56:12 +0000
commit4a04277ad112e0966296133795f93cf6a3daa48e (patch)
tree1c96d085431b97ec0bf0733c41ab665a73092dd2
parentgpgscm: Better error reporting. (diff)
downloadgnupg-4a04277ad112e0966296133795f93cf6a3daa48e.tar.gz
gnupg-4a04277ad112e0966296133795f93cf6a3daa48e.zip
wks: New option --status-fd for gpg-wks-client.
* tools/wks-util.c: Include status.h. (statusfp): New global var. (wks_set_status_fd): New func. (wks_write_status): New func. * tools/gpg-wks-client.c: Include status.h. (oStatusFD): New constant. (opts): New option --status-fd. (parse_arguments): Handle that option. (main): Return STATUS_SUCCESS or STATUS_FAILURE. -- This option is useful in case gpg-wks-client is spawed using a double fork approach which does not allow to return the exit code. Signed-off-by: Werner Koch <[email protected]>
-rw-r--r--tools/gpg-wks-client.c15
-rw-r--r--tools/gpg-wks.h2
-rw-r--r--tools/wks-util.c60
3 files changed, 76 insertions, 1 deletions
diff --git a/tools/gpg-wks-client.c b/tools/gpg-wks-client.c
index 1a53f391e..0f904242d 100644
--- a/tools/gpg-wks-client.c
+++ b/tools/gpg-wks-client.c
@@ -23,6 +23,7 @@
#include <string.h>
#include "util.h"
+#include "status.h"
#include "i18n.h"
#include "sysutils.h"
#include "init.h"
@@ -58,6 +59,7 @@ enum cmd_and_opt_values
oGpgProgram,
oSend,
oFakeSubmissionAddr,
+ oStatusFD,
oDummy
};
@@ -86,6 +88,7 @@ static ARGPARSE_OPTS opts[] = {
ARGPARSE_s_s (oGpgProgram, "gpg", "@"),
ARGPARSE_s_n (oSend, "send", "send the mail using sendmail"),
ARGPARSE_s_s (oOutput, "output", "|FILE|write the mail to FILE"),
+ ARGPARSE_s_i (oStatusFD, "status-fd", N_("|FD|write status info to this FD")),
ARGPARSE_s_s (oFakeSubmissionAddr, "fake-submission-addr", "@"),
@@ -197,6 +200,9 @@ parse_arguments (ARGPARSE_ARGS *pargs, ARGPARSE_OPTS *popts)
case oFakeSubmissionAddr:
fake_submission_addr = pargs->r.ret_str;
break;
+ case oStatusFD:
+ wks_set_status_fd (translate_sys2libc_fd_int (pargs->r.ret_int, 1));
+ break;
case aSupported:
case aCreate:
@@ -298,14 +304,21 @@ main (int argc, char **argv)
case aCheck:
if (argc != 1)
wrong_args ("--check USER-ID");
- command_check (argv[0]);
+ err = command_check (argv[0]);
break;
default:
usage (1);
+ err = 0;
break;
}
+ if (err)
+ wks_write_status (STATUS_FAILURE, "- %u", err);
+ else if (log_get_errorcount (0))
+ wks_write_status (STATUS_FAILURE, "- %u", GPG_ERR_GENERAL);
+ else
+ wks_write_status (STATUS_SUCCESS, NULL);
return log_get_errorcount (0)? 1:0;
}
diff --git a/tools/gpg-wks.h b/tools/gpg-wks.h
index 7f347eb3e..62ceb34f9 100644
--- a/tools/gpg-wks.h
+++ b/tools/gpg-wks.h
@@ -65,6 +65,8 @@ typedef struct policy_flags_s *policy_flags_t;
/*-- wks-util.c --*/
+void wks_set_status_fd (int fd);
+void wks_write_status (int no, const char *format, ...) GPGRT_ATTR_PRINTF(2,3);
gpg_error_t wks_list_key (estream_t key, char **r_fpr, strlist_t *r_mboxes);
gpg_error_t wks_send_mime (mime_maker_t mime);
gpg_error_t wks_parse_policy (policy_flags_t flags, estream_t stream,
diff --git a/tools/wks-util.c b/tools/wks-util.c
index f4f44f6b2..e6f6b7acd 100644
--- a/tools/wks-util.c
+++ b/tools/wks-util.c
@@ -23,6 +23,7 @@
#include <string.h>
#include "util.h"
+#include "status.h"
#include "ccparray.h"
#include "exectool.h"
#include "mbox-util.h"
@@ -30,6 +31,65 @@
#include "send-mail.h"
#include "gpg-wks.h"
+/* The stream to output the status information. Output is disabled if
+ this is NULL. */
+static estream_t statusfp;
+
+
+
+/* Set the status FD. */
+void
+wks_set_status_fd (int fd)
+{
+ static int last_fd = -1;
+
+ if (fd != -1 && last_fd == fd)
+ return;
+
+ if (statusfp && statusfp != es_stdout && statusfp != es_stderr)
+ es_fclose (statusfp);
+ statusfp = NULL;
+ if (fd == -1)
+ return;
+
+ if (fd == 1)
+ statusfp = es_stdout;
+ else if (fd == 2)
+ statusfp = es_stderr;
+ else
+ statusfp = es_fdopen (fd, "w");
+ if (!statusfp)
+ {
+ log_fatal ("can't open fd %d for status output: %s\n",
+ fd, gpg_strerror (gpg_error_from_syserror ()));
+ }
+ last_fd = fd;
+}
+
+
+/* Write a status line with code NO followed by the outout of the
+ * printf style FORMAT. The caller needs to make sure that LFs and
+ * CRs are not printed. */
+void
+wks_write_status (int no, const char *format, ...)
+{
+ va_list arg_ptr;
+
+ if (!statusfp)
+ return; /* Not enabled. */
+
+ es_fputs ("[GNUPG:] ", statusfp);
+ es_fputs (get_status_string (no), statusfp);
+ if (format)
+ {
+ es_putc (' ', statusfp);
+ va_start (arg_ptr, format);
+ es_vfprintf (statusfp, format, arg_ptr);
+ va_end (arg_ptr);
+ }
+ es_putc ('\n', statusfp);
+}
+
/* Helper for wks_list_key. */