aboutsummaryrefslogtreecommitdiffstats
path: root/assuan/assuan-socket-connect.c
diff options
context:
space:
mode:
Diffstat (limited to 'assuan/assuan-socket-connect.c')
-rw-r--r--assuan/assuan-socket-connect.c53
1 files changed, 36 insertions, 17 deletions
diff --git a/assuan/assuan-socket-connect.c b/assuan/assuan-socket-connect.c
index 9937c7a6..5953f1c3 100644
--- a/assuan/assuan-socket-connect.c
+++ b/assuan/assuan-socket-connect.c
@@ -15,7 +15,8 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
*/
#include <config.h>
@@ -54,7 +55,7 @@
static int
-do_finish (ASSUAN_CONTEXT ctx)
+do_finish (assuan_context_t ctx)
{
if (ctx->inbound.fd != -1)
{
@@ -66,56 +67,70 @@ do_finish (ASSUAN_CONTEXT ctx)
}
static void
-do_deinit (ASSUAN_CONTEXT ctx)
+do_deinit (assuan_context_t ctx)
{
do_finish (ctx);
}
+
+
/* Make a connection to the Unix domain socket NAME and return a new
Assuan context in CTX. SERVER_PID is currently not used but may
become handy in the future. */
assuan_error_t
-assuan_socket_connect (ASSUAN_CONTEXT *r_ctx,
+assuan_socket_connect (assuan_context_t *r_ctx,
const char *name, pid_t server_pid)
{
+ return assuan_socket_connect_ext (r_ctx, name, server_pid, 0);
+}
+
+
+/* Make a connection to the Unix domain socket NAME and return a new
+ Assuan context in CTX. SERVER_PID is currently not used but may
+ become handy in the future. With flags set to 1 sendmsg and
+ recvmesg are used. */
+assuan_error_t
+assuan_socket_connect_ext (assuan_context_t *r_ctx,
+ const char *name, pid_t server_pid,
+ unsigned int flags)
+{
static struct assuan_io io = { _assuan_simple_read,
_assuan_simple_write };
assuan_error_t err;
- ASSUAN_CONTEXT ctx;
+ assuan_context_t ctx;
int fd;
struct sockaddr_un srvr_addr;
size_t len;
const char *s;
if (!r_ctx || !name)
- return ASSUAN_Invalid_Value;
+ return _assuan_error (ASSUAN_Invalid_Value);
*r_ctx = NULL;
- /* We require that the name starts with a slash, so that we can
- alter reuse this function for other socket types. To make things
- easier we allow an optional dirver prefix. */
+ /* We require that the name starts with a slash, so that we
+ eventually can reuse this function for other socket types. To
+ make things easier we allow an optional dirver prefix. */
s = name;
if (*s && s[1] == ':')
s += 2;
if (*s != DIRSEP_C && *s != '/')
- return ASSUAN_Invalid_Value;
+ return _assuan_error (ASSUAN_Invalid_Value);
if (strlen (name)+1 >= sizeof srvr_addr.sun_path)
- return ASSUAN_Invalid_Value;
+ return _assuan_error (ASSUAN_Invalid_Value);
err = _assuan_new_context (&ctx);
if (err)
return err;
- ctx->deinit_handler = do_deinit;
+ ctx->deinit_handler = ((flags&1))? _assuan_uds_deinit : do_deinit;
ctx->finish_handler = do_finish;
-
fd = _assuan_sock_new (PF_LOCAL, SOCK_STREAM, 0);
if (fd == -1)
{
_assuan_log_printf ("can't create socket: %s\n", strerror (errno));
_assuan_release_context (ctx);
- return ASSUAN_General_Error;
+ return _assuan_error (ASSUAN_General_Error);
}
memset (&srvr_addr, 0, sizeof srvr_addr);
@@ -131,13 +146,15 @@ assuan_socket_connect (ASSUAN_CONTEXT *r_ctx,
name, strerror (errno));
_assuan_release_context (ctx);
_assuan_close (fd);
- return ASSUAN_Connect_Failed;
+ return _assuan_error (ASSUAN_Connect_Failed);
}
ctx->inbound.fd = fd;
ctx->outbound.fd = fd;
ctx->io = &io;
-
+ if ((flags&1))
+ _assuan_init_uds_io (ctx);
+
/* initial handshake */
{
int okay, off;
@@ -151,7 +168,7 @@ assuan_socket_connect (ASSUAN_CONTEXT *r_ctx,
/*LOG ("can't connect to server: `");*/
_assuan_log_sanitized_string (ctx->inbound.line);
fprintf (assuan_get_assuan_log_stream (), "'\n");
- err = ASSUAN_Connect_Failed;
+ err = _assuan_error (ASSUAN_Connect_Failed);
}
}
@@ -163,3 +180,5 @@ assuan_socket_connect (ASSUAN_CONTEXT *r_ctx,
*r_ctx = ctx;
return 0;
}
+
+