aboutsummaryrefslogtreecommitdiffstats
path: root/src/opassuan.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/opassuan.c')
-rw-r--r--src/opassuan.c157
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;
+}