diff options
author | Marcus Brinkmann <mb@g10code.com> | 2009-11-02 17:33:53 +0000 |
---|---|---|
committer | Marcus Brinkmann <mb@g10code.com> | 2009-11-02 17:33:53 +0000 |
commit | f342672465427384c706ccd4476d603fc04df1de (patch) | |
tree | 981b1e7baf4ddd5f92081b5a1852677030fb65d6 | |
parent | f7a612729a4df3453abf8003b0837a309dd01daf (diff) | |
download | libassuan-f342672465427384c706ccd4476d603fc04df1de.tar.gz |
2009-11-02 Marcus Brinkmann <marcus@g10code.de>
* assuan.h (assuan_handler_t): New type.
(assuan_register_bye_notify, assuan_register_reset_notify)
(assuan_register_cancel_notify, assuan_register_input_notify)
(assuan_register_output_notify, assuan_register_command): Use it.
* assuan-handler.c (std_handler_cancel, std_handler_bye): Pass
LINE argument to user handler.
(std_handler_reset): Likewise, and also abort RESET if error is
returned from user handler.
(std_handler_input, std_handler_output): Check return value from
user handler before assigning FD.
* assuan-defs.h (struct cmdtbl_s): Change type of member HANDLER
to assuan_handler_t.
(struct assuan_context_s): Change type of members
RESET_NOTIFY_FNC, CANCEL_NOTIFY_FNC, BYE_NOTIFY_FNC,
INPUT_NOTIFY_FNC and OUTPUT_NOTIFY_FNC to assuan_handler_t.
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | src/ChangeLog | 18 | ||||
-rw-r--r-- | src/assuan-defs.h | 12 | ||||
-rw-r--r-- | src/assuan-handler.c | 55 | ||||
-rw-r--r-- | src/assuan.h | 14 |
5 files changed, 67 insertions, 38 deletions
@@ -67,6 +67,12 @@ ASSUAN_SYSTEM_PTH_DECL NEW ASSUAN_SYSTEM_PTH NEW assuan_sock_init NEW assuan_sock_deinit NEW +assuan_handler_t NEW +assuan_register_bye_notify CHANGED: Handler gets line and returns err now. +assuan_register_reset_notify CHANGED: Handler gets line and returns err now. +assuan_register_cancel_notify CHANGED: Handler gets line and returns err now. +assuan_register_input_notify CHANGED: Handler returns error now. +assuan_register_output_notify CHANGED: Handler returns error now. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/ChangeLog b/src/ChangeLog index a6ceaca..4b41e33 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,21 @@ +2009-11-02 Marcus Brinkmann <marcus@g10code.de> + + * assuan.h (assuan_handler_t): New type. + (assuan_register_bye_notify, assuan_register_reset_notify) + (assuan_register_cancel_notify, assuan_register_input_notify) + (assuan_register_output_notify, assuan_register_command): Use it. + * assuan-handler.c (std_handler_cancel, std_handler_bye): Pass + LINE argument to user handler. + (std_handler_reset): Likewise, and also abort RESET if error is + returned from user handler. + (std_handler_input, std_handler_output): Check return value from + user handler before assigning FD. + * assuan-defs.h (struct cmdtbl_s): Change type of member HANDLER + to assuan_handler_t. + (struct assuan_context_s): Change type of members + RESET_NOTIFY_FNC, CANCEL_NOTIFY_FNC, BYE_NOTIFY_FNC, + INPUT_NOTIFY_FNC and OUTPUT_NOTIFY_FNC to assuan_handler_t. + 2009-10-30 Marcus Brinkmann <marcus@g10code.de> * system.c (_assuan_spawn): Check fd_child_list before dumping it. diff --git a/src/assuan-defs.h b/src/assuan-defs.h index 38f51ed..56867a6 100644 --- a/src/assuan-defs.h +++ b/src/assuan-defs.h @@ -52,7 +52,7 @@ struct cmdtbl_s { const char *name; - gpg_error_t (*handler)(assuan_context_t, char *line); + assuan_handler_t handler; }; @@ -206,12 +206,12 @@ struct assuan_context_s handler. */ const char *current_cmd_name; - void (*bye_notify_fnc)(assuan_context_t); - void (*reset_notify_fnc)(assuan_context_t); - void (*cancel_notify_fnc)(assuan_context_t); + assuan_handler_t bye_notify_fnc; + assuan_handler_t reset_notify_fnc; + assuan_handler_t cancel_notify_fnc; gpg_error_t (*option_handler_fnc)(assuan_context_t,const char*, const char*); - void (*input_notify_fnc)(assuan_context_t, const char *); - void (*output_notify_fnc)(assuan_context_t, const char *); + assuan_handler_t input_notify_fnc; + assuan_handler_t output_notify_fnc; /* This function is called right after a command has been processed. It may be used to command related cleanup. */ diff --git a/src/assuan-handler.c b/src/assuan-handler.c index 7291acd..a39c006 100644 --- a/src/assuan-handler.c +++ b/src/assuan-handler.c @@ -58,7 +58,8 @@ static gpg_error_t std_handler_cancel (assuan_context_t ctx, char *line) { if (ctx->cancel_notify_fnc) - ctx->cancel_notify_fnc (ctx); + /* Return value ignored. */ + ctx->cancel_notify_fnc (ctx, line); return PROCESS_DONE (ctx, set_error (ctx, GPG_ERR_NOT_IMPLEMENTED, NULL)); } @@ -119,7 +120,8 @@ static gpg_error_t std_handler_bye (assuan_context_t ctx, char *line) { if (ctx->bye_notify_fnc) - ctx->bye_notify_fnc (ctx); + /* Return value ignored. */ + ctx->bye_notify_fnc (ctx, line); assuan_close_input_fd (ctx); assuan_close_output_fd (ctx); /* pretty simple :-) */ @@ -135,12 +137,17 @@ std_handler_auth (assuan_context_t ctx, char *line) static gpg_error_t std_handler_reset (assuan_context_t ctx, char *line) { + gpg_error_t err = 0; + if (ctx->reset_notify_fnc) - ctx->reset_notify_fnc (ctx); - assuan_close_input_fd (ctx); - assuan_close_output_fd (ctx); - _assuan_uds_close_fds (ctx); - return PROCESS_DONE (ctx, 0); + err = ctx->reset_notify_fnc (ctx, line); + if (! err) + { + assuan_close_input_fd (ctx); + assuan_close_output_fd (ctx); + _assuan_uds_close_fds (ctx); + } + return PROCESS_DONE (ctx, err); } static gpg_error_t @@ -213,10 +220,11 @@ std_handler_input (assuan_context_t ctx, char *line) rc = assuan_command_parse_fd (ctx, line, &fd); if (rc) return PROCESS_DONE (ctx, rc); - ctx->input_fd = fd; if (ctx->input_notify_fnc) - ctx->input_notify_fnc (ctx, line); - return PROCESS_DONE (ctx, 0); + rc = ctx->input_notify_fnc (ctx, line); + if (! rc) + ctx->input_fd = fd; + return PROCESS_DONE (ctx, rc); } @@ -230,10 +238,11 @@ std_handler_output (assuan_context_t ctx, char *line) rc = assuan_command_parse_fd (ctx, line, &fd); if (rc) return PROCESS_DONE (ctx, rc); - ctx->output_fd = fd; if (ctx->output_notify_fnc) - ctx->output_notify_fnc (ctx, line); - return PROCESS_DONE (ctx, 0); + rc = ctx->output_notify_fnc (ctx, line); + if (!rc) + ctx->output_fd = fd; + return PROCESS_DONE (ctx, rc); } @@ -274,9 +283,8 @@ static struct { * Return value: 0 on success or an error code **/ gpg_error_t -assuan_register_command (assuan_context_t ctx, - const char *cmd_name, - gpg_error_t (*handler)(assuan_context_t, char *)) +assuan_register_command (assuan_context_t ctx, const char *cmd_name, + assuan_handler_t handler) { int i; const char *s; @@ -349,8 +357,7 @@ assuan_register_post_cmd_notify (assuan_context_t ctx, } gpg_error_t -assuan_register_bye_notify (assuan_context_t ctx, - void (*fnc)(assuan_context_t)) +assuan_register_bye_notify (assuan_context_t ctx, assuan_handler_t fnc) { if (!ctx) return _assuan_error (ctx, GPG_ERR_ASS_INV_VALUE); @@ -359,8 +366,7 @@ assuan_register_bye_notify (assuan_context_t ctx, } gpg_error_t -assuan_register_reset_notify (assuan_context_t ctx, - void (*fnc)(assuan_context_t)) +assuan_register_reset_notify (assuan_context_t ctx, assuan_handler_t fnc) { if (!ctx) return _assuan_error (ctx, GPG_ERR_ASS_INV_VALUE); @@ -369,8 +375,7 @@ assuan_register_reset_notify (assuan_context_t ctx, } gpg_error_t -assuan_register_cancel_notify (assuan_context_t ctx, - void (*fnc)(assuan_context_t)) +assuan_register_cancel_notify (assuan_context_t ctx, assuan_handler_t fnc) { if (!ctx) return _assuan_error (ctx, GPG_ERR_ASS_INV_VALUE); @@ -390,8 +395,7 @@ assuan_register_option_handler (assuan_context_t ctx, } gpg_error_t -assuan_register_input_notify (assuan_context_t ctx, - void (*fnc)(assuan_context_t, const char *)) +assuan_register_input_notify (assuan_context_t ctx, assuan_handler_t fnc) { if (!ctx) return _assuan_error (ctx, GPG_ERR_ASS_INV_VALUE); @@ -400,8 +404,7 @@ assuan_register_input_notify (assuan_context_t ctx, } gpg_error_t -assuan_register_output_notify (assuan_context_t ctx, - void (*fnc)(assuan_context_t, const char *)) +assuan_register_output_notify (assuan_context_t ctx, assuan_handler_t fnc) { if (!ctx) return _assuan_error (ctx, GPG_ERR_ASS_INV_VALUE); diff --git a/src/assuan.h b/src/assuan.h index da83730..935ec00 100644 --- a/src/assuan.h +++ b/src/assuan.h @@ -300,22 +300,24 @@ const char *assuan_get_assuan_log_prefix (void); void assuan_set_log_stream (assuan_context_t ctx, FILE *fp); +typedef gpg_error_t (*assuan_handler_t) (assuan_context_t, char *); + /*-- assuan-handler.c --*/ gpg_error_t assuan_register_command (assuan_context_t ctx, const char *cmd_string, - gpg_error_t (*handler)(assuan_context_t, char *)); + assuan_handler_t handler); gpg_error_t assuan_register_post_cmd_notify (assuan_context_t ctx, void (*fnc)(assuan_context_t, gpg_error_t)); gpg_error_t assuan_register_bye_notify (assuan_context_t ctx, - void (*fnc)(assuan_context_t)); + assuan_handler_t handler); gpg_error_t assuan_register_reset_notify (assuan_context_t ctx, - void (*fnc)(assuan_context_t)); + assuan_handler_t handler); gpg_error_t assuan_register_cancel_notify (assuan_context_t ctx, - void (*fnc)(assuan_context_t)); + assuan_handler_t handler); gpg_error_t assuan_register_input_notify (assuan_context_t ctx, - void (*fnc)(assuan_context_t, const char *)); + assuan_handler_t handler); gpg_error_t assuan_register_output_notify (assuan_context_t ctx, - void (*fnc)(assuan_context_t, const char *)); + assuan_handler_t handler); gpg_error_t assuan_register_option_handler (assuan_context_t ctx, gpg_error_t (*fnc)(assuan_context_t, |