diff options
author | Marcus Brinkmann <[email protected]> | 2006-09-19 14:01:54 +0000 |
---|---|---|
committer | Marcus Brinkmann <[email protected]> | 2006-09-19 14:01:54 +0000 |
commit | 9e09d93de83fe1160689acb36b082c02ccb52716 (patch) | |
tree | 807126be9dd89fe2850ad748de978de0c5d3b340 /assuan/assuan-socket-connect.c | |
parent | 2006-07-29 Marcus Brinkmann <[email protected]> (diff) | |
download | gpgme-9e09d93de83fe1160689acb36b082c02ccb52716.tar.gz gpgme-9e09d93de83fe1160689acb36b082c02ccb52716.zip |
assuan/
Update to current version.
2006-09-19 Marcus Brinkmann <[email protected]>
* configure.ac: Turn stpcpy into a replacement function.
Check for unistd.h and add setenv as replacement function.
gpgme/
2006-09-19 Marcus Brinkmann <[email protected]>
* setenv.c: New file.
Diffstat (limited to 'assuan/assuan-socket-connect.c')
-rw-r--r-- | assuan/assuan-socket-connect.c | 53 |
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; } + + |