diff options
author | Werner Koch <[email protected]> | 2006-11-14 16:56:07 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2006-11-14 16:56:07 +0000 |
commit | 2cf3dcd3dcfe00321e8ca65ac2ffb4ebb8e7bb29 (patch) | |
tree | 3ab5d8087db4caaa8271af8403f4b565aacf31f6 | |
parent | Post release updates (diff) | |
download | libassuan-2cf3dcd3dcfe00321e8ca65ac2ffb4ebb8e7bb29.tar.gz libassuan-2cf3dcd3dcfe00321e8ca65ac2ffb4ebb8e7bb29.zip |
New functions assuan_set_io_monitor and assuan_register_post_cmd_notify
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | doc/assuan.texi | 18 | ||||
-rw-r--r-- | src/ChangeLog | 12 | ||||
-rw-r--r-- | src/assuan-buffer.c | 57 | ||||
-rw-r--r-- | src/assuan-defs.h | 14 | ||||
-rw-r--r-- | src/assuan-handler.c | 13 | ||||
-rw-r--r-- | src/assuan-util.c | 15 | ||||
-rw-r--r-- | src/assuan.h | 11 | ||||
-rw-r--r-- | src/libassuan.m4 | 15 |
9 files changed, 147 insertions, 12 deletions
@@ -1,6 +1,10 @@ Noteworthy changes in version 1.0.1 ------------------------------------------------ + * New function: assuan_set_io_monitor. + + * New function: assuan_register_post_cmd_notify. + Noteworthy changes in version 1.0.0 (2006-10-31) ------------------------------------------------ diff --git a/doc/assuan.texi b/doc/assuan.texi index cdd5b1c..434386d 100644 --- a/doc/assuan.texi +++ b/doc/assuan.texi @@ -943,6 +943,14 @@ application. Instead special functions should be used to get hold of these commands. @end deftypefun +@deftypefun assuan_error_t assuan_register_post_cmd_notify (@w{assuan_context_t @var{ctx}}, @w{void (*@var{fnc})(assuan_context_t)}, @w{int @var{err}}) + +Register a function to be called right after a command has been +processed. @var{err} is the result code from the last internal assuan +operation and not the one returned by the handler. It may be used to +command related cleanup. +@end deftypefun + @deftypefun assuan_error_t assuan_register_bye_notify (@w{assuan_context_t @var{ctx}}, @w{void (*@var{fnc})(assuan_context_t)}) Register function @var{fnc} with context @var{ctx} to be called right @@ -1320,6 +1328,16 @@ thus an entire assuan line may be read without triggering any actual I/O. @end deftypefun +@deftypefun void assuan_set_io_monitor (@w{assuan_context_t @var{ctx}}, @w{unsigned int} (*@var{monitor})(@w{assuan_context_t @var{ctx}}, @w{int @var{direction}}, @w{const char *@var{line}}, @w{size_t @var{linelen}})) + +This function registers an I/O monitor for the context @var{ctx}. Such +a monitor function is called right after a line has been received or +just before it is send. With @var{direction} set to 1 the monitor has +been called for an output operation; 0 obviosuly means it has been +called for an input operation. If the monitor sets bit 0 in the return +value, any active logging of the line will be suppressed. With bit 1 +set, the entire line will be ignored. +@end deftypefun @deftypefun void assuan_begin_confidential (@w{assuan_context_t @var{ctx}}) diff --git a/src/ChangeLog b/src/ChangeLog index b5bef81..e651060 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,15 @@ +2006-11-14 Werner Koch <[email protected]> + + * libassuan.m4 (AM_CHECK_LIBASSUAN): New. + + * assuan-handler.c (assuan_register_post_cmd_notify) + (assuan_register_post_cmd_notify): New. + * assuan-util.c (assuan_set_io_monitor): New. + * assuan-buffer.c (_assuan_read_line): Use it. + (_assuan_write_line): Ditto. + (_assuan_cookie_write_data): Ditto. + (_assuan_cookie_write_flush): Ditto. + 2006-10-18 Werner Koch <[email protected]> * libassuan.m4: Pass "pthread" to the common macro. Reported by diff --git a/src/assuan-buffer.c b/src/assuan-buffer.c index 228aa7c..b06025b 100644 --- a/src/assuan-buffer.c +++ b/src/assuan-buffer.c @@ -1,5 +1,5 @@ /* assuan-buffer.c - read and send data - * Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + * Copyright (C) 2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc. * * This file is part of Assuan. * @@ -159,7 +159,9 @@ _assuan_read_line (assuan_context_t ctx) if (endp) { + unsigned monitor_result; int n = endp - line + 1; + if (n < nread) /* LINE contains more than one line. We copy it to the attic now as handlers are allowed to modify the passed @@ -176,7 +178,16 @@ _assuan_read_line (assuan_context_t ctx) *endp = 0; ctx->inbound.linelen = endp - line; - if (ctx->log_fp) + + monitor_result = (ctx->io_monitor + ? ctx->io_monitor (ctx, 0, + ctx->inbound.line, + ctx->inbound.linelen) + : 0); + if ( (monitor_result & 2) ) + ctx->inbound.linelen = 0; + + if (ctx->log_fp && !(monitor_result & 1)) { fprintf (ctx->log_fp, "%s[%u.%d] DBG: <- ", assuan_get_assuan_log_prefix (), @@ -245,6 +256,7 @@ _assuan_write_line (assuan_context_t ctx, const char *prefix, { assuan_error_t rc = 0; size_t prefixlen = prefix? strlen (prefix):0; + unsigned int monitor_result; /* Make sure that the line is short enough. */ if (len + prefixlen + 2 > ASSUAN_LINELENGTH) @@ -260,8 +272,12 @@ _assuan_write_line (assuan_context_t ctx, const char *prefix, len = ASSUAN_LINELENGTH - prefixlen - 2 - 1; } + monitor_result = (ctx->io_monitor + ? ctx->io_monitor (ctx, 1, line, len) + : 0); + /* Fixme: we should do some kind of line buffering. */ - if (ctx->log_fp) + if (ctx->log_fp && !(monitor_result & 1)) { fprintf (ctx->log_fp, "%s[%u.%d] DBG: -> ", assuan_get_assuan_log_prefix (), @@ -277,13 +293,13 @@ _assuan_write_line (assuan_context_t ctx, const char *prefix, putc ('\n', ctx->log_fp); } - if (prefixlen) + if (prefixlen && !(monitor_result & 2)) { rc = writen (ctx, prefix, prefixlen); if (rc) rc = _assuan_error (ASSUAN_Write_Error); } - if (!rc) + if (!rc && !(monitor_result & 2)) { rc = writen (ctx, line, len); if (rc) @@ -325,7 +341,7 @@ assuan_write_line (assuan_context_t ctx, const char *line) /* Write out the data in buffer as datalines with line wrapping and - percent escaping. This function is used for GNU's custom streams */ + percent escaping. This function is used for GNU's custom streams. */ int _assuan_cookie_write_data (void *cookie, const char *buffer, size_t orig_size) { @@ -342,7 +358,9 @@ _assuan_cookie_write_data (void *cookie, const char *buffer, size_t orig_size) line += linelen; while (size) { - /* insert data line header */ + unsigned int monitor_result; + + /* Insert data line header. */ if (!linelen) { *line++ = 'D'; @@ -350,7 +368,7 @@ _assuan_cookie_write_data (void *cookie, const char *buffer, size_t orig_size) linelen += 2; } - /* copy data, keep some space for the CRLF and to escape one character */ + /* Copy data, keep space for the CRLF and to escape one character. */ while (size && linelen < LINELENGTH-2-2) { if (*buffer == '%' || *buffer == '\r' || *buffer == '\n') @@ -368,9 +386,15 @@ _assuan_cookie_write_data (void *cookie, const char *buffer, size_t orig_size) size--; } + + monitor_result = (ctx->io_monitor + ? ctx->io_monitor (ctx, 1, + ctx->outbound.data.line, linelen) + : 0); + if (linelen >= LINELENGTH-2-2) { - if (ctx->log_fp) + if (ctx->log_fp && !(monitor_result & 1)) { fprintf (ctx->log_fp, "%s[%u.%d] DBG: -> ", assuan_get_assuan_log_prefix (), @@ -386,7 +410,8 @@ _assuan_cookie_write_data (void *cookie, const char *buffer, size_t orig_size) } *line++ = '\n'; linelen++; - if (writen (ctx, ctx->outbound.data.line, linelen)) + if ( !(monitor_result & 2) + && writen (ctx, ctx->outbound.data.line, linelen)) { ctx->outbound.data.error = _assuan_error (ASSUAN_Write_Error); return 0; @@ -409,6 +434,7 @@ _assuan_cookie_write_flush (void *cookie) assuan_context_t ctx = cookie; char *line; size_t linelen; + unsigned int monitor_result; if (ctx->outbound.data.error) return 0; @@ -416,9 +442,15 @@ _assuan_cookie_write_flush (void *cookie) line = ctx->outbound.data.line; linelen = ctx->outbound.data.linelen; line += linelen; + + monitor_result = (ctx->io_monitor + ? ctx->io_monitor (ctx, 1, + ctx->outbound.data.line, linelen) + : 0); + if (linelen) { - if (ctx->log_fp) + if (ctx->log_fp && !(monitor_result & 1)) { fprintf (ctx->log_fp, "%s[%u.%d] DBG: -> ", assuan_get_assuan_log_prefix (), @@ -432,7 +464,8 @@ _assuan_cookie_write_flush (void *cookie) } *line++ = '\n'; linelen++; - if (writen (ctx, ctx->outbound.data.line, linelen)) + if ( !(monitor_result & 2) + && writen (ctx, ctx->outbound.data.line, linelen)) { ctx->outbound.data.error = _assuan_error (ASSUAN_Write_Error); return 0; diff --git a/src/assuan-defs.h b/src/assuan-defs.h index 5bf1b9e..fa04f0b 100644 --- a/src/assuan-defs.h +++ b/src/assuan-defs.h @@ -179,6 +179,20 @@ struct assuan_context_s void (*input_notify_fnc)(assuan_context_t, const char *); void (*output_notify_fnc)(assuan_context_t, const char *); + /* This function is called right after a command has been processed. + It may be used to command related cleanup. */ + void (*post_cmd_notify_fnc)(assuan_context_t, int); + + /* If set, this is called right before logging an I/O line. With + DIRECTION set to 1 it is called for an output oeration; 0 means + an input operation. If bit 0 is set in the return value, the + logging of the will be suppressed. With bit 1 set, the entire + line will be ignored. */ + unsigned int (*io_monitor)(assuan_context_t ctx, + int direction, + const char *line, + size_t linelen); + int input_fd; /* set by INPUT command */ int output_fd; /* set by OUTPUT command */ diff --git a/src/assuan-handler.c b/src/assuan-handler.c index 19dab71..fd3a52b 100644 --- a/src/assuan-handler.c +++ b/src/assuan-handler.c @@ -292,6 +292,16 @@ assuan_register_command (assuan_context_t ctx, } int +assuan_register_post_cmd_notify (assuan_context_t ctx, + void (*fnc)(assuan_context_t, int)) +{ + if (!ctx) + return _assuan_error (ASSUAN_Invalid_Value); + ctx->post_cmd_notify_fnc = fnc; + return 0; +} + +int assuan_register_bye_notify (assuan_context_t ctx, void (*fnc)(assuan_context_t)) { @@ -543,6 +553,9 @@ process_request (assuan_context_t ctx) rc = assuan_write_line (ctx, errline); } + if (ctx->post_cmd_notify_fnc) + ctx->post_cmd_notify_fnc (ctx, rc); + ctx->confidential = 0; if (ctx->okay_line) { diff --git a/src/assuan-util.c b/src/assuan-util.c index 3e627fc..d12277f 100644 --- a/src/assuan-util.c +++ b/src/assuan-util.c @@ -125,6 +125,21 @@ assuan_end_confidential (assuan_context_t ctx) } +void +assuan_set_io_monitor (assuan_context_t ctx, + unsigned int (*monitor)(assuan_context_t ctx, + int direction, + const char *line, + size_t linelen)) +{ + if (ctx) + { + ctx->io_monitor = monitor; + } +} + + + /* For context CTX, set the flag FLAG to VALUE. Values for flags are usually 1 or 0 but certain flags might allow for other values; diff --git a/src/assuan.h b/src/assuan.h index cbc386b..9080fd3 100644 --- a/src/assuan.h +++ b/src/assuan.h @@ -62,6 +62,8 @@ #define _ASSUAN_PREFIX(x) _ASSUAN_PREFIX2(_ASSUAN_EXT_SYM_PREFIX,x) #define assuan_ _ASSUAN_PREFIX(assuan_) #define assuan_register_command _ASSUAN_PREFIX(assuan_register_command) +#define assuan_register_post_cmd_notify \ + _ASSUAN_PREFIX(assuan_register_post_cmd_notify) #define assuan_register_bye_notify _ASSUAN_PREFIX(assuan_register_bye_notify) #define assuan_register_reset_notify \ _ASSUAN_PREFIX(assuan_register_reset_notify) @@ -113,6 +115,7 @@ #define assuan_set_error _ASSUAN_PREFIX(assuan_set_error) #define assuan_set_pointer _ASSUAN_PREFIX(assuan_set_pointer) #define assuan_get_pointer _ASSUAN_PREFIX(assuan_get_pointer) +#define assuan_set_io_monitor _ASSUAN_PREFIX(assuan_set_io_monitor) #define assuan_begin_confidential _ASSUAN_PREFIX(assuan_begin_confidential) #define assuan_end_confidential _ASSUAN_PREFIX(assuan_end_confidential) #define assuan_strerror _ASSUAN_PREFIX(assuan_strerror) @@ -336,6 +339,8 @@ typedef struct assuan_context_s *ASSUAN_CONTEXT _ASSUAN_DEPRECATED; int assuan_register_command (assuan_context_t ctx, const char *cmd_string, int (*handler)(assuan_context_t, char *)); +int assuan_register_post_cmd_notify (assuan_context_t ctx, + void (*fnc)(assuan_context_t, int)); int assuan_register_bye_notify (assuan_context_t ctx, void (*fnc)(assuan_context_t)); int assuan_register_reset_notify (assuan_context_t ctx, @@ -466,6 +471,12 @@ void *assuan_get_pointer (assuan_context_t ctx); void assuan_begin_confidential (assuan_context_t ctx); void assuan_end_confidential (assuan_context_t ctx); +void assuan_set_io_monitor (assuan_context_t ctx, + unsigned int (*monitor)(assuan_context_t ctx, + int direction, + const char *line, + size_t linelen)); + /* For context CTX, set the flag FLAG to VALUE. Values for flags are usually 1 or 0 but certain flags might allow for other values; see the description of the type assuan_flag_t for details. */ diff --git a/src/libassuan.m4 b/src/libassuan.m4 index 95b6190..e099b66 100644 --- a/src/libassuan.m4 +++ b/src/libassuan.m4 @@ -96,6 +96,21 @@ AC_DEFUN([_AM_PATH_LIBASSUAN_COMMON], ]) +dnl AM_CHECK_LIBASSUAN([MINIMUM-VERSION, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) +dnl Test whether libassuan has at least MINIMUM-VERSION. This is +dnl used to test for features only available in newer versions. +dnl +AC_DEFUN([AM_CHECK_LIBASSUAN], +[ _AM_PATH_LIBASSUAN_COMMON($1) + if test $ok = yes; then + ifelse([$2], , :, [$2]) + else + ifelse([$3], , :, [$3]) + fi +]) + + dnl AM_PATH_LIBASSUAN([MINIMUM-VERSION, |