[Pkg-gnupg-commit] [libassuan] 355/437: Added assuan_socket_connect_fd() to attach an existing socket file descriptor to a context.

Eric Dorland eric at moszumanska.debian.org
Fri May 22 05:34:03 UTC 2015


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository libassuan.

commit 5666ade7de25239a36afe0f279b46a0deff1a867
Author: bjk at luxsci.net <bjk at luxsci.net>
Date:   Sun Mar 6 16:18:45 2011 -0500

    Added assuan_socket_connect_fd() to attach an existing socket file descriptor to a context.
---
 src/ChangeLog               |  6 +++
 src/assuan-socket-connect.c | 98 +++++++++++++++++++++++++++++----------------
 src/assuan.h.in             |  4 ++
 src/libassuan.def           |  1 +
 src/libassuan.vers          |  1 +
 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 <bjk at luxsci.net>
+
+	* 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 <bjk at luxsci.net>
 
 	* 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;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/libassuan.git



More information about the Pkg-gnupg-commit mailing list