aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author[email protected] <[email protected]>2011-03-06 21:18:45 +0000
committerWerner Koch <[email protected]>2011-03-09 19:24:42 +0000
commit5666ade7de25239a36afe0f279b46a0deff1a867 (patch)
treee0f765e7f7d6835f519cda3944f4e826101a95c1
parentLet an existing command previously registered with assuan_register_command() ... (diff)
downloadlibassuan-5666ade7de25239a36afe0f279b46a0deff1a867.tar.gz
libassuan-5666ade7de25239a36afe0f279b46a0deff1a867.zip
Added assuan_socket_connect_fd() to attach an existing socket file descriptor to a context.
-rw-r--r--src/ChangeLog6
-rw-r--r--src/assuan-socket-connect.c98
-rw-r--r--src/assuan.h.in4
-rw-r--r--src/libassuan.def1
-rw-r--r--src/libassuan.vers1
5 files changed, 76 insertions, 34 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 5568549..0ba2a2c 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+2011-03-06 Ben Kibbey <[email protected]>
+
+ * assuan-socket-connect.c (assuan_socket_connect_fd): Finalize a
+ context connection from an already connected socket descriptor.
+ * assuan.h.in (assuan_socket_connect_fd): New prototype.
+
2011-03-05 Ben Kibbey <[email protected]>
* assuan-handler.c (assuan_register_command): Let an existing command
diff --git a/src/assuan-socket-connect.c b/src/assuan-socket-connect.c
index fa3db4b..cb8f9d0 100644
--- a/src/assuan-socket-connect.c
+++ b/src/assuan-socket-connect.c
@@ -97,6 +97,69 @@ parse_portno (const char *str, uint16_t *r_port)
}
+static gpg_error_t
+_assuan_connect_finalize(assuan_context_t ctx, int fd, unsigned int flags)
+{
+ gpg_error_t err;
+
+ ctx->engine.release = _assuan_client_release;
+ ctx->engine.readfnc = _assuan_simple_read;
+ ctx->engine.writefnc = _assuan_simple_write;
+ ctx->engine.sendfd = NULL;
+ ctx->engine.receivefd = NULL;
+ ctx->finish_handler = _assuan_client_finish;
+ ctx->inbound.fd = fd;
+ ctx->outbound.fd = fd;
+ ctx->max_accepts = -1;
+
+ if (flags & ASSUAN_SOCKET_CONNECT_FDPASSING)
+ _assuan_init_uds_io (ctx);
+
+ /* initial handshake */
+ {
+ assuan_response_t response;
+ int off;
+
+ err = _assuan_read_from_server (ctx, &response, &off, 0);
+ if (err)
+ TRACE1 (ctx, ASSUAN_LOG_SYSIO, "assuan_socket_connect", ctx,
+ "can't connect to server: %s\n", gpg_strerror (err));
+ else if (response != ASSUAN_RESPONSE_OK)
+ {
+ char *sname = _assuan_encode_c_string (ctx, ctx->inbound.line);
+ if (sname)
+ {
+ TRACE1 (ctx, ASSUAN_LOG_SYSIO, "assuan_socket_connect", ctx,
+ "can't connect to server: %s", sname);
+ _assuan_free (ctx, sname);
+ }
+ err = _assuan_error (ctx, GPG_ERR_ASS_CONNECT_FAILED);
+ }
+ }
+
+ return err;
+}
+
+
+/* Attach an existing connected file descriptor FD to an allocated handle CTX
+ * and initialize the connection.
+ */
+gpg_error_t
+assuan_socket_connect_fd (assuan_context_t ctx, int fd, unsigned int flags)
+{
+ gpg_error_t err;
+
+ if (!ctx || fd < 0)
+ return GPG_ERR_INV_ARG;
+
+ err = _assuan_connect_finalize(ctx, fd, flags);
+
+ if (err)
+ _assuan_reset (ctx);
+
+ return err;
+}
+
/* 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
@@ -268,41 +331,8 @@ assuan_socket_connect (assuan_context_t ctx, const char *name,
return _assuan_error (ctx, GPG_ERR_ASS_CONNECT_FAILED);
}
- ctx->engine.release = _assuan_client_release;
- ctx->engine.readfnc = _assuan_simple_read;
- ctx->engine.writefnc = _assuan_simple_write;
- ctx->engine.sendfd = NULL;
- ctx->engine.receivefd = NULL;
- ctx->finish_handler = _assuan_client_finish;
- ctx->inbound.fd = fd;
- ctx->outbound.fd = fd;
- ctx->max_accepts = -1;
+ err = _assuan_connect_finalize(ctx, fd, flags);
- if (flags & ASSUAN_SOCKET_CONNECT_FDPASSING)
- _assuan_init_uds_io (ctx);
-
- /* initial handshake */
- {
- assuan_response_t response;
- int off;
-
- err = _assuan_read_from_server (ctx, &response, &off, 0);
- if (err)
- TRACE1 (ctx, ASSUAN_LOG_SYSIO, "assuan_socket_connect", ctx,
- "can't connect to server: %s\n", gpg_strerror (err));
- else if (response != ASSUAN_RESPONSE_OK)
- {
- char *sname = _assuan_encode_c_string (ctx, ctx->inbound.line);
- if (sname)
- {
- TRACE1 (ctx, ASSUAN_LOG_SYSIO, "assuan_socket_connect", ctx,
- "can't connect to server: %s", sname);
- _assuan_free (ctx, sname);
- }
- err = _assuan_error (ctx, GPG_ERR_ASS_CONNECT_FAILED);
- }
- }
-
if (err)
_assuan_reset (ctx);
diff --git a/src/assuan.h.in b/src/assuan.h.in
index 426fc4c..9ff263f 100644
--- a/src/assuan.h.in
+++ b/src/assuan.h.in
@@ -358,6 +358,10 @@ gpg_error_t assuan_pipe_connect (assuan_context_t ctx,
gpg_error_t assuan_socket_connect (assuan_context_t ctx, const char *name,
pid_t server_pid, unsigned int flags);
+/*-- assuan-socket-connect.c --*/
+gpg_error_t assuan_socket_connect_fd (assuan_context_t ctx, int fd,
+ unsigned int flags);
+
/*-- context.c --*/
pid_t assuan_get_pid (assuan_context_t ctx);
struct _assuan_peercred
diff --git a/src/libassuan.def b/src/libassuan.def
index 575966d..9287486 100644
--- a/src/libassuan.def
+++ b/src/libassuan.def
@@ -104,6 +104,7 @@ EXPORTS
__assuan_socket @83
__assuan_connect @84
assuan_register_pre_cmd_notify @85
+ assuan_socket_connect_fd @86
; END
diff --git a/src/libassuan.vers b/src/libassuan.vers
index 6311ff1..8126fab 100644
--- a/src/libassuan.vers
+++ b/src/libassuan.vers
@@ -99,6 +99,7 @@ LIBASSUAN_1.0 {
assuan_write_line;
assuan_write_status;
assuan_free;
+ assuan_socket_connect_fd;
__assuan_close;
__assuan_pipe;