Add logging functions to the API.
authorWerner Koch <wk@gnupg.org>
Mon, 30 Sep 2013 08:18:25 +0000 (10:18 +0200)
committerWerner Koch <wk@gnupg.org>
Mon, 30 Sep 2013 08:18:25 +0000 (10:18 +0200)
* src/gcrypt.h.in (_GCRY_GCC_ATTR_PRINTF): New.
(gcry_log_debug, gcry_log_debughex, gcry_log_debugmpi): New.
(gcry_log_debugpnt, gcry_log_debugsxp): New.
* src/visibility.c (gcry_log_debug): New.
(gcry_log_debughex, gcry_log_debugmpi, gcry_log_debugpnt): New.
(gcry_log_debugsxp): New.
* src/libgcrypt.def, src/libgcrypt.vers: Add new functions.
* src/misc.c (_gcry_logv): Make public.
(_gcry_log_printsxp): New.
* src/g10lib.h (log_printsxp): New macro.
--

For debugging applications it is often required to dump certain data
structures.  Libgcrypt uses several internal functions for this.  To
avoid re-implementing everything in the caller, we now provide access
to some of those functions.

Signed-off-by: Werner Koch <wk@gnupg.org>
NEWS
src/g10lib.h
src/gcrypt.h.in
src/libgcrypt.def
src/libgcrypt.vers
src/misc.c
src/visibility.c
src/visibility.h

diff --git a/NEWS b/NEWS
index 1e84cbe..c232a99 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -107,6 +107,10 @@ Noteworthy changes in version 1.6.0 (unreleased)
  GCRY_MD_STRIBOG512              NEW.
  GCRYCTL_DISABLE_ALGO            CHANGED: Not anymore thread-safe.
  GCRY_PK_ECC                     NEW.
+ gcry_log_debug                  NEW.
+ gcry_log_debughex               NEW.
+ gcry_log_debugmpi               NEW.
+ gcry_log_debugpnt               NEW.
 
 
 Noteworthy changes in version 1.5.0 (2011-06-29)
index 73ba683..ff7f4b3 100644 (file)
@@ -115,6 +115,8 @@ void _gcry_divide_by_zero (void) JNLIB_GCC_A_NR;
 
 const char *_gcry_gettext (const char *key) GCC_ATTR_FORMAT_ARG(1);
 void _gcry_fatal_error(int rc, const char *text ) JNLIB_GCC_A_NR;
+void _gcry_logv (int level,
+                 const char *fmt, va_list arg_ptr) JNLIB_GCC_A_PRINTF(2,0);
 void _gcry_log( int level, const char *fmt, ... ) JNLIB_GCC_A_PRINTF(2,3);
 void _gcry_log_bug( const char *fmt, ... )   JNLIB_GCC_A_NR_PRINTF(1,2);
 void _gcry_log_fatal( const char *fmt, ... ) JNLIB_GCC_A_NR_PRINTF(1,2);
@@ -126,6 +128,7 @@ void _gcry_log_debug( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2);
 void _gcry_log_printf ( const char *fmt, ... ) JNLIB_GCC_A_PRINTF(1,2);
 void _gcry_log_printhex (const char *text, const void *buffer, size_t length);
 void _gcry_log_printmpi (const char *text, gcry_mpi_t mpi);
+void _gcry_log_printsxp (const char *text, gcry_sexp_t sexp);
 
 void _gcry_set_log_verbosity( int level );
 int _gcry_log_verbosity( int level );
@@ -153,6 +156,7 @@ int _gcry_log_verbosity( int level );
 #define log_printf  _gcry_log_printf
 #define log_printhex _gcry_log_printhex
 #define log_printmpi _gcry_log_printmpi
+#define log_printsxp _gcry_log_printsxp
 
 /* Compatibility macro.  */
 #define log_mpidump _gcry_log_printmpi
