diff options
Diffstat (limited to 'src/assuan-socket-connect.c')
-rw-r--r-- | src/assuan-socket-connect.c | 92 |
1 files changed, 47 insertions, 45 deletions
diff --git a/src/assuan-socket-connect.c b/src/assuan-socket-connect.c index 8a8cb92..ac2df5b 100644 --- a/src/assuan-socket-connect.c +++ b/src/assuan-socket-connect.c @@ -33,6 +33,7 @@ #endif #include "assuan-defs.h" +#include "debug.h" /* Hacks for Slowaris. */ #ifndef PF_LOCAL @@ -52,18 +53,22 @@ #endif -static int +static void do_finish (assuan_context_t ctx) { if (ctx->inbound.fd != ASSUAN_INVALID_FD) { _assuan_close (ctx->inbound.fd); + ctx->inbound.fd = ASSUAN_INVALID_FD; + } + if (ctx->outbound.fd != ASSUAN_INVALID_FD) + { + _assuan_close (ctx->outbound.fd); + ctx->outbound.fd = ASSUAN_INVALID_FD; } - ctx->inbound.fd = ASSUAN_INVALID_FD; - ctx->outbound.fd = ASSUAN_INVALID_FD; - return 0; } + static void do_deinit (assuan_context_t ctx) { @@ -75,10 +80,10 @@ do_deinit (assuan_context_t ctx) Assuan context in CTX. SERVER_PID is currently not used but may become handy in the future. */ gpg_error_t -assuan_socket_connect (assuan_context_t *r_ctx, +assuan_socket_connect (assuan_context_t ctx, const char *name, pid_t server_pid) { - return assuan_socket_connect_ext (r_ctx, name, server_pid, 0); + return assuan_socket_connect_ext (ctx, name, server_pid, 0); } @@ -87,22 +92,21 @@ assuan_socket_connect (assuan_context_t *r_ctx, become handy in the future. With flags set to 1 sendmsg and recvmsg are used. */ gpg_error_t -assuan_socket_connect_ext (assuan_context_t *r_ctx, +assuan_socket_connect_ext (assuan_context_t ctx, const char *name, pid_t server_pid, unsigned int flags) { static struct assuan_io io = { _assuan_simple_read, _assuan_simple_write, NULL, NULL }; gpg_error_t err; - assuan_context_t ctx; assuan_fd_t fd; struct sockaddr_un srvr_addr; size_t len; const char *s; - if (!r_ctx || !name) - return _assuan_error (GPG_ERR_ASS_INV_VALUE); - *r_ctx = NULL; + + if (!ctx || !name) + return _assuan_error (ctx, GPG_ERR_ASS_INV_VALUE); /* We require that the name starts with a slash, so that we eventually can reuse this function for other socket types. To @@ -111,23 +115,18 @@ assuan_socket_connect_ext (assuan_context_t *r_ctx, if (*s && s[1] == ':') s += 2; if (*s != DIRSEP_C && *s != '/') - return _assuan_error (GPG_ERR_ASS_INV_VALUE); + return _assuan_error (ctx, GPG_ERR_ASS_INV_VALUE); if (strlen (name)+1 >= sizeof srvr_addr.sun_path) - return _assuan_error (GPG_ERR_ASS_INV_VALUE); - - err = _assuan_new_context (&ctx); - if (err) - return err; - ctx->deinit_handler = ((flags&1))? _assuan_uds_deinit : do_deinit; - ctx->finish_handler = do_finish; + return _assuan_error (ctx, GPG_ERR_ASS_INV_VALUE); fd = _assuan_sock_new (PF_LOCAL, SOCK_STREAM, 0); if (fd == ASSUAN_INVALID_FD) { - _assuan_log_printf ("can't create socket: %s\n", strerror (errno)); - _assuan_release_context (ctx); - return _assuan_error (GPG_ERR_ASS_GENERAL); + TRACE1 (ctx, ASSUAN_LOG_SYSIO, "assuan_socket_connect_ext", ctx, + "can't create socket: %s", strerror (errno)); + /* FIXME: Cleanup */ + return _assuan_error (ctx, GPG_ERR_ASS_GENERAL); } memset (&srvr_addr, 0, sizeof srvr_addr); @@ -138,43 +137,46 @@ assuan_socket_connect_ext (assuan_context_t *r_ctx, if ( _assuan_sock_connect (fd, (struct sockaddr *) &srvr_addr, len) == -1 ) { - _assuan_log_printf ("can't connect to `%s': %s\n", - name, strerror (errno)); - _assuan_release_context (ctx); + TRACE2 (ctx, ASSUAN_LOG_SYSIO, "assuan_socket_connect_ext", ctx, + "can't connect to `%s': %s\n", name, strerror (errno)); + /* FIXME: Cleanup */ _assuan_close (fd); - return _assuan_error (GPG_ERR_ASS_CONNECT_FAILED); + return _assuan_error (ctx, GPG_ERR_ASS_CONNECT_FAILED); } - + + ctx->io = &io; + ctx->engine.release = _assuan_disconnect; + ctx->deinit_handler = ((flags&1))? _assuan_uds_deinit : do_deinit; + ctx->finish_handler = do_finish; ctx->inbound.fd = fd; ctx->outbound.fd = fd; - ctx->io = &io; - if ((flags&1)) + + if (flags & 1) _assuan_init_uds_io (ctx); - + /* initial handshake */ { int okay, off; err = _assuan_read_from_server (ctx, &okay, &off); if (err) - _assuan_log_printf ("can't connect to server: %s\n", - gpg_strerror (err)); + TRACE1 (ctx, ASSUAN_LOG_SYSIO, "assuan_socket_connect_ext", ctx, + "can't connect to server: %s\n", gpg_strerror (err)); else if (okay != 1) { - /*LOG ("can't connect to server: `");*/ - _assuan_log_sanitized_string (ctx->inbound.line); - fprintf (assuan_get_assuan_log_stream (), "'\n"); - err = _assuan_error (GPG_ERR_ASS_CONNECT_FAILED); + char *sname = _assuan_encode_c_string (ctx, ctx->inbound.line); + if (sname) + { + TRACE1 (ctx, ASSUAN_LOG_SYSIO, "assuan_socket_connect_ext", ctx, + "can't connect to server: %s", sname); + _assuan_free (ctx, sname); + } + err = _assuan_error (ctx, GPG_ERR_ASS_CONNECT_FAILED); } } - + if (err) - { - assuan_disconnect (ctx); - } - else - *r_ctx = ctx; - return 0; -} - + _assuan_reset (ctx); + return err; +} |