diff options
author | [email protected] <[email protected]> | 2011-03-06 21:18:45 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2011-03-09 19:24:42 +0000 |
commit | 5666ade7de25239a36afe0f279b46a0deff1a867 (patch) | |
tree | e0f765e7f7d6835f519cda3944f4e826101a95c1 | |
parent | Let an existing command previously registered with assuan_register_command() ... (diff) | |
download | libassuan-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/ChangeLog | 6 | ||||
-rw-r--r-- | src/assuan-socket-connect.c | 98 | ||||
-rw-r--r-- | src/assuan.h.in | 4 | ||||
-rw-r--r-- | src/libassuan.def | 1 | ||||
-rw-r--r-- | 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 <[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; |