aboutsummaryrefslogtreecommitdiffstats
path: root/agent
diff options
context:
space:
mode:
authorMarcus Brinkmann <[email protected]>2009-09-23 00:01:25 +0000
committerMarcus Brinkmann <[email protected]>2009-09-23 00:01:25 +0000
commit3974488cd1fbe8471ec06b6ed057e56a446616b8 (patch)
treedf568235475e7575f891f072cb68190c85e4f3c0 /agent
parentStart a new development branch. (diff)
downloadgnupg-3974488cd1fbe8471ec06b6ed057e56a446616b8.tar.gz
gnupg-3974488cd1fbe8471ec06b6ed057e56a446616b8.zip
2009-09-23 Marcus Brinkmann <[email protected]>
* configure.ac (NEED_LIBASSUAN_API, NEED_LIBASSUAN_VERSION): Update to new API (2, 1.1.0). agent/ 2009-09-23 Marcus Brinkmann <[email protected]> * gpg-agent.c (parse_rereadable_options): Don't set global assuan log file (there ain't one anymore). (main): Update to new API. (check_own_socket_pid_cb): Return gpg_error_t instead of int. (check_own_socket_thread, check_for_running_agent): Create assuan context before connecting to server. * command.c: Include "scdaemon.h" before <assuan.h> because of GPG_ERR_SOURCE_DEFAULT check. (write_and_clear_outbuf): Use gpg_error_t instead of assuan_error_t. (cmd_geteventcounter, cmd_istrusted, cmd_listtrusted) (cmd_marktrusted, cmd_havekey, cmd_sigkey, cmd_setkeydesc) (cmd_sethash, cmd_pksign, cmd_pkdecrypt, cmd_genkey, cmd_readkey) (cmd_keyinfo, cmd_get_passphrase, cmd_clear_passphrase) (cmd_get_confirmation, cmd_learn, cmd_passwd) (cmd_preset_passphrase, cmd_scd, cmd_getval, cmd_putval) (cmd_updatestartuptty, cmd_killagent, cmd_reloadagent) (cmd_getinfo, option_handler): Return gpg_error_t instead of int. (post_cmd_notify): Change type of ERR to gpg_error_t from int. (io_monitor): Add hook argument. Use symbols for constants. (register_commands): Change return type of HANDLER to gpg_error_t. (start_command_handler): Allocate assuan context before starting server. * call-pinentry.c: Include "scdaemon.h" before <assuan.h> because of GPG_ERR_SOURCE_DEFAULT check. (unlock_pinentry): Call assuan_release instead of assuan_disconnect. (getinfo_pid_cb, getpin_cb): Return gpg_error_t instead of int. (start_pinentry): Allocate assuan context before connecting to server. * call-scd.c (membuf_data_cb, learn_status_cb, get_serialno_cb) (membuf_data_cb, inq_needpin, card_getattr_cb, pass_status_thru) (pass_data_thru): Change return type to gpg_error_t. (start_scd): Allocate assuan context before connecting to server. common/ 2009-09-23 Marcus Brinkmann <[email protected]> * asshelp.c (start_new_gpg_agent): Allocate assuan context before starting server. g10/ 2009-09-23 Marcus Brinkmann <[email protected]> * call-agent.c: Include "scdaemon.h" before <assuan.h> because of GPG_ERR_SOURCE_DEFAULT check. (learn_status_cb, dummy_data_cb, get_serialno_cb, default_inq_cb) (learn_status_cb, inq_writecert_parms, inq_writekey_parms) (scd_genkey_cb, membuf_data_cb): Return gpg_error_t instead of int. * gpg.c: Include "scdaemon.h" before <assuan.h> because of GPG_ERR_SOURCE_DEFAULT check. (main): Update to new Assuan API. * server.c: Include "scdaemon.h" before <assuan.h> because of GPG_ERR_SOURCE_DEFAULT check. (option_handler, cmd_recipient, cmd_signer, cmd_encrypt) (cmd_decrypt, cmd_verify, cmd_sign, cmd_import, cmd_export) (cmd_delkeys, cmd_message, do_listkeys, cmd_listkeys) (cmd_listsecretkeys, cmd_genkey, cmd_getinfo): Return gpg_error_t instead of int. (register_commands): Allocate assuan context before starting server. (gpg_server): Allocate assuan_context before starting server. scd/ 2009-09-23 Marcus Brinkmann <[email protected]> * command.c: Include "scdaemon.h" before <assuan.h> because of GPG_ERR_SOURCE_DEFAULT check. (option_handler, open_card, cmd_serialno, cmd_lean, cmd_readcert) (cmd_readkey, cmd_setdata, cmd_pksign, cmd_pkauth, cmd_pkdecrypt) (cmd_getattr, cmd_setattr, cmd_writecert, cmd_writekey) (cmd_genkey, cmd_random, cmd_passwd, cmd_checkpin, cmd_lock) (cmd_unlock, cmd_getinfo, cmd_restart, cmd_disconnect, cmd_apdu) (cmd_killscd): Return gpg_error_t instead of int. (scd_command_handler): Allocate assuan context before starting server. * scdaemon.c (main): Update to new Assuan API. sm/ 2009-09-23 Marcus Brinkmann <[email protected]> * gpgsm.c (main): Update to new assuan API. * server.c: Include "gpgsm.h" before <assuan.h> due to check for GPG_ERR_SOURCE_DEFAULT and assuan.h now including gpg-error.h. (option_handler, cmd_recipient, cmd_signer, cmd_encrypt) (cmd_decrypt, cmd_verify, cmd_sign, cmd_import, cmd_export) (cmd_delkeys, cmd_message, cmd_listkeys, cmd_dumpkeys) (cmd_listsecretkeys, cmd_dumpsecretkeys, cmd_genkey) (cmd_getauditlog, cmd_getinfo): Return gpg_error_t instead of int. (register_commands): Same for member HANDLER in table. (gpgsm_server): Allocate assuan context before starting server. * sm/call-dirmngr.c: * call-dirmngr.c (prepare_dirmngr): Check for CTX and error before setting LDAPSERVER. (start_dirmngr_ext): Allocate assuan context before starting server. (inq_certificate, isvalid_status_cb, lookup_cb, lookup_status_cb) (run_command_cb, run_command_inq_cb, run_command_status_cb): Return gpg_error_t instead of int. tools/ 2009-09-23 Marcus Brinkmann <[email protected]> * gpg-connect-agent.c (getinfo_pid_cb, read_and_print_response) (main): Update to new Assuan API.
Diffstat (limited to 'agent')
-rw-r--r--agent/ChangeLog37
-rw-r--r--agent/call-pinentry.c20
-rw-r--r--agent/call-scd.c40
-rw-r--r--agent/command.c92
-rw-r--r--agent/gpg-agent.c40
5 files changed, 152 insertions, 77 deletions
diff --git a/agent/ChangeLog b/agent/ChangeLog
index 9d1a9a03f..2544274a2 100644
--- a/agent/ChangeLog
+++ b/agent/ChangeLog
@@ -1,3 +1,40 @@
+2009-09-23 Marcus Brinkmann <[email protected]>
+
+ * gpg-agent.c (parse_rereadable_options): Don't set global assuan
+ log file (there ain't one anymore).
+ (main): Update to new API.
+ (check_own_socket_pid_cb): Return gpg_error_t instead of int.
+ (check_own_socket_thread, check_for_running_agent): Create assuan
+ context before connecting to server.
+ * command.c: Include "scdaemon.h" before <assuan.h> because of
+ GPG_ERR_SOURCE_DEFAULT check.
+ (write_and_clear_outbuf): Use gpg_error_t instead of
+ assuan_error_t.
+ (cmd_geteventcounter, cmd_istrusted, cmd_listtrusted)
+ (cmd_marktrusted, cmd_havekey, cmd_sigkey, cmd_setkeydesc)
+ (cmd_sethash, cmd_pksign, cmd_pkdecrypt, cmd_genkey, cmd_readkey)
+ (cmd_keyinfo, cmd_get_passphrase, cmd_clear_passphrase)
+ (cmd_get_confirmation, cmd_learn, cmd_passwd)
+ (cmd_preset_passphrase, cmd_scd, cmd_getval, cmd_putval)
+ (cmd_updatestartuptty, cmd_killagent, cmd_reloadagent)
+ (cmd_getinfo, option_handler): Return gpg_error_t instead of int.
+ (post_cmd_notify): Change type of ERR to gpg_error_t from int.
+ (io_monitor): Add hook argument. Use symbols for constants.
+ (register_commands): Change return type of HANDLER to gpg_error_t.
+ (start_command_handler): Allocate assuan context before starting
+ server.
+ * call-pinentry.c: Include "scdaemon.h" before <assuan.h> because
+ of GPG_ERR_SOURCE_DEFAULT check.
+ (unlock_pinentry): Call assuan_release instead of
+ assuan_disconnect.
+ (getinfo_pid_cb, getpin_cb): Return gpg_error_t instead of int.
+ (start_pinentry): Allocate assuan context before connecting to
+ server.
+ * call-scd.c (membuf_data_cb, learn_status_cb, get_serialno_cb)
+ (membuf_data_cb, inq_needpin, card_getattr_cb, pass_status_thru)
+ (pass_data_thru): Change return type to gpg_error_t.
+ (start_scd): Allocate assuan context before connecting to server.
+
2009-09-04 Marcus Brinkmann <[email protected]>
* command.c (start_command_handler): Add comment about gap in
diff --git a/agent/call-pinentry.c b/agent/call-pinentry.c
index 5e9685f61..172a88914 100644
--- a/agent/call-pinentry.c
+++ b/agent/call-pinentry.c
@@ -32,9 +32,9 @@
# include <signal.h>
#endif
#include <pth.h>
-#include <assuan.h>
#include "agent.h"
+#include <assuan.h>
#include "setenv.h"
#include "i18n.h"
@@ -158,7 +158,7 @@ unlock_pinentry (int rc)
if (!rc)
rc = gpg_error (GPG_ERR_INTERNAL);
}
- assuan_disconnect (ctx);
+ assuan_release (ctx);
return rc;
}
@@ -196,7 +196,7 @@ atfork_cb (void *opaque, int where)
}
-static int
+static gpg_error_t
getinfo_pid_cb (void *opaque, const void *buffer, size_t length)
{
unsigned long *pid = opaque;
@@ -309,16 +309,24 @@ start_pinentry (ctrl_t ctrl)
}
no_close_list[i] = -1;
+ rc = assuan_new (&ctx);
+ if (rc)
+ {
+ log_error ("can't allocate assuan context: %s\n", gpg_strerror (rc));
+ return rc;
+ }
+
/* Connect to the pinentry and perform initial handshaking. Note
that atfork is used to change the environment for pinentry. We
start the server in detached mode to suppress the console window
under Windows. */
- rc = assuan_pipe_connect_ext (&ctx, opt.pinentry_program, argv,
+ rc = assuan_pipe_connect_ext (ctx, opt.pinentry_program, argv,
no_close_list, atfork_cb, ctrl, 128);
if (rc)
{
log_error ("can't connect to the PIN entry module: %s\n",
gpg_strerror (rc));
+ assuan_release (ctx);
return unlock_pinentry (gpg_error (GPG_ERR_NO_PIN_ENTRY));
}
entry_ctx = ctx;
@@ -463,7 +471,7 @@ pinentry_active_p (ctrl_t ctrl, int waitseconds)
}
-static int
+static gpg_error_t
getpin_cb (void *opaque, const void *buffer, size_t length)
{
struct entry_parm_s *parm = opaque;
@@ -553,7 +561,7 @@ estimate_passphrase_quality (const char *pw)
/* Handle the QUALITY inquiry. */
-static int
+static gpg_error_t
inq_quality (void *opaque, const char *line)
{
assuan_context_t ctx = opaque;
diff --git a/agent/call-scd.c b/agent/call-scd.c
index d09812e57..521086848 100644
--- a/agent/call-scd.c
+++ b/agent/call-scd.c
@@ -108,8 +108,8 @@ static int primary_scd_ctx_reusable;
/* Local prototypes. */
-static assuan_error_t membuf_data_cb (void *opaque,
- const void *buffer, size_t length);
+static gpg_error_t membuf_data_cb (void *opaque,
+ const void *buffer, size_t length);
@@ -209,7 +209,7 @@ start_scd (ctrl_t ctrl)
{
gpg_error_t err = 0;
const char *pgmname;
- assuan_context_t ctx;
+ assuan_context_t ctx = NULL;
const char *argv[3];
int no_close_list[3];
int i;
@@ -268,9 +268,17 @@ start_scd (ctrl_t ctrl)
goto leave;
}
+ rc = assuan_new (&ctx);
+ if (rc)
+ {
+ log_error ("can't allocate assuan context: %s\n", gpg_strerror (rc));
+ err = rc;
+ goto leave;
+ }
+
if (socket_name)
{
- rc = assuan_socket_connect (&ctx, socket_name, 0);
+ rc = assuan_socket_connect (ctx, socket_name, 0);
if (rc)
{
log_error ("can't connect to socket `%s': %s\n",
@@ -333,7 +341,7 @@ start_scd (ctrl_t ctrl)
/* Connect to the pinentry and perform initial handshaking. Use
detached flag (128) so that under W32 SCDAEMON does not show up a
new window. */
- rc = assuan_pipe_connect_ext (&ctx, opt.scdaemon_program, argv,
+ rc = assuan_pipe_connect_ext (ctx, opt.scdaemon_program, argv,
no_close_list, atfork_cb, NULL, 128);
if (rc)
{
@@ -399,6 +407,8 @@ start_scd (ctrl_t ctrl)
if (err)
{
unlock_scd (ctrl, err);
+ if (ctx)
+ assuan_release (ctx);
}
else
{
@@ -477,14 +487,14 @@ agent_scd_check_aliveness (void)
struct scd_local_s *sl;
assuan_set_flag (primary_scd_ctx, ASSUAN_NO_WAITPID, 1);
- assuan_disconnect (primary_scd_ctx);
+ assuan_release (primary_scd_ctx);
for (sl=scd_local_list; sl; sl = sl->next_local)
{
if (sl->ctx)
{
if (sl->ctx != primary_scd_ctx)
- assuan_disconnect (sl->ctx);
+ assuan_release (sl->ctx);
sl->ctx = NULL;
}
}
@@ -534,7 +544,7 @@ agent_reset_scd (ctrl_t ctrl)
primary_scd_ctx_reusable = 1;
}
else
- assuan_disconnect (ctrl->scd_local->ctx);
+ assuan_release (ctrl->scd_local->ctx);
ctrl->scd_local->ctx = NULL;
}
@@ -563,7 +573,7 @@ agent_reset_scd (ctrl_t ctrl)
-static int
+static gpg_error_t
learn_status_cb (void *opaque, const char *line)
{
struct learn_parm_s *parm = opaque;
@@ -626,7 +636,7 @@ agent_card_learn (ctrl_t ctrl,
-static int
+static gpg_error_t
get_serialno_cb (void *opaque, const char *line)
{
char **serialno = opaque;
@@ -684,7 +694,7 @@ agent_card_serialno (ctrl_t ctrl, char **r_serialno)
-static assuan_error_t
+static gpg_error_t
membuf_data_cb (void *opaque, const void *buffer, size_t length)
{
membuf_t *data = opaque;
@@ -695,7 +705,7 @@ membuf_data_cb (void *opaque, const void *buffer, size_t length)
}
/* Handle the NEEDPIN inquiry. */
-static int
+static gpg_error_t
inq_needpin (void *opaque, const char *line)
{
struct inq_needpin_s *parm = opaque;
@@ -991,7 +1001,7 @@ struct card_getattr_parm_s {
};
/* Callback function for agent_card_getattr. */
-static assuan_error_t
+static gpg_error_t
card_getattr_cb (void *opaque, const char *line)
{
struct card_getattr_parm_s *parm = opaque;
@@ -1067,7 +1077,7 @@ agent_card_getattr (ctrl_t ctrl, const char *name, char **result)
-static int
+static gpg_error_t
pass_status_thru (void *opaque, const char *line)
{
assuan_context_t ctx = opaque;
@@ -1087,7 +1097,7 @@ pass_status_thru (void *opaque, const char *line)
return 0;
}
-static int
+static gpg_error_t
pass_data_thru (void *opaque, const void *buffer, size_t length)
{
assuan_context_t ctx = opaque;
diff --git a/agent/command.c b/agent/command.c
index e893aea1e..b863a6a8c 100644
--- a/agent/command.c
+++ b/agent/command.c
@@ -34,10 +34,9 @@
#include <sys/stat.h>
#include <dirent.h>
+#include "agent.h"
#include <assuan.h>
-
#include "i18n.h"
-#include "agent.h"
/* maximum allowed size of the inquired ciphertext */
#define MAXLEN_CIPHERTEXT 4096
@@ -133,7 +132,7 @@ clear_outbuf (membuf_t *mb)
static gpg_error_t
write_and_clear_outbuf (assuan_context_t ctx, membuf_t *mb)
{
- assuan_error_t ae;
+ gpg_error_t ae;
void *p;
size_t n;
@@ -354,7 +353,7 @@ agent_inq_pinentry_launched (ctrl_t ctrl, unsigned long pid)
KEY - Incremented for added or removed private keys.
CARD - Incremented for changes of the card readers stati.
*/
-static int
+static gpg_error_t
cmd_geteventcounter (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -403,7 +402,7 @@ bump_card_eventcounter (void)
Return OK when we have an entry with this fingerprint in our
trustlist */
-static int
+static gpg_error_t
cmd_istrusted (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -440,7 +439,7 @@ cmd_istrusted (assuan_context_t ctx, char *line)
/* LISTTRUSTED
List all entries from the trustlist */
-static int
+static gpg_error_t
cmd_listtrusted (assuan_context_t ctx, char *line)
{
int rc;
@@ -457,7 +456,7 @@ cmd_listtrusted (assuan_context_t ctx, char *line)
/* MARKTRUSTED <hexstring_with_fingerprint> <flag> <display_name>
Store a new key in into the trustlist*/
-static int
+static gpg_error_t
cmd_marktrusted (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -501,7 +500,7 @@ cmd_marktrusted (assuan_context_t ctx, char *line)
/* HAVEKEY <hexstring_with_keygrip>
Return success when the secret key is available */
-static int
+static gpg_error_t
cmd_havekey (assuan_context_t ctx, char *line)
{
int rc;
@@ -522,7 +521,7 @@ cmd_havekey (assuan_context_t ctx, char *line)
SETKEY <hexstring_with_keygrip>
Set the key used for a sign or decrypt operation */
-static int
+static gpg_error_t
cmd_sigkey (assuan_context_t ctx, char *line)
{
int rc;
@@ -550,7 +549,7 @@ cmd_sigkey (assuan_context_t ctx, char *line)
The description is only valid for the next PKSIGN or PKDECRYPT
operation.
*/
-static int
+static gpg_error_t
cmd_setkeydesc (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -584,7 +583,7 @@ cmd_setkeydesc (assuan_context_t ctx, char *line)
The client can use this command to tell the server about the data
(which usually is a hash) to be signed. */
-static int
+static gpg_error_t
cmd_sethash (assuan_context_t ctx, char *line)
{
int rc;
@@ -662,7 +661,7 @@ cmd_sethash (assuan_context_t ctx, char *line)
Perform the actual sign operation. Neither input nor output are
sensitive to eavesdropping. */
-static int
+static gpg_error_t
cmd_pksign (assuan_context_t ctx, char *line)
{
int rc;
@@ -696,7 +695,7 @@ cmd_pksign (assuan_context_t ctx, char *line)
Perform the actual decrypt operation. Input is not
sensitive to eavesdropping */
-static int
+static gpg_error_t
cmd_pkdecrypt (assuan_context_t ctx, char *line)
{
int rc;
@@ -744,7 +743,7 @@ cmd_pkdecrypt (assuan_context_t ctx, char *line)
S OK key created
*/
-static int
+static gpg_error_t
cmd_genkey (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -779,7 +778,7 @@ cmd_genkey (assuan_context_t ctx, char *line)
/* READKEY <hexstring_with_keygrip>
Return the public key for the given keygrip. */
-static int
+static gpg_error_t
cmd_readkey (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -892,7 +891,7 @@ do_one_keyinfo (ctrl_t ctrl, const unsigned char *grip)
}
-static int
+static gpg_error_t
cmd_keyinfo (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -1014,7 +1013,7 @@ send_back_passphrase (assuan_context_t ctx, int via_data, const char *pw)
length has been configured.)
*/
-static int
+static gpg_error_t
cmd_get_passphrase (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -1167,7 +1166,7 @@ cmd_get_passphrase (assuan_context_t ctx, char *line)
function returns with OK even when there is no cached passphrase.
*/
-static int
+static gpg_error_t
cmd_clear_passphrase (assuan_context_t ctx, char *line)
{
char *cacheid = NULL;
@@ -1200,7 +1199,7 @@ cmd_clear_passphrase (assuan_context_t ctx, char *line)
as '+'.
*/
-static int
+static gpg_error_t
cmd_get_confirmation (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -1241,7 +1240,7 @@ cmd_get_confirmation (assuan_context_t ctx, char *line)
Learn something about the currently inserted smartcard. With
--send the new certificates are send back. */
-static int
+static gpg_error_t
cmd_learn (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -1258,7 +1257,7 @@ cmd_learn (assuan_context_t ctx, char *line)
/* PASSWD <hexstring_with_keygrip>
Change the passphrase/PIN for the key identified by keygrip in LINE. */
-static int
+static gpg_error_t
cmd_passwd (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -1304,7 +1303,7 @@ cmd_passwd (assuan_context_t ctx, char *line)
the default (currently only a timeout of -1 is allowed, which means
to never expire it). If passwd is not provided, ask for it via the
pinentry module. */
-static int
+static gpg_error_t
cmd_preset_passphrase (assuan_context_t ctx, char *line)
{
int rc;
@@ -1367,7 +1366,7 @@ cmd_preset_passphrase (assuan_context_t ctx, char *line)
This is a general quote command to redirect everything to the
SCDAEMON. */
-static int
+static gpg_error_t
cmd_scd (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -1385,7 +1384,7 @@ cmd_scd (assuan_context_t ctx, char *line)
Return the value for KEY from the special environment as created by
PUTVAL.
*/
-static int
+static gpg_error_t
cmd_getval (assuan_context_t ctx, char *line)
{
int rc = 0;
@@ -1442,7 +1441,7 @@ cmd_getval (assuan_context_t ctx, char *line)
restrictions. If that value is not given any value under that KEY
is removed from this special environment.
*/
-static int
+static gpg_error_t
cmd_putval (assuan_context_t ctx, char *line)
{
int rc = 0;
@@ -1517,7 +1516,7 @@ cmd_putval (assuan_context_t ctx, char *line)
session. This command is useful to pull future pinentries to
another screen. It is only required because there is no way in the
ssh-agent protocol to convey this information. */
-static int
+static gpg_error_t
cmd_updatestartuptty (assuan_context_t ctx, char *line)
{
static const char *names[] =
@@ -1576,7 +1575,7 @@ cmd_updatestartuptty (assuan_context_t ctx, char *line)
Under Windows we start the agent on the fly. Thus it also make
sense to allow a client to stop the agent. */
-static int
+static gpg_error_t
cmd_killagent (assuan_context_t ctx, char *line)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -1591,7 +1590,7 @@ cmd_killagent (assuan_context_t ctx, char *line)
As signals are inconvenient under Windows, we provide this command
to allow reloading of the configuration. */
-static int
+static gpg_error_t
cmd_reloadagent (assuan_context_t ctx, char *line)
{
(void)ctx;
@@ -1615,10 +1614,10 @@ cmd_reloadagent (assuan_context_t ctx, char *line)
ssh_socket_name - Return the name of the ssh socket.
scd_running - Return OK if the SCdaemon is already running.
- cmd_has_option CMD OPT
+ gpg_error_t
- Returns OK if the command CMD implements the option OPT.
*/
-static int
+static gpg_error_t
cmd_getinfo (assuan_context_t ctx, char *line)
{
int rc = 0;
@@ -1696,7 +1695,7 @@ cmd_getinfo (assuan_context_t ctx, char *line)
-static int
+static gpg_error_t
option_handler (assuan_context_t ctx, const char *key, const char *value)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -1766,7 +1765,7 @@ option_handler (assuan_context_t ctx, const char *key, const char *value)
/* Called by libassuan after all commands. ERR is the error from the
last assuan operation and not the one returned from the command. */
static void
-post_cmd_notify (assuan_context_t ctx, int err)
+post_cmd_notify (assuan_context_t ctx, gpg_error_t err)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
@@ -1782,15 +1781,17 @@ post_cmd_notify (assuan_context_t ctx, int err)
that the debug output won't get cluttered by this primitive
command. */
static unsigned int
-io_monitor (assuan_context_t ctx, int direction,
+io_monitor (assuan_context_t ctx, void *hook, int direction,
const char *line, size_t linelen)
{
ctrl_t ctrl = assuan_get_pointer (ctx);
+ (void) hook;
+
/* Note that we only check for the uppercase name. This allows to
see the logging for debugging if using a non-upercase command
name. */
- if (ctx && !direction
+ if (ctx && direction == ASSUAN_IO_FROM_PEER
&& linelen >= 15
&& !strncmp (line, "GETEVENTCOUNTER", 15)
&& (linelen == 15 || spacep (line+15)))
@@ -1798,7 +1799,7 @@ io_monitor (assuan_context_t ctx, int direction,
ctrl->server_local->pause_io_logging = 1;
}
- return ctrl->server_local->pause_io_logging? 1:0;
+ return ctrl->server_local->pause_io_logging? ASSUAN_IO_MONITOR_NOLOG : 0;
}
@@ -1822,7 +1823,7 @@ register_commands (assuan_context_t ctx)
{
static struct {
const char *name;
- int (*handler)(assuan_context_t, char *line);
+ gpg_error_t (*handler)(assuan_context_t, char *line);
} table[] = {
{ "GETEVENTCOUNTER",cmd_geteventcounter },
{ "ISTRUSTED", cmd_istrusted },
@@ -1882,7 +1883,14 @@ void
start_command_handler (ctrl_t ctrl, gnupg_fd_t listen_fd, gnupg_fd_t fd)
{
int rc;
- assuan_context_t ctx;
+ assuan_context_t ctx = NULL;
+
+ rc = assuan_new (&ctx);
+ if (rc)
+ {
+ log_error ("failed to allocate assuan context: %s\n", gpg_strerror (rc));
+ agent_exit (2);
+ }
if (listen_fd == GNUPG_INVALID_FD && fd == GNUPG_INVALID_FD)
{
@@ -1890,17 +1898,17 @@ start_command_handler (ctrl_t ctrl, gnupg_fd_t listen_fd, gnupg_fd_t fd)
filedes[0] = 0;
filedes[1] = 1;
- rc = assuan_init_pipe_server (&ctx, filedes);
+ rc = assuan_init_pipe_server (ctx, filedes);
}
else if (listen_fd != GNUPG_INVALID_FD)
{
- rc = assuan_init_socket_server_ext (&ctx, listen_fd, 0);
+ rc = assuan_init_socket_server_ext (ctx, listen_fd, 0);
/* FIXME: Need to call assuan_sock_set_nonce for Windows. But
this branch is currently not used. */
}
else
{
- rc = assuan_init_socket_server_ext (&ctx, fd, 2);
+ rc = assuan_init_socket_server_ext (ctx, fd, 2);
}
if (rc)
{
@@ -1927,7 +1935,7 @@ start_command_handler (ctrl_t ctrl, gnupg_fd_t listen_fd, gnupg_fd_t fd)
assuan_set_log_stream (ctx, log_get_stream ());
#ifdef HAVE_ASSUAN_SET_IO_MONITOR
- assuan_set_io_monitor (ctx, io_monitor);
+ assuan_set_io_monitor (ctx, io_monitor, NULL);
#endif
for (;;)
@@ -1958,7 +1966,7 @@ start_command_handler (ctrl_t ctrl, gnupg_fd_t listen_fd, gnupg_fd_t fd)
agent_reset_query (ctrl);
/* Cleanup. */
- assuan_deinit_server (ctx);
+ assuan_release (ctx);
#ifdef HAVE_W32_SYSTEM
if (ctrl->server_local->stopme)
agent_exit (0);
diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c
index 2e8156721..4493c7abd 100644
--- a/agent/gpg-agent.c
+++ b/agent/gpg-agent.c
@@ -471,7 +471,6 @@ parse_rereadable_options (ARGPARSE_ARGS *pargs, int reread)
|| strcmp (current_logfile, pargs->r.ret_str))
{
log_set_file (pargs->r.ret_str);
- assuan_set_assuan_log_stream (log_get_stream ());
xfree (current_logfile);
current_logfile = xtrystrdup (pargs->r.ret_str);
}
@@ -545,7 +544,7 @@ main (int argc, char **argv )
int gpgconf_list = 0;
gpg_error_t err;
const char *env_file_name = NULL;
-
+ struct assuan_malloc_hooks malloc_hooks;
/* Before we do anything else we save the list of currently open
file descriptors and the signal mask. This info is required to
@@ -588,10 +587,12 @@ main (int argc, char **argv )
NEED_LIBGCRYPT_VERSION, gcry_check_version (NULL) );
}
- assuan_set_malloc_hooks (gcry_malloc, gcry_realloc, gcry_free);
- assuan_set_assuan_log_stream (log_get_stream ());
+ malloc_hooks.malloc = gcry_malloc;
+ malloc_hooks.realloc = gcry_realloc;
+ malloc_hooks.free = gcry_free;
+ assuan_set_malloc_hooks (&malloc_hooks);
assuan_set_assuan_log_prefix (log_get_prefix (NULL));
- assuan_set_assuan_err_source (GPG_ERR_SOURCE_DEFAULT);
+ assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
setup_libgcrypt_logging ();
gcry_control (GCRYCTL_USE_SECURE_RNDPOOL);
@@ -917,7 +918,6 @@ main (int argc, char **argv )
|JNLIB_LOG_WITH_TIME
|JNLIB_LOG_WITH_PID));
current_logfile = xstrdup (logfile);
- assuan_set_assuan_log_stream (log_get_stream ());
}
/* Make sure that we have a default ttyname. */
@@ -2048,7 +2048,7 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh)
/* Helper for check_own_socket. */
-static int
+static gpg_error_t
check_own_socket_pid_cb (void *opaque, const void *buffer, size_t length)
{
membuf_t *mb = opaque;
@@ -2065,16 +2065,23 @@ check_own_socket_thread (void *arg)
{
int rc;
char *sockname = arg;
- assuan_context_t ctx;
+ assuan_context_t ctx = NULL;
membuf_t mb;
char *buffer;
check_own_socket_running++;
- rc = assuan_socket_connect (&ctx, sockname, (pid_t)(-1));
+ rc = assuan_new (&ctx);
xfree (sockname);
if (rc)
{
+ log_error ("can't allocate assuan context: %s\n", gpg_strerror (rc));
+ goto leave;
+ }
+
+ rc = assuan_socket_connect (ctx, sockname, (pid_t)(-1));
+ if (rc)
+ {
log_error ("can't connect my own socket: %s\n", gpg_strerror (rc));
goto leave;
}
@@ -2099,9 +2106,10 @@ check_own_socket_thread (void *arg)
log_error ("socket is still served by this server\n");
xfree (buffer);
- assuan_disconnect (ctx);
leave:
+ if (ctx)
+ assuan_release (ctx);
if (rc)
{
/* We may not remove the socket as it is now in use by another
@@ -2159,7 +2167,7 @@ check_for_running_agent (int silent, int mode)
{
int rc;
char *infostr, *p;
- assuan_context_t ctx;
+ assuan_context_t ctx = NULL;
int prot, pid;
if (!mode)
@@ -2207,8 +2215,9 @@ check_for_running_agent (int silent, int mode)
pid = (pid_t)(-1);
}
-
- rc = assuan_socket_connect (&ctx, infostr, pid);
+ rc = assuan_new (&ctx);
+ if (! rc)
+ rc = assuan_socket_connect (&ctx, infostr, pid);
xfree (infostr);
if (rc)
{
@@ -2217,12 +2226,15 @@ check_for_running_agent (int silent, int mode)
if (!mode && !silent)
log_error ("can't connect to the agent: %s\n", gpg_strerror (rc));
+
+ if (ctx)
+ assuan_release (ctx);
return -1;
}
if (!opt.quiet && !silent)
log_info ("gpg-agent running and available\n");
- assuan_disconnect (ctx);
+ assuan_release (ctx);
return 0;
}