From 4b059cf6fc3688844a0699f2ee5eb5b4d9dbb505 Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Thu, 11 Dec 2008 21:08:19 -0500 Subject: [PATCH] Added assuan_socket_connect_fd() and assuan_set_finish_handler(). --- assuan/assuan-connect.c | 2 ++ assuan/assuan-defs.h | 1 + assuan/assuan-socket-connect.c | 51 ++++++++++++++++++++++++++++++++++++++++++ assuan/assuan-util.c | 7 ++++++ assuan/assuan.h | 6 +++++ 5 files changed, 67 insertions(+) diff --git a/assuan/assuan-connect.c b/assuan/assuan-connect.c index 1477a241..026888c9 100644 --- a/assuan/assuan-connect.c +++ b/assuan/assuan-connect.c @@ -41,6 +41,8 @@ assuan_disconnect (assuan_context_t ctx) if (ctx) { assuan_write_line (ctx, "BYE"); + if (ctx->user_finish_handler) + ctx->user_finish_handler(ctx); ctx->finish_handler (ctx); ctx->deinit_handler (ctx); ctx->deinit_handler = NULL; diff --git a/assuan/assuan-defs.h b/assuan/assuan-defs.h index e2d0f52b..166814ad 100644 --- a/assuan/assuan-defs.h +++ b/assuan/assuan-defs.h @@ -108,6 +108,7 @@ struct assuan_context_s char *okay_line; /* See assuan_set_okay_line() */ void *user_pointer; /* For assuan_get_pointer and assuan_set_pointer (). */ + void (*user_finish_handler)(assuan_context_t); /* For assuan_set_finish_handler(). */ FILE *log_fp; diff --git a/assuan/assuan-socket-connect.c b/assuan/assuan-socket-connect.c index 8eb6d828..8e00f4f0 100644 --- a/assuan/assuan-socket-connect.c +++ b/assuan/assuan-socket-connect.c @@ -178,3 +178,54 @@ assuan_socket_connect_ext (assuan_context_t *r_ctx, } +assuan_error_t assuan_socket_connect_fd (assuan_context_t *r_ctx, + assuan_fd_t fd, + unsigned int flags, + void *ptr) +{ + static struct assuan_io io = { _assuan_simple_read, + _assuan_simple_write }; + + assuan_error_t err; + assuan_context_t ctx; + + if (!r_ctx || fd < 0) + return _assuan_error (ASSUAN_Invalid_Value); + *r_ctx = NULL; + err = _assuan_new_context (&ctx); + if (err) + return err; + ctx->deinit_handler = ((flags&1))? _assuan_uds_deinit : do_deinit; + ctx->finish_handler = do_finish; + ctx->inbound.fd = fd; + ctx->outbound.fd = fd; + ctx->io = &io; + if ((flags&1)) + _assuan_init_uds_io (ctx); + ctx->user_pointer = ptr; + + /* initial handshake */ + { + int okay, off; + + err = _assuan_read_from_server (ctx, &okay, &off); + if (err) + _assuan_log_printf ("can't connect to server: %s\n", + assuan_strerror (err)); + else if (okay != 1) + { + /*LOG ("can't connect to server: `");*/ + _assuan_log_sanitized_string (ctx->inbound.line); + fprintf (assuan_get_assuan_log_stream (), "'\n"); + err = _assuan_error (ASSUAN_Connect_Failed); + } + } + + if (err) + { + assuan_disconnect (ctx); + } + else + *r_ctx = ctx; + return err; +} diff --git a/assuan/assuan-util.c b/assuan/assuan-util.c index cefefcb2..07800f2c 100644 --- a/assuan/assuan-util.c +++ b/assuan/assuan-util.c @@ -108,6 +108,13 @@ assuan_set_error (assuan_context_t ctx, int err, const char *text) return err; } +void assuan_set_finish_handler(assuan_context_t ctx, + void (*handler)(assuan_context_t)) +{ + if (ctx) + ctx->user_finish_handler = handler; +} + void assuan_set_pointer (assuan_context_t ctx, void *pointer) { diff --git a/assuan/assuan.h b/assuan/assuan.h index f2d2feb5..b3085e28 100644 --- a/assuan/assuan.h +++ b/assuan/assuan.h @@ -109,6 +109,7 @@ #define assuan_pipe_connect_ext _ASSUAN_PREFIX(assuan_pipe_connect_ext) #define assuan_socket_connect _ASSUAN_PREFIX(assuan_socket_connect) #define assuan_socket_connect_ext _ASSUAN_PREFIX(assuan_socket_connect_ext) +#define assuan_socket_connect_fd _ASSUAN_PREFIX(assuan_socket_connect_fd) #define assuan_disconnect _ASSUAN_PREFIX(assuan_disconnect) #define assuan_get_pid _ASSUAN_PREFIX(assuan_get_pid) #define assuan_get_peercred _ASSUAN_PREFIX(assuan_get_peercred) @@ -127,6 +128,7 @@ #define assuan_set_error _ASSUAN_PREFIX(assuan_set_error) #define assuan_set_pointer _ASSUAN_PREFIX(assuan_set_pointer) #define assuan_get_pointer _ASSUAN_PREFIX(assuan_get_pointer) +#define assuan_set_finish_handler _ASSUAN_PREFIX(assuan_set_finish_handler) #define assuan_set_io_monitor _ASSUAN_PREFIX(assuan_set_io_monitor) #define assuan_begin_confidential _ASSUAN_PREFIX(assuan_begin_confidential) #define assuan_end_confidential _ASSUAN_PREFIX(assuan_end_confidential) @@ -526,6 +528,9 @@ assuan_error_t assuan_socket_connect_ext (assuan_context_t *ctx, const char *name, pid_t server_pid, unsigned int flags); +assuan_error_t assuan_socket_connect_fd (assuan_context_t *ctx, + assuan_fd_t fd, + unsigned int flags, void *data); /*-- assuan-connect.c --*/ void assuan_disconnect (assuan_context_t ctx); @@ -581,6 +586,7 @@ void assuan_set_log_stream (assuan_context_t ctx, FILE *fp); int assuan_set_error (assuan_context_t ctx, int err, const char *text); void assuan_set_pointer (assuan_context_t ctx, void *pointer); void *assuan_get_pointer (assuan_context_t ctx); +void assuan_set_finish_handler(assuan_context_t ctx, void (*handler)(assuan_context_t)); void assuan_begin_confidential (assuan_context_t ctx); void assuan_end_confidential (assuan_context_t ctx); -- 2.11.4.GIT