* engine.h (engine_command_handler_t): Add new argument processed.
* ops.h (_gpgme_passphrase_command_handler_internal): Rename
prototype to ...
(_gpgme_passphrase_command_handler): ... this one.
* passphrase.c (_gpgme_passphrase_command_handler_internal):
Rename to ...
(_gpgme_passphrase_command_handler): ... this one.
* edit.c (command_handler): Add new argument processed. Remove
local variable with the same name. Always return processed as
true.
* rungpg.c (command_handler): Send a newline character if the
handler did not.
** Add notation data to key signatures.
* ABI's to break:
+** gpgme_edit_cb_t: Add "processed" return argument
+ (see edit.c::command_handler).
** I/O and User Data could be made extensible. But this can be done
without breaking the ABI hopefully.
* All enums that should be enums need to have a maximum value to ensure
+2005-08-26 Marcus Brinkmann <marcus@g10code.de>
+
+ * engine.h (engine_command_handler_t): Add new argument processed.
+ * ops.h (_gpgme_passphrase_command_handler_internal): Rename
+ prototype to ...
+ (_gpgme_passphrase_command_handler): ... this one.
+ * passphrase.c (_gpgme_passphrase_command_handler_internal):
+ Rename to ...
+ (_gpgme_passphrase_command_handler): ... this one.
+ * edit.c (command_handler): Add new argument processed. Remove
+ local variable with the same name. Always return processed as
+ true.
+ * rungpg.c (command_handler): Send a newline character if the
+ handler did not.
+
2005-08-26 Werner Koch <wk@g10code.com>
* w32-util.c (read_w32_registry_string): Updated from code used by
static gpgme_error_t
command_handler (void *priv, gpgme_status_code_t status, const char *args,
- int fd)
+ int fd, int *processed)
{
gpgme_ctx_t ctx = (gpgme_ctx_t) priv;
gpgme_error_t err;
- int processed = 0;
if (ctx->passphrase_cb)
{
- err = _gpgme_passphrase_command_handler_internal (ctx, status, args,
- fd, &processed);
+ err = _gpgme_passphrase_command_handler (ctx, status, args,
+ fd, processed);
if (err)
return err;
}
- if (!processed)
+ if (!*processed)
{
void *hook;
op_data_t opd;
if (err)
return err;
+ /* FIXME: We expect the user to handle _all_ status codes.
+ Later, we may fix the callback interface to allow the user
+ indicate if it processed the status code or not. */
+ *processed = 1;
+
return (*opd->fnc) (opd->fnc_value, status, args, fd);
}
+
return 0;
}
typedef gpgme_error_t (*engine_command_handler_t) (void *priv,
gpgme_status_code_t code,
const char *keyword,
- int fd);
+ int fd, int *processed);
/* Get a deep copy of the engine info and return it in INFO. */
gpgme_error_t _gpgme_engine_info_copy (gpgme_engine_info_t *r_info);
gpgme_status_code_t code,
char *args);
gpgme_error_t _gpgme_passphrase_command_handler (void *opaque,
- gpgme_status_code_t code,
- const char *key, int fd);
-gpgme_error_t _gpgme_passphrase_command_handler_internal (void *opaque,
gpgme_status_code_t code,
const char *key, int fd,
int *processed);
gpgme_error_t
-_gpgme_passphrase_command_handler_internal (void *priv,
- gpgme_status_code_t code,
- const char *key, int fd,
- int *processed)
+_gpgme_passphrase_command_handler (void *priv, gpgme_status_code_t code,
+ const char *key, int fd, int *processed)
{
gpgme_ctx_t ctx = (gpgme_ctx_t) priv;
gpgme_error_t err;
return 0;
}
-
-
-gpgme_error_t
-_gpgme_passphrase_command_handler (void *priv, gpgme_status_code_t code,
- const char *key, int fd)
-{
- return _gpgme_passphrase_command_handler_internal (priv, code, key, fd,
- NULL);
-}
{
gpgme_error_t err;
engine_gpg_t gpg = (engine_gpg_t) opaque;
+ int processed = 0;
assert (gpg->cmd.used);
assert (gpg->cmd.code);
assert (gpg->cmd.fnc);
- err = gpg->cmd.fnc (gpg->cmd.fnc_value, gpg->cmd.code, gpg->cmd.keyword, fd);
+ err = gpg->cmd.fnc (gpg->cmd.fnc_value, gpg->cmd.code, gpg->cmd.keyword, fd,
+ &processed);
if (err)
return err;
+ /* We always need to send at least a newline character. */
+ if (!processed)
+ write (fd, "\n", 1);
+
gpg->cmd.code = 0;
/* And sleep again until read_status will wake us up again. */
/* XXX We must check if there are any more fds active after removing