aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine-assuan.c
diff options
context:
space:
mode:
authorMarcus Brinkmann <[email protected]>2009-10-26 18:52:32 +0000
committerMarcus Brinkmann <[email protected]>2009-10-26 18:52:32 +0000
commitc8e934b2761ded0a7c7fdaaf7f3e2e8af9e3dcaf (patch)
treea0152ee8a11e6b3a28f91494efdb225ec15307c1 /src/engine-assuan.c
parent2009-10-26 Marcus Brinkmann <[email protected]> (diff)
downloadgpgme-c8e934b2761ded0a7c7fdaaf7f3e2e8af9e3dcaf.tar.gz
gpgme-c8e934b2761ded0a7c7fdaaf7f3e2e8af9e3dcaf.zip
2009-10-26 Marcus Brinkmann <[email protected]>
* configure.ac (NEED_GPG_VERSION_DEFAULT): Bump to 1.4.0 as 1.3.0 was development versions only. tests/ 2009-10-26 Marcus Brinkmann <[email protected]> * opassuan/t-command.c: Update to new interface. src/ 2009-10-26 Marcus Brinkmann <[email protected]> * gpgme.h.in (struct gpgme_io_event_done_data) (gpgme_io_event_done_data_t): New types. (struct _gpgme_op_assuan_result): Deprecate the err member. (gpgme_op_assuan_result): Deprecate (for now). (gpgme_op_assuan_transact_ext): New prototype. (gpgme_op_assuan_transact): Deprecate. (struct _gpgme_op_g13_result): Replace with ... (struct _gpgme_op_vfs_mount_result): ... this. (gpgme_op_g13_mount): Replace with ... (gpgme_op_vfs_mount): ... this. * gpgme.def (gpgme_op_assuan_transact_ext, gpgme_wait_ext) (gpgme_op_vfs_mount_result, gpgme_op_vfs_mount): New. (gpgme_op_g13_mount): Remove. * libgpgme.vers: Likewise. * engine-backend.h (struct engine_ops): Remove RESULT_CB and RESULT_CB_VALUE args in opassuan_transact member. Add CANCEL_OP member. * ops.h (_gpgme_cancel_with_err, _gpgme_wait_on_condition): Add OP_ERR argument. (_gpgme_wait_one_ext): New prototype. * context.h (ctx_op_data_id_t): Add OPDATA_VFS_MOUNT. * engine-g13.c (g13_cancel_op): New function. (parse_status): Remove declaration. (g13_assuan_simple_command): Do nothing with status lines for now. (status_handler): Update opaque value access. (_gpgme_engine_ops_g13): Add new cancel_op member. * gpgme.c (_gpgme_cancel_with_err): Add new parameter OP_ERR. Handle operational errors. (gpgme_cancel, gpgme_io_read, gpgme_io_write): Add debug output. * data.c (_gpgme_data_inbound_handler) (_gpgme_data_outbound_handler): Adjust opaque value access. * engine-gpg.c (command_handler, status_handler) (colon_line_handler): Likewise. * engine-gpgsm.c (status_handler): Likewise. * engine-gpg.c (_gpgme_engine_ops_gpg): Add cancel_op member. * engine-gpgsm.c (_gpgme_engine_ops_gpgsm): Likewise. * g13.c: Rewritten (and will be rewritten again). * engine.h (_gpgme_engine_op_assuan_transact): Remove result_cb and result_cb_value parameters from prototype. (_gpgme_engine_cancel_op): New prototype. * engine.c (engine_ops) [! ENABLE_ASSUAN]: Add missing comma. (_gpgme_engine_op_assuan_transact): Remove result_cb and result_cb_value parameter. (_gpgme_engine_cancel_op): New function. * wait.h (_gpgme_run_io_cb): Add new argument OP_ERR. (struct io_cb_data): New struct to pass opaque data and get a op_err return value. Needed because we can't modify I/O callback handler signature because it is exposed to the user. * wait.c (_gpgme_run_io_cb): Add OP_ERR parameter. Handle operational errors. * wait-user.c (_gpgme_user_io_cb_handler): Handle operational errors. * wait-private.c (_gpgme_wait_on_condition): New argument to retrieve the operational result. Handle operational errors in session based protocols. (_gpgme_wait_one_ext): New function. (_gpgme_wait_one): Pass argument in invocation of _gpgme_wait_on_condition. * wait-global.c (struct ctx_list_item): Add member OP_ERR. (ctx_done): New argument OP_ERR. (ctx_wait): New argument OP_ERR. (gpgme_wait_ext): New function based on gpgme_wait but handling operational errors. (gpgme_wait): Implement in term of gpgme_wait_ext. * keylist.c (gpgme_op_keylist_next): Pass argument in invocation of _gpgme_wait_on_condition. * trustlist.c (gpgme_op_trustlist_next): Pass argument in invocation of _gpgme_wait_on_condition. * engine-assuan.c (struct engine_llass): Replace members RESULT_CB and RESULT_CB_VALUE by LAST_OP_ERR. (_gpgme_engine_assuan_last_op_err): Add this hack function. (llass_cancel_op): New function. (_gpgme_engine_llass_ops): Add cancel_op member. (llass_status_handler): Update opaque value access. (llass_transact): Remove RESULT_CB and RESULT_CB_VALUE arguments. * opassuan.c: Move compat hacks to the end of file. (opassuan_start): Do not set OPD->result.err. Do not pass RESULT_Cb and CTX to _gpgme_engine_op_assuan_transact. (gpgme_op_assuan_transact_ext): New function.
Diffstat (limited to 'src/engine-assuan.c')
-rw-r--r--src/engine-assuan.c72
1 files changed, 39 insertions, 33 deletions
diff --git a/src/engine-assuan.c b/src/engine-assuan.c
index 07a21fa0..92e1e05d 100644
--- a/src/engine-assuan.c
+++ b/src/engine-assuan.c
@@ -70,9 +70,8 @@ struct engine_llass
struct gpgme_io_cbs io_cbs;
- /* Internal callbacks. */
- engine_assuan_result_cb_t result_cb;
- void *result_cb_value;
+ /* Hack for old opassuan.c interface, see there the result struct. */
+ gpg_error_t last_op_err;
/* User provided callbacks. */
struct {
@@ -95,6 +94,12 @@ struct engine_llass
typedef struct engine_llass *engine_llass_t;
+gpg_error_t _gpgme_engine_assuan_last_op_err (void *engine)
+{
+ engine_llass_t llass = engine;
+ return llass->last_op_err;
+}
+
/* Prototypes. */
static void llass_io_event (void *engine,
@@ -169,6 +174,21 @@ llass_cancel (void *engine)
}
+static gpgme_error_t
+llass_cancel_op (void *engine)
+{
+ engine_llass_t llass = engine;
+
+ if (!llass)
+ return gpg_error (GPG_ERR_INV_VALUE);
+
+ if (llass->status_cb.fd != -1)
+ _gpgme_io_close (llass->status_cb.fd);
+
+ return 0;
+}
+
+
static void
llass_release (void *engine)
{
@@ -408,8 +428,9 @@ inquire_cb (engine_llass_t llass, const char *keyword, const char *args)
static gpgme_error_t
llass_status_handler (void *opaque, int fd)
{
+ struct io_cb_data *data = (struct io_cb_data *) opaque;
+ engine_llass_t llass = (engine_llass_t) data->handler_value;
gpgme_error_t err = 0;
- engine_llass_t llass = opaque;
char *line;
size_t linelen;
@@ -459,8 +480,6 @@ llass_status_handler (void *opaque, int fd)
if (linelen && llass->user.data_cb)
err = llass->user.data_cb (llass->user.data_cb_value,
src, linelen);
- else
- err = 0;
TRACE2 (DEBUG_CTX, "gpgme:llass_status_handler", llass,
"fd 0x%x: D inlinedata; status from cb: %s",
@@ -474,8 +493,6 @@ llass_status_handler (void *opaque, int fd)
/* END received. Tell the data callback. */
if (llass->user.data_cb)
err = llass->user.data_cb (llass->user.data_cb_value, NULL, 0);
- else
- err = 0;
TRACE2 (DEBUG_CTX, "gpgme:llass_status_handler", llass,
"fd 0x%x: END line; status from cb: %s",
@@ -502,8 +519,6 @@ llass_status_handler (void *opaque, int fd)
if (llass->user.status_cb)
err = llass->user.status_cb (llass->user.status_cb_value,
src, args);
- else
- err = 0;
TRACE3 (DEBUG_CTX, "gpgme:llass_status_handler", llass,
"fd 0x%x: S line (%s) - status from cb: %s",
@@ -554,17 +569,15 @@ llass_status_handler (void *opaque, int fd)
TRACE2 (DEBUG_CTX, "gpgme:llass_status_handler", llass,
"fd 0x%x: ERR line: %s",
fd, err ? gpg_strerror (err) : "ok");
+
/* Command execution errors are not fatal, as we use
a session based protocol. */
- if (llass->result_cb)
- err = llass->result_cb (llass->result_cb_value, err);
- else
- err = 0;
- if (!err)
- {
- _gpgme_io_close (llass->status_cb.fd);
- return 0;
- }
+ data->op_err = err;
+ llass->last_op_err = err;
+
+ /* The caller will do the rest (namely, call cancel_op,
+ which closes status_fd). */
+ return 0;
}
else if (linelen >= 2
&& line[0] == 'O' && line[1] == 'K'
@@ -572,15 +585,11 @@ llass_status_handler (void *opaque, int fd)
{
TRACE1 (DEBUG_CTX, "gpgme:llass_status_handler", llass,
"fd 0x%x: OK line", fd);
- if (llass->result_cb)
- err = llass->result_cb (llass->result_cb_value, 0);
- else
- err = 0;
- if (!err)
- {
- _gpgme_io_close (llass->status_cb.fd);
- return 0;
- }
+
+ llass->last_op_err = 0;
+
+ _gpgme_io_close (llass->status_cb.fd);
+ return 0;
}
else
{
@@ -667,8 +676,6 @@ start (engine_llass_t llass, const char *command)
static gpgme_error_t
llass_transact (void *engine,
const char *command,
- engine_assuan_result_cb_t result_cb,
- void *result_cb_value,
gpgme_assuan_data_cb_t data_cb,
void *data_cb_value,
gpgme_assuan_inquire_cb_t inq_cb,
@@ -682,8 +689,6 @@ llass_transact (void *engine,
if (!llass || !command || !*command)
return gpg_error (GPG_ERR_INV_VALUE);
- llass->result_cb = result_cb;
- llass->result_cb_value = result_cb_value;
llass->user.data_cb = data_cb;
llass->user.data_cb_value = data_cb_value;
llass->user.inq_cb = inq_cb;
@@ -754,5 +759,6 @@ struct engine_ops _gpgme_engine_ops_assuan =
NULL, /* conf_save */
llass_set_io_cbs,
llass_io_event,
- llass_cancel
+ llass_cancel,
+ llass_cancel_op
};