index 5f49edc..8fca52e 100644 (file)
@@ -100,6 +100,8 @@ extern "C" {
 #define _GCRY_GCC_ATTR_MALLOC  __attribute__ ((__malloc__))
 #endif
 
+#define _GCRY_GCC_ATTR_PRINTF(f,a)  __attribute__ ((format (printf,f,a)))
+
 #endif /*__GNUC__*/
 
 #ifndef _GCRY_GCC_ATTR_DEPRECATED
@@ -111,6 +113,9 @@ extern "C" {
 #ifndef _GCRY_GCC_ATTR_MALLOC
 #define _GCRY_GCC_ATTR_MALLOC
 #endif
+#ifndef _GCRY_GCC_ATTR_PRINTF
+#define _GCRY_GCC_ATTR_PRINTF
+#endif
 
 /* Make up an attribute to mark functions and types as deprecated but
    allow internal use by Libgcrypt.  */
@@ -1405,6 +1410,15 @@ gcry_error_t gcry_prime_check (gcry_mpi_t x, unsigned int flags);
 /* Release the context object CTX.  */
 void gcry_ctx_release (gcry_ctx_t ctx);
 
+/* Log data using Libgcrypt's own log interface.  */
+void gcry_log_debug (const char *fmt, ...) _GCRY_GCC_ATTR_PRINTF(1,2);
+void gcry_log_debughex (const char *text, const void *buffer, size_t length);
+void gcry_log_debugmpi (const char *text, gcry_mpi_t mpi);
+void gcry_log_debugpnt (const char *text,
+                        gcry_mpi_point_t point, gcry_ctx_t ctx);
+void gcry_log_debugsxp (const char *text, gcry_sexp_t sexp);
+
+
 /* Log levels used by the internal logging facility. */
 enum gcry_log_levels
   {
index 9fa4245..7efb3b9 100644 (file)
@@ -247,5 +247,11 @@ EXPORTS
 
       gcry_md_hash_buffers      @219
 
+      gcry_log_debug            @220
+      gcry_log_debughex         @221
+      gcry_log_debugmpi         @222
+      gcry_log_debugpnt         @223
+      gcry_log_debugsxp         @224
+
 
 ;; end of file with public symbols for Windows.
index 904ab41..b1669fd 100644 (file)
@@ -101,6 +101,9 @@ GCRYPT_1.6 {
     gcry_mpi_ec_dup; gcry_mpi_ec_add; gcry_mpi_ec_mul;
     gcry_mpi_ec_curve_point;
 
+    gcry_log_debug;
+    gcry_log_debughex; gcry_log_debugmpi; gcry_log_debugpnt; gcry_log_debugsxp;
+
     _gcry_mpi_get_const;
 
     gcry_ctx_release;
index a19e1e4..d9b85cb 100644 (file)
@@ -115,7 +115,7 @@ _gcry_log_verbosity( int level )
  * This is our log function which prints all log messages to stderr or
  * using the function defined with gcry_set_log_handler().
  */
-static void
+void
 _gcry_logv( int level, const char *fmt, va_list arg_ptr )
 {
   if (log_handler)
@@ -361,6 +361,55 @@ _gcry_log_printmpi (const char *text, gcry_mpi_t mpi)
     }
 }
 
+/* Print SEXP in human readabale format.  With TEXT of NULL print just the raw
+   dump without any wrappping, with TEXT an empty string, print a
+   trailing linefeed, otherwise print the full debug output. */
+void
+_gcry_log_printsxp (const char *text, gcry_sexp_t sexp)
+{
+  int with_lf = 0;
+
+  if (text && *text)
+    {
+      if ((with_lf = strchr (text, '\n')))
+        log_debug ("%s", text);
+      else
+        log_debug ("%s: ", text);
+    }
+  if (sexp)
+    {
+      int any = 0;
+      char *buf, *p, *pend;
+      size_t size;
+
+      size = gcry_sexp_sprint (sexp, GCRYSEXP_FMT_ADVANCED, NULL, 0);
+      p = buf = gcry_xmalloc (size);
+      gcry_sexp_sprint (sexp, GCRYSEXP_FMT_ADVANCED, buf, size);
+
+      do
+        {
+          if (any && !with_lf)
+            log_debug ("%*s  ", (int)strlen(text), "");
+          else
+            any = 1;
+          pend = strchr (p, '\n');
+          size = pend? (pend - p) : strlen (p);
+          if (with_lf)
+            log_debug ("%.*s\n", (int)size, p);
+          else
+            log_printf ("%.*s\n", (int)size, p);
+          if (pend)
+            p = pend + 1;
+          else
+            p += size;
+        }
+      while (*p);
+      gcry_free (buf);
+    }
+  if (text)
+    log_printf ("\n");
+}
+
 
 void
 _gcry_burn_stack (unsigned int bytes)
index cfb159f..6e3c755 100644 (file)
@@ -1209,6 +1209,42 @@ gcry_ctx_release (gcry_ctx_t ctx)
 }
 
 void
+gcry_log_debug (const char *fmt, ...)
+{
+  va_list arg_ptr ;
+
+  va_start( arg_ptr, fmt ) ;
+  _gcry_logv (GCRY_LOG_DEBUG, fmt, arg_ptr);
+  va_end (arg_ptr);
+}
+
+void
+gcry_log_debughex (const char *text, const void *buffer, size_t length)
+{
+  _gcry_log_printhex (text, buffer, length);
+}
+
+void
+gcry_log_debugmpi (const char *text, gcry_mpi_t mpi)
+{
+  _gcry_log_printmpi (text, mpi);
+}
+
+void
+gcry_log_debugpnt (const char *text, mpi_point_t point, gcry_ctx_t ctx)
+{
+  mpi_ec_t ec = ctx? _gcry_ctx_get_pointer (ctx, CONTEXT_TYPE_EC) : NULL;
+
+  _gcry_mpi_point_log (text, point, ec);
+}
+
+void
+gcry_log_debugsxp (const char *text, gcry_sexp_t sexp)
+{
+  _gcry_log_printsxp (text, sexp);
+}
+
+void
 gcry_set_progress_handler (gcry_handler_progress_t cb, void *cb_data)
 {
   _gcry_set_progress_handler (cb, cb_data);
index 5e3556c..7e7793b 100644 (file)
@@ -604,6 +604,12 @@ MARK_VISIBLE (gcry_mpi_test_bit)
 
 MARK_VISIBLE (gcry_ctx_release)
 
+MARK_VISIBLEX(gcry_log_debug)
+MARK_VISIBLEX(gcry_log_debughex)
+MARK_VISIBLEX(gcry_log_debugmpi)
+MARK_VISIBLEX(gcry_log_debugpnt)
+MARK_VISIBLEX(gcry_log_debugsxp)
+
 /* Functions used to implement macros.  */
 MARK_VISIBLEX(_gcry_mpi_get_const)