diff options
| author | Werner Koch <[email protected]> | 2016-05-19 15:01:07 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2016-05-19 15:04:54 +0000 | 
| commit | 88f2c1c0d16eee6bb36a901623ea65ac69499f03 (patch) | |
| tree | 4ac0d8ab84bee699987f61e277e8c4d80e857850 /src/engine-gpg.c | |
| parent | api: Remove arbitrary restriction from gpgme_op_verify. (diff) | |
| download | gpgme-88f2c1c0d16eee6bb36a901623ea65ac69499f03.tar.gz gpgme-88f2c1c0d16eee6bb36a901623ea65ac69499f03.zip | |
api: Add new function gpgme_set_ctx_flag.
* src/gpgme.h.in (gpgme_set_ctx_flag): New prototype.
* src/gpgme.c (gpgme_set_ctx_flag): New.
* src/gpgme.def, src/libgpgme.vers: Add new function.
* src/context.h (struct gpgme_context): Add FULL_STATUS.
* src/decrypt.c (_gpgme_decrypt_status_handler): Do not call the
  status callback if FULL_STATUS is set.
* src/genkey.c (genkey_status_handler): Ditto.
* src/passphrase.c (_gpgme_passphrase_status_handler): Ditto.
* src/sign.c (_gpgme_sign_status_handler): Ditto.
* src/engine-backend.h (struct engine_ops): Add SET_STATUS_CB and add
adjust all definitions of that variable.
* src/engine.c (_gpgme_engine_set_status_cb): New.
* src/op-support.c (_gpgme_op_reset): Call this function.
* src/engine-gpg.c (struct engine_gpg): Add fields MON_CB and
MON_CB_VALUE.
(gpg_set_status_cb): New.
(_gpgme_engine_ops_gpg): Register that function.
(read_status): Call the monitor callback.
* src/engine-gpgsm.c (struct engine_gpgsm): Add fields MON_CB and
MON_CB_VALUE.
(_gpgme_engine_ops_gpgsm): Register that function.
(gpgsm_assuan_simple_command): Change first arg to be an engine
context and adjust call callers.  Call the monitor callback.
* src/engine-uiserver.c (struct engine_uiserver): Add fields MON_CB
and MON_CB_VALUE.
(_gpgme_engine_ops_uiserver): Register that function.
(uiserver_assuan_simple_command): Change first arg to be an engine
context and adjust call callers.  Call the monitor callback.
* tests/run-verify.c (status_cb): New.
(print_result): Print algo names.
(main): Add option --status.
--
This new feature is mainly intended for bug tracking.  Having access
to the raw status lines might also be useful for applications, though.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src/engine-gpg.c')
| -rw-r--r-- | src/engine-gpg.c | 39 | 
1 files changed, 31 insertions, 8 deletions
| diff --git a/src/engine-gpg.c b/src/engine-gpg.c index 9efced25..e507c683 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -95,6 +95,8 @@ struct engine_gpg      int eof;      engine_status_handler_t fnc;      void *fnc_value; +    gpgme_status_cb_t mon_cb; +    void *mon_cb_value;      void *tag;    } status; @@ -609,6 +611,17 @@ gpg_set_locale (void *engine, int category, const char *value)    return 0;  } +/* This sets a status callback for monitoring status lines before they + * are passed to a caller set handler.  */ +static void +gpg_set_status_cb (void *engine, gpgme_status_cb_t cb, void *cb_value) +{ +  engine_gpg_t gpg = engine; + +  gpg->status.mon_cb = cb; +  gpg->status.mon_cb_value = cb_value; +} +  /* Note, that the status_handler is allowed to modifiy the args     value.  */ @@ -1019,6 +1032,7 @@ read_status (engine_gpg_t gpg)    size_t bufsize = gpg->status.bufsize;    char *buffer = gpg->status.buffer;    size_t readpos = gpg->status.readpos; +  gpgme_error_t err;    assert (buffer);    if (bufsize - readpos < 256) @@ -1037,15 +1051,15 @@ read_status (engine_gpg_t gpg)    if (!nread)      { +      err = 0;        gpg->status.eof = 1; +      if (gpg->status.mon_cb) +        err = gpg->status.mon_cb (gpg->status.mon_cb_value, +                                  GPGME_STATUS_EOF, "");        if (gpg->status.fnc) -	{ -	  gpgme_error_t err; -	  err = gpg->status.fnc (gpg->status.fnc_value, GPGME_STATUS_EOF, ""); -	  if (err) -	    return err; -	} -      return 0; +        err = gpg->status.fnc (gpg->status.fnc_value, GPGME_STATUS_EOF, ""); + +      return err;      }    while (nread > 0) @@ -1071,6 +1085,15 @@ read_status (engine_gpg_t gpg)  		    *rest++ = 0;  		  r = _gpgme_parse_status (buffer + 9); +                  if (gpg->status.mon_cb && r != GPGME_STATUS_PROGRESS) +                    { +                      /* Note that we call the monitor even if we do +                       * not know the status code (r < 0).  */ +                      err = gpg->status.mon_cb (gpg->status.mon_cb_value, +                                                buffer + 9, rest); +                      if (err) +                        return err; +                    }  		  if (r >= 0)  		    {  		      if (gpg->cmd.used @@ -1099,7 +1122,6 @@ read_status (engine_gpg_t gpg)                          }  		      else if (gpg->status.fnc)  			{ -			  gpgme_error_t err;  			  err = gpg->status.fnc (gpg->status.fnc_value,  						 r, rest);  			  if (err) @@ -2470,6 +2492,7 @@ struct engine_ops _gpgme_engine_ops_gpg =      /* Member functions.  */      gpg_release,      NULL,				/* reset */ +    gpg_set_status_cb,      gpg_set_status_handler,      gpg_set_command_handler,      gpg_set_colon_line_handler, | 
