common: Add generic status print function.
authorWerner Koch <wk@gnupg.org>
Tue, 22 Jan 2019 08:02:17 +0000 (09:02 +0100)
committerWerner Koch <wk@gnupg.org>
Tue, 22 Jan 2019 08:02:17 +0000 (09:02 +0100)
* common/status.c (gnupg_set_status_fd): New.
(gnupg_status_printf): New.
* po/Makevars (XGETTEXT_OPTIONS): Add gnupg-status_printf.
--

Some of the extra tools take a --status-fd option to print certain
status messages.  A generic printf style print function thus makes
sense.

Signed-off-by: Werner Koch <wk@gnupg.org>
common/status.c
common/status.h
po/Makevars

index 50afce4..269ffea 100644 (file)
 #include "status.h"
 #include "status-codes.h"
 
+/* The stream to output the status information.  Output is disabled if
+ * this is NULL.  */
+static estream_t statusfp;
+
 
 /* Return the status string for code NO. */
 const char *
@@ -47,6 +51,60 @@ get_status_string ( int no )
 }
 
 
+/* Set a global status FD.  */
+void
+gnupg_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 output of the
+ * printf style FORMAT.  The caller needs to make sure that LFs and
+ * CRs are not printed.  */
+void
+gnupg_status_printf (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);
+}
+
+
 const char *
 get_inv_recpsgnr_code (gpg_error_t err)
 {
index dc62f36..aeab542 100644 (file)
@@ -163,6 +163,10 @@ enum
 
 
 const char *get_status_string (int code);
+void gnupg_set_status_fd (int fd);
+void gnupg_status_printf (int no, const char *format,
+                          ...) GPGRT_ATTR_PRINTF(2,3);
+
 const char *get_inv_recpsgnr_code (gpg_error_t err);
 
 
index 20d6ae9..07778e0 100644 (file)
@@ -61,6 +61,7 @@ XGETTEXT_OPTIONS = \
        --flag=ks_printf_help:2:c-format         \
        --flag=print_further_info:1:c-format     \
        --flag=write_status_printf:2:c-format    \
+       --flag=gnupg_printf_status:2:c-format    \
        --flag=kbxd_print_status:3:c-format      \
        --flag=gpgconf_write_status:2:c-format   \
         --flag=send_status_printf:3:c-format     \