diff options
Diffstat (limited to '')
| -rw-r--r-- | src/opassuan.c | 157 | 
1 files changed, 80 insertions, 77 deletions
| diff --git a/src/opassuan.c b/src/opassuan.c index 09f69ee8..2db9f6cf 100644 --- a/src/opassuan.c +++ b/src/opassuan.c @@ -26,58 +26,6 @@  #include "ops.h"  #include "util.h" - -typedef struct -{ -  struct _gpgme_op_assuan_result result; - -} *op_data_t; - - - - -/* This callback is used to return the status of the assuan command -   back.  Note that this is different from the error code returned -   from gpgme_op_assuan_transact because the later only reflects error -   with the connection.  */ -static gpgme_error_t -result_cb (void *priv, gpgme_error_t result) -{ -  gpgme_ctx_t ctx = (gpgme_ctx_t)priv; -  gpgme_error_t err; -  void *hook; -  op_data_t opd; - -  err = _gpgme_op_data_lookup (ctx, OPDATA_ASSUAN, &hook, -1, NULL); -  opd = hook; -  if (err) -    return err; -  if (!opd) -    return gpg_error (GPG_ERR_INTERNAL); - -  opd->result.err = result; -  return 0; -} - - -gpgme_assuan_result_t -gpgme_op_assuan_result (gpgme_ctx_t ctx) -{ -  gpgme_error_t err; -  void *hook; -  op_data_t opd; - -  err = _gpgme_op_data_lookup (ctx, OPDATA_ASSUAN, &hook, -1, NULL); -  opd = hook; -  /* Check in case this function is used without having run a command -     before.  */ -  if (err || !opd) -    return NULL; - -  return &opd->result; -} - -  static gpgme_error_t  opassuan_start (gpgme_ctx_t ctx, int synchronous,                  const char *command, @@ -89,8 +37,6 @@ opassuan_start (gpgme_ctx_t ctx, int synchronous,                  void *status_cb_value)  {    gpgme_error_t err; -  void *hook; -  op_data_t opd;    if (!command || !*command)      return gpg_error (GPG_ERR_INV_VALUE); @@ -101,14 +47,7 @@ opassuan_start (gpgme_ctx_t ctx, int synchronous,    if (err)      return err; -  err = _gpgme_op_data_lookup (ctx, OPDATA_ASSUAN, &hook, sizeof (*opd), NULL); -  opd = hook; -  if (err) -    return err; -  opd->result.err = gpg_error (GPG_ERR_UNFINISHED); -    return _gpgme_engine_op_assuan_transact (ctx->engine, command, -                                           result_cb, ctx,                                             data_cb, data_cb_value,                                             inq_cb, inq_cb_value,                                             status_cb, status_cb_value); @@ -119,13 +58,13 @@ opassuan_start (gpgme_ctx_t ctx, int synchronous,  /* XXXX.  This is the asynchronous variant. */  gpgme_error_t  gpgme_op_assuan_transact_start (gpgme_ctx_t ctx,  -                                const char *command, -                                gpgme_assuan_data_cb_t data_cb, -                                void *data_cb_value, -                                gpgme_assuan_inquire_cb_t inq_cb, -                                void *inq_cb_value, -                                gpgme_assuan_status_cb_t status_cb, -                                void *status_cb_value) +				const char *command, +				gpgme_assuan_data_cb_t data_cb, +				void *data_cb_value, +				gpgme_assuan_inquire_cb_t inq_cb, +				void *inq_cb_value, +				gpgme_assuan_status_cb_t status_cb, +				void *status_cb_value)  {    return opassuan_start (ctx, 0, command,                            data_cb, data_cb_value, @@ -136,14 +75,15 @@ gpgme_op_assuan_transact_start (gpgme_ctx_t ctx,  /* XXXX.  This is the synchronous variant. */  gpgme_error_t -gpgme_op_assuan_transact (gpgme_ctx_t ctx, -                          const char *command, -                          gpgme_assuan_data_cb_t data_cb, -                          void *data_cb_value, -                          gpgme_assuan_inquire_cb_t inq_cb, -                          void *inq_cb_value, -                          gpgme_assuan_status_cb_t status_cb, -                          void *status_cb_value) +gpgme_op_assuan_transact_ext (gpgme_ctx_t ctx, +			      const char *command, +			      gpgme_assuan_data_cb_t data_cb, +			      void *data_cb_value, +			      gpgme_assuan_inquire_cb_t inq_cb, +			      void *inq_cb_value, +			      gpgme_assuan_status_cb_t status_cb, +			      void *status_cb_value, +			      gpgme_error_t *op_err)  {    gpgme_error_t err; @@ -152,7 +92,70 @@ gpgme_op_assuan_transact (gpgme_ctx_t ctx,                          inq_cb, inq_cb_value,                          status_cb, status_cb_value);    if (!err) -    err = _gpgme_wait_one (ctx); +    err = _gpgme_wait_one_ext (ctx, op_err);    return err;  } + + + +/* Compatibility code for old interface.  */ + +/* Evil hack breaking abstractions for the purpose of localizing our +   other hack.  This is copied from engine.c.  */ +struct engine +{ +  struct engine_ops *ops; +  void *engine; +}; + +typedef struct +{ +  struct _gpgme_op_assuan_result result; +} *op_data_t; + +gpg_error_t _gpgme_engine_assuan_last_op_err (void *engine); + +gpgme_assuan_result_t +gpgme_op_assuan_result (gpgme_ctx_t ctx) +{ +  gpgme_error_t err; +  void *hook; +  op_data_t opd; + +  err = _gpgme_op_data_lookup (ctx, OPDATA_ASSUAN, &hook, -1, NULL); +  opd = hook; +  /* Check in case this function is used without having run a command +     before.  */ +  if (err || !opd) +    return NULL; + +  /* All of this is a hack for the old style interface.  The new style +     interface returns op errors directly.  */ +  opd->result.err = _gpgme_engine_assuan_last_op_err (ctx->engine->engine); + +  return &opd->result; +} + + +gpgme_error_t +gpgme_op_assuan_transact (gpgme_ctx_t ctx, +			  const char *command, +			  gpgme_assuan_data_cb_t data_cb, +			  void *data_cb_value, +			  gpgme_assuan_inquire_cb_t inq_cb, +			  void *inq_cb_value, +			  gpgme_assuan_status_cb_t status_cb, +			  void *status_cb_value) +{ +  gpgme_error_t op_err; +  gpgme_error_t err; + +  /* Users of the old-style session based interfaces need to look at +     the result structure.  */ +  gpgme_op_assuan_transact_ext (ctx, command, data_cb, data_cb_value, +				inq_cb, inq_cb_value, +				status_cb, status_cb_value, &op_err); + +  return err; +} | 
