diff --git a/doc/gpgme.texi b/doc/gpgme.texi index ef39d81b..a4a08143 100644 --- a/doc/gpgme.texi +++ b/doc/gpgme.texi @@ -4312,7 +4312,8 @@ indicates a command rather than a status message, the response to the command should be written to @var{fd}. The @var{handle} is provided by the user at start of operation. -The function should return @code{GPG_ERR_NO_ERROR} or an error value. +The function should return @code{GPG_ERR_FALSE} if it did not handle +the status code, @code{0} for success, or any other error value. @end deftp @deftypefun gpgme_error_t gpgme_op_edit (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_key_t @var{key}}, @w{gpgme_edit_cb_t @var{fnc}}, @w{void *@var{handle}}, @w{gpgme_data_t @var{out}}) diff --git a/src/edit.c b/src/edit.c index 72fa4584..1be60c46 100644 --- a/src/edit.c +++ b/src/edit.c @@ -77,6 +77,8 @@ command_handler (void *priv, gpgme_status_code_t status, const char *args, if (err) return err; } + else + err = 0; if (!processed) { @@ -88,16 +90,15 @@ command_handler (void *priv, gpgme_status_code_t status, const char *args, if (err) return err; - /* FIXME: We expect the user to handle _all_ status codes. - Later, we may fix the callback interface to allow the user - indicate if it processed the status code or not. */ - *processed_r = 1; - - return (*opd->fnc) (opd->fnc_value, status, args, fd); + err = (*opd->fnc) (opd->fnc_value, status, args, fd); + if (gpg_err_code (err) == GPG_ERR_FALSE) + err = 0; + else + processed = 1; } *processed_r = processed; - return 0; + return err; } diff --git a/src/engine-gpg.c b/src/engine-gpg.c index 9a0dab0a..d2741cb1 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -1102,6 +1102,8 @@ read_status (engine_gpg_t gpg) char emptystring[1] = {0}; err = gpg->status.fnc (gpg->status.fnc_value, GPGME_STATUS_EOF, emptystring); + if (gpg_err_code (err) == GPG_ERR_FALSE) + err = 0; /* Drop special error code. */ } return err; @@ -1169,6 +1171,8 @@ read_status (engine_gpg_t gpg) { err = gpg->status.fnc (gpg->status.fnc_value, r, rest); + if (gpg_err_code (err) == GPG_ERR_FALSE) + err = 0; /* Drop special error code. */ if (err) return err; } diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c index 5fcfbf16..49cf061d 100644 --- a/src/engine-gpgsm.c +++ b/src/engine-gpgsm.c @@ -827,6 +827,8 @@ status_handler (void *opaque, int fd) char emptystring[1] = {0}; err = gpgsm->status.fnc (gpgsm->status.fnc_value, GPGME_STATUS_EOF, emptystring); + if (gpg_err_code (err) == GPG_ERR_FALSE) + err = 0; /* Drop special error code. */ } if (!err && gpgsm->colon.fnc && gpgsm->colon.any) @@ -978,7 +980,11 @@ status_handler (void *opaque, int fd) if (r >= 0) { if (gpgsm->status.fnc) - err = gpgsm->status.fnc (gpgsm->status.fnc_value, r, rest); + { + err = gpgsm->status.fnc (gpgsm->status.fnc_value, r, rest); + if (gpg_err_code (err) == GPG_ERR_FALSE) + err = 0; /* Drop special error code. */ + } } else fprintf (stderr, "[UNKNOWN STATUS]%s %s", line + 2, rest); diff --git a/src/engine-uiserver.c b/src/engine-uiserver.c index 318d32e3..d855c742 100644 --- a/src/engine-uiserver.c +++ b/src/engine-uiserver.c @@ -676,6 +676,8 @@ status_handler (void *opaque, int fd) char emptystring[1] = {0}; err = uiserver->status.fnc (uiserver->status.fnc_value, GPGME_STATUS_EOF, emptystring); + if (gpg_err_code (err) == GPG_ERR_FALSE) + err = 0; /* Drop special error code. */ } if (!err && uiserver->colon.fnc && uiserver->colon.any) @@ -827,7 +829,12 @@ status_handler (void *opaque, int fd) if (r >= 0) { if (uiserver->status.fnc) - err = uiserver->status.fnc (uiserver->status.fnc_value, r, rest); + { + err = uiserver->status.fnc (uiserver->status.fnc_value, + r, rest); + if (gpg_err_code (err) == GPG_ERR_FALSE) + err = 0; /* Drop special error code. */ + } } else fprintf (stderr, "[UNKNOWN STATUS]%s %s", line + 2, rest); diff --git a/src/util.h b/src/util.h index a3425f09..a59700f6 100644 --- a/src/util.h +++ b/src/util.h @@ -45,6 +45,11 @@ #define DIM(v) (sizeof(v)/sizeof((v)[0])) +#if GPG_ERROR_VERSION_NUMBER < 0x011500 /* 1.21 */ +# define GPG_ERR_FALSE 256 +#endif + + /*-- {posix,w32}-util.c --*/ int _gpgme_get_conf_int (const char *key, int *value);