diff options
author | Werner Koch <[email protected]> | 2006-09-10 12:24:40 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2006-09-10 12:24:40 +0000 |
commit | 5e2b62c996b1e3f5de2ff5bebd6da21102f06f7c (patch) | |
tree | 911533d14b5ff318b5fc6b0fd2dc132d6b8c253f /src/assuan-logging.c | |
parent | Changes to support gpg-error style error codes. (diff) | |
download | libassuan-5e2b62c996b1e3f5de2ff5bebd6da21102f06f7c.tar.gz libassuan-5e2b62c996b1e3f5de2ff5bebd6da21102f06f7c.zip |
fixes
Diffstat (limited to 'src/assuan-logging.c')
-rw-r--r-- | src/assuan-logging.c | 130 |
1 files changed, 129 insertions, 1 deletions
diff --git a/src/assuan-logging.c b/src/assuan-logging.c index 665efa9..cfc3d84 100644 --- a/src/assuan-logging.c +++ b/src/assuan-logging.c @@ -23,23 +23,29 @@ #include <config.h> #endif #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <stdarg.h> #ifdef HAVE_W32_SYSTEM #include <windows.h> #endif /*HAVE_W32_SYSTEM*/ #include <errno.h> +#include <ctype.h> #include "assuan-defs.h" static char prefix_buffer[80]; static FILE *_assuan_log; +static int full_logging; void _assuan_set_default_log_stream (FILE *fp) { if (!_assuan_log) - _assuan_log = fp; + { + _assuan_log = fp; + full_logging = !!getenv ("ASSUAN_FULL_LOGGING"); + } } void @@ -48,6 +54,22 @@ assuan_set_assuan_log_stream (FILE *fp) _assuan_log = fp; } + +/* Set the per context log stream. Also enable the default log stream + if it has not been set. */ +void +assuan_set_log_stream (assuan_context_t ctx, FILE *fp) +{ + if (ctx) + { + if (ctx->log_fp) + fflush (ctx->log_fp); + ctx->log_fp = fp; + _assuan_set_default_log_stream (fp); + } +} + + FILE * assuan_get_assuan_log_stream (void) { @@ -96,6 +118,112 @@ _assuan_log_printf (const char *format, ...) } +/* Dump a possibly binary string (used for debugging). Distinguish + ascii text from binary and print it accordingly. This function + takes FILE pointer arg becuase logging may be enabled on a per + context basis. */ +void +_assuan_log_print_buffer (FILE *fp, const void *buffer, size_t length) +{ + const unsigned char *s; + int n; + + for (n=length,s=buffer; n; n--, s++) + if ((!isascii (*s) || iscntrl (*s) || !isprint (*s)) && !(*s >= 0x80)) + break; + + s = buffer; + if (!n && *s != '[') + fwrite (buffer, length, 1, fp); + else + { +#ifdef HAVE_FLOCKFILE + flockfile (fp); +#endif + putc_unlocked ('[', fp); + if ( length > 16 && !full_logging) + { + for (n=0; n < 12; n++, s++) + fprintf (fp, " %02x", *s); + fprintf (fp, " ...(%d bytes skipped)", (int)length - 12); + } + else + { + for (n=0; n < length; n++, s++) + fprintf (fp, " %02x", *s); + } + putc_unlocked (' ', fp); + putc_unlocked (']', fp); +#ifdef HAVE_FUNLOCKFILE + funlockfile (fp); +#endif + } +} + +/* Log a user supplied string. Escapes non-printable before + printing. */ +void +_assuan_log_sanitized_string (const char *string) +{ + const unsigned char *s = (const unsigned char *) string; + FILE *fp = assuan_get_assuan_log_stream (); + + if (! *s) + return; + +#ifdef HAVE_FLOCKFILE + flockfile (fp); +#endif + + for (; *s; s++) + { + int c = 0; + + switch (*s) + { + case '\r': + c = 'r'; + break; + + case '\n': + c = 'n'; + break; + + case '\f': + c = 'f'; + break; + + case '\v': + c = 'v'; + break; + + case '\b': + c = 'b'; + break; + + default: + if ((isascii (*s) && isprint (*s)) || (*s >= 0x80)) + putc_unlocked (*s, fp); + else + { + putc_unlocked ('\\', fp); + fprintf (fp, "x%02x", *s); + } + } + + if (c) + { + putc_unlocked ('\\', fp); + putc_unlocked (c, fp); + } + } + +#ifdef HAVE_FUNLOCKFILE + funlockfile (fp); +#endif +} + + #ifdef HAVE_W32_SYSTEM const char * |