aboutsummaryrefslogtreecommitdiffstats
path: root/src/g13.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/g13.c105
1 files changed, 36 insertions, 69 deletions
diff --git a/src/g13.c b/src/g13.c
index b3f5fee8..029a9141 100644
--- a/src/g13.c
+++ b/src/g13.c
@@ -31,41 +31,19 @@
typedef struct
{
- struct _gpgme_op_g13_result result;
+ struct _gpgme_op_vfs_mount_result result;
} *op_data_t;
-/* This callback is used to return the status of the assuan command
- back rather than transmission errors. */
-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_g13_result_t
-gpgme_op_g13_result (gpgme_ctx_t ctx)
+gpgme_vfs_mount_result_t
+gpgme_op_vfs_mount_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);
+ err = _gpgme_op_data_lookup (ctx, OPDATA_VFS_MOUNT, &hook, -1, NULL);
opd = hook;
/* Check in case this function is used without having run a command
before. */
@@ -77,14 +55,14 @@ gpgme_op_g13_result (gpgme_ctx_t ctx)
static gpgme_error_t
-opg13_start (gpgme_ctx_t ctx, int synchronous,
- 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)
+vfs_start (gpgme_ctx_t ctx, int synchronous,
+ 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 err;
void *hook;
@@ -99,14 +77,13 @@ opg13_start (gpgme_ctx_t ctx, int synchronous,
if (err)
return err;
- err = _gpgme_op_data_lookup (ctx, OPDATA_ASSUAN, &hook, sizeof (*opd), NULL);
+ err = _gpgme_op_data_lookup (ctx, OPDATA_VFS_MOUNT, &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);
@@ -116,7 +93,7 @@ opg13_start (gpgme_ctx_t ctx, int synchronous,
/* XXXX. This is the asynchronous variant. */
static gpgme_error_t
-gpgme_op_g13_transact_start (gpgme_ctx_t ctx,
+gpgme_op_vfs_transact_start (gpgme_ctx_t ctx,
const char *command,
gpgme_assuan_data_cb_t data_cb,
void *data_cb_value,
@@ -125,59 +102,52 @@ gpgme_op_g13_transact_start (gpgme_ctx_t ctx,
gpgme_assuan_status_cb_t status_cb,
void *status_cb_value)
{
- return opg13_start (ctx, 0, command, data_cb, data_cb_value,
- inq_cb, inq_cb_value, status_cb, status_cb_value);
+ return vfs_start (ctx, 0, command, data_cb, data_cb_value,
+ inq_cb, inq_cb_value, status_cb, status_cb_value);
}
/* XXXX. This is the synchronous variant. */
static gpgme_error_t
-gpgme_op_g13_transact (gpgme_ctx_t ctx,
+gpgme_op_vfs_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)
+ void *status_cb_value,
+ gpgme_error_t *op_err)
{
gpgme_error_t err;
- err = opg13_start (ctx, 1, command, data_cb, data_cb_value,
- inq_cb, inq_cb_value, status_cb, status_cb_value);
+ err = vfs_start (ctx, 1, command, data_cb, data_cb_value,
+ 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;
}
/* The actual exported interface follows. */
-static gpg_error_t
-get_err (gpgme_ctx_t ctx)
-{
- gpgme_g13_result_t res;
-
- res = gpgme_op_g13_result (ctx);
- if (! res)
- return gpg_error (GPG_ERR_GENERAL);
-
- return res->err;
-}
-
-
/* The container is automatically unmounted when the context is reset
or destroyed. This is a synchronous convenience interface, which
automatically returns an operation error if there is no
transmission error. */
gpgme_error_t
-gpgme_op_g13_mount (gpgme_ctx_t ctx, const char *container_file,
- const char *mount_dir, int flags)
+gpgme_op_vfs_mount (gpgme_ctx_t ctx, const char *container_file,
+ const char *mount_dir, int flags, gpgme_error_t *op_err)
{
gpg_error_t err;
char *cmd;
char *container_file_esc = NULL;
-
+
+ /* We want to encourage people to check error values, so not getting
+ them is discouraged here. Also makes our code easier. */
+ if (! op_err)
+ return gpg_error (GPG_ERR_INV_VALUE);
+
err = _gpgme_encode_percent_string (container_file, &container_file_esc, 0);
if (err)
return err;
@@ -190,11 +160,10 @@ gpgme_op_g13_mount (gpgme_ctx_t ctx, const char *container_file,
}
free (container_file_esc);
- err = gpgme_op_g13_transact (ctx, cmd, NULL, NULL, NULL, NULL,
- NULL, NULL);
+ err = gpgme_op_vfs_transact (ctx, cmd, NULL, NULL, NULL, NULL,
+ NULL, NULL, op_err);
free (cmd);
- err = err || get_err (ctx);
- if (err)
+ if (err || *op_err)
return err;
if (mount_dir)
@@ -219,11 +188,9 @@ gpgme_op_g13_mount (gpgme_ctx_t ctx, const char *container_file,
return gpg_error_from_syserror ();
}
- err = gpgme_op_g13_transact (ctx, cmd, NULL, NULL, NULL, NULL,
- NULL, NULL);
+ err = gpgme_op_vfs_transact (ctx, cmd, NULL, NULL, NULL, NULL,
+ NULL, NULL, op_err);
free (cmd);
- /* Note: in symmetry with the asynchronous variant, we don't return
- the error in the result structure here, if any. */
return err;
}