diff options
author | Ben Kibbey <[email protected]> | 2011-02-06 03:34:24 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2011-02-24 09:19:01 +0000 |
commit | 97eb75719c40ea584aa8745638a8496154fbf418 (patch) | |
tree | 342c500d9464c042fec4d5160d2f092be5653c54 | |
parent | Reroute all socket and connect through the nonce implemenation in assuan-sock... (diff) | |
download | libassuan-97eb75719c40ea584aa8745638a8496154fbf418.tar.gz libassuan-97eb75719c40ea584aa8745638a8496154fbf418.zip |
assuan_register_pre_cmd_notify().
-rw-r--r-- | src/assuan-defs.h | 13 | ||||
-rw-r--r-- | src/assuan-handler.c | 20 | ||||
-rw-r--r-- | src/assuan.h.in | 11 | ||||
-rw-r--r-- | src/libassuan.def | 1 | ||||
-rw-r--r-- | src/libassuan.vers | 1 |
5 files changed, 36 insertions, 10 deletions
diff --git a/src/assuan-defs.h b/src/assuan-defs.h index 88863eb..da2a9d7 100644 --- a/src/assuan-defs.h +++ b/src/assuan-defs.h @@ -58,14 +58,6 @@ #define _assuan_error(ctx, errcode) gpg_err_make ((ctx)->err_source, errcode) -struct cmdtbl_s -{ - const char *name; - assuan_handler_t handler; - const char *helpstr; -}; - - /* The context we use with most functions. */ struct assuan_context_s @@ -196,7 +188,7 @@ struct assuan_context_s gpg_error_t (*accept_handler)(assuan_context_t); void (*finish_handler)(assuan_context_t); - struct cmdtbl_s *cmdtbl; + assuan_command_t cmdtbl; size_t cmdtbl_used; /* used entries */ size_t cmdtbl_size; /* allocated size of table */ @@ -212,6 +204,9 @@ struct assuan_context_s assuan_handler_t input_notify_fnc; assuan_handler_t output_notify_fnc; + /* This function is called right before a command handler is called. */ + gpg_error_t (*pre_cmd_notify_fnc)(assuan_context_t, assuan_command_t); + /* 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, gpg_error_t); diff --git a/src/assuan-handler.c b/src/assuan-handler.c index c19117f..5016fcb 100644 --- a/src/assuan-handler.c +++ b/src/assuan-handler.c @@ -400,7 +400,7 @@ assuan_register_command (assuan_context_t ctx, const char *cmd_name, } else if (ctx->cmdtbl_used >= ctx->cmdtbl_size) { - struct cmdtbl_s *x; + struct _assuan_command_s *x; x = _assuan_realloc (ctx, ctx->cmdtbl, (ctx->cmdtbl_size+10) * sizeof *x); if (!x) @@ -427,6 +427,17 @@ assuan_get_command_name (assuan_context_t ctx) } gpg_error_t +assuan_register_pre_cmd_notify (assuan_context_t ctx, + gpg_error_t (*fnc)(assuan_context_t, + assuan_command_t)) +{ + if (!ctx) + return _assuan_error (ctx, GPG_ERR_ASS_INV_VALUE); + ctx->pre_cmd_notify_fnc = fnc; + return 0; +} + +gpg_error_t assuan_register_post_cmd_notify (assuan_context_t ctx, void (*fnc)(assuan_context_t, gpg_error_t)) { @@ -590,6 +601,13 @@ dispatch_command (assuan_context_t ctx, char *line, int linelen) line += shift; linelen -= shift; + if (ctx->pre_cmd_notify_fnc) { + err = ctx->pre_cmd_notify_fnc(ctx, &ctx->cmdtbl[i]); + + if (err) + return PROCESS_DONE(ctx, err); + } + /* fprintf (stderr, "DBG-assuan: processing %s `%s'\n", s, line); */ ctx->current_cmd_name = ctx->cmdtbl[i].name; err = ctx->cmdtbl[i].handler (ctx, line); diff --git a/src/assuan.h.in b/src/assuan.h.in index 018d5a1..630aefd 100644 --- a/src/assuan.h.in +++ b/src/assuan.h.in @@ -273,11 +273,22 @@ void assuan_set_log_stream (assuan_context_t ctx, FILE *fp); typedef gpg_error_t (*assuan_handler_t) (assuan_context_t, char *); +struct _assuan_command_s +{ + const char *name; + assuan_handler_t handler; + const char *helpstr; +}; + +typedef struct _assuan_command_s *assuan_command_t; + /*-- assuan-handler.c --*/ gpg_error_t assuan_register_command (assuan_context_t ctx, const char *cmd_string, assuan_handler_t handler, const char *help_string); +gpg_error_t assuan_register_pre_cmd_notify (assuan_context_t ctx, + gpg_error_t (*fnc)(assuan_context_t, assuan_command_t)); gpg_error_t assuan_register_post_cmd_notify (assuan_context_t ctx, void (*fnc)(assuan_context_t, gpg_error_t)); diff --git a/src/libassuan.def b/src/libassuan.def index a2e7b61..575966d 100644 --- a/src/libassuan.def +++ b/src/libassuan.def @@ -103,6 +103,7 @@ EXPORTS _assuan_w32ce_finish_pipe @82 __assuan_socket @83 __assuan_connect @84 + assuan_register_pre_cmd_notify @85 ; END diff --git a/src/libassuan.vers b/src/libassuan.vers index b14a940..261e0e7 100644 --- a/src/libassuan.vers +++ b/src/libassuan.vers @@ -24,6 +24,7 @@ LIBASSUAN_1.1 { global: __assuan_socket; __assuan_connect; + assuan_register_pre_cmd_notify; }; LIBASSUAN_1.0 { |