diff options
author | Marcus Brinkmann <[email protected]> | 2009-11-02 17:33:53 +0000 |
---|---|---|
committer | Marcus Brinkmann <[email protected]> | 2009-11-02 17:33:53 +0000 |
commit | f342672465427384c706ccd4476d603fc04df1de (patch) | |
tree | 981b1e7baf4ddd5f92081b5a1852677030fb65d6 /src/assuan-handler.c | |
parent | 2009-10-30 Marcus Brinkmann <[email protected]> (diff) | |
download | libassuan-f342672465427384c706ccd4476d603fc04df1de.tar.gz libassuan-f342672465427384c706ccd4476d603fc04df1de.zip |
2009-11-02 Marcus Brinkmann <[email protected]>
* 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.
Diffstat (limited to 'src/assuan-handler.c')
-rw-r--r-- | src/assuan-handler.c | 55 |
1 files changed, 29 insertions, 26 deletions
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); |