diff options
author | Marcus Brinkmann <marcus.brinkmann@ruhr-uni-bochum.de> | 2011-02-02 13:28:22 +0100 |
---|---|---|
committer | Marcus Brinkmann <marcus.brinkmann@ruhr-uni-bochum.de> | 2011-02-02 13:28:22 +0100 |
commit | 1875301d3a5a61e79097e0cd20e1ef8900e7515a (patch) | |
tree | e2017cf41662817fc9f4b8607010afd98ff2b614 /src | |
parent | 88d8aea1614fcf1f549d85c0a6a0082dcd6a9787 (diff) | |
download | libassuan-1875301d3a5a61e79097e0cd20e1ef8900e7515a.tar.gz |
Extend system hooks table by socket and connect functions.
2011-02-02 Marcus Brinkmann <marcus.brinkmann@ruhr-uni-bochum.de>
* assuan-defs.h (_assuan_socket, _assuan_connect): New prototypes.
* assuan.h.in (ASSUAN_SYSTEM_HOOKS_VERSION): Bumped to 2.
(struct assuan_system_hooks): Add socket and connect members.
(__assuan_socket, __assuan_connect): New prototypes.
(_ASSUAN_SYSTEM_PTH_IMPL): Add socket and connect members. *
assuan-socket-connect.c (assuan_socket_connect): Call
_assuan_socket and _assuan_connect instead _assuan_sock_new and
_assuan_sock_connect.
(libassuan.def, libassuan.vers): Add __assuan_socket and
__assuan_connect.
* system.c (_assuan_system_hooks_copy): Initialize destination
from system hooks, so we don't get any NULL pointers if there is a
version mismatch. Support version 2 of the system hook structure.
(_assuan_socket, _assuan_connect): New functions.
* system-posix.c (__assuan_socket, __assuan_connect): New functions.
(_assuan_system_hooks): Add __assuan_socketm, __assuan_connect.
* system-w32.c (__assuan_socket, __assuan_connect): New functions.
(_assuan_system_hooks): Add __assuan_socketm, __assuan_connect.
* system-w32ce.c (__assuan_socket, __assuan_connect): New functions.
(_assuan_system_hooks): Add __assuan_socketm, __assuan_connect.
Diffstat (limited to 'src')
-rw-r--r-- | src/ChangeLog | 23 | ||||
-rw-r--r-- | src/assuan-defs.h | 3 | ||||
-rw-r--r-- | src/assuan-socket-connect.c | 4 | ||||
-rw-r--r-- | src/assuan.h.in | 9 | ||||
-rw-r--r-- | src/libassuan.def | 2 | ||||
-rw-r--r-- | src/libassuan.vers | 6 | ||||
-rw-r--r-- | src/system-posix.c | 19 | ||||
-rw-r--r-- | src/system-w32.c | 19 | ||||
-rw-r--r-- | src/system-w32ce.c | 19 | ||||
-rw-r--r-- | src/system.c | 39 |
10 files changed, 133 insertions, 10 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 2199e24..7f0d32f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,26 @@ +2011-02-02 Marcus Brinkmann <marcus.brinkmann@ruhr-uni-bochum.de> + + * assuan-defs.h (_assuan_socket, _assuan_connect): New prototypes. + * assuan.h.in (ASSUAN_SYSTEM_HOOKS_VERSION): Bumped to 2. + (struct assuan_system_hooks): Add socket and connect members. + (__assuan_socket, __assuan_connect): New prototypes. + (_ASSUAN_SYSTEM_PTH_IMPL): Add socket and connect members. * + assuan-socket-connect.c (assuan_socket_connect): Call + _assuan_socket and _assuan_connect instead _assuan_sock_new and + _assuan_sock_connect. + (libassuan.def, libassuan.vers): Add __assuan_socket and + __assuan_connect. + * system.c (_assuan_system_hooks_copy): Initialize destination + from system hooks, so we don't get any NULL pointers if there is a + version mismatch. Support version 2 of the system hook structure. + (_assuan_socket, _assuan_connect): New functions. + * system-posix.c (__assuan_socket, __assuan_connect): New functions. + (_assuan_system_hooks): Add __assuan_socketm, __assuan_connect. + * system-w32.c (__assuan_socket, __assuan_connect): New functions. + (_assuan_system_hooks): Add __assuan_socketm, __assuan_connect. + * system-w32ce.c (__assuan_socket, __assuan_connect): New functions. + (_assuan_system_hooks): Add __assuan_socketm, __assuan_connect. + 2010-12-20 Werner Koch <wk@g10code.com> * gpgcedev.c (pipeimpl_new): Check malloc and CreateEvent return diff --git a/src/assuan-defs.h b/src/assuan-defs.h index 4a25568..88863eb 100644 --- a/src/assuan-defs.h +++ b/src/assuan-defs.h @@ -259,6 +259,9 @@ pid_t _assuan_waitpid (assuan_context_t ctx, pid_t pid, int nowait, int *status, int options); int _assuan_socketpair (assuan_context_t ctx, int namespace, int style, int protocol, assuan_fd_t filedes[2]); +int _assuan_socket (assuan_context_t ctx, int namespace, int style, int protocol); +int _assuan_connect (assuan_context_t ctx, int sock, struct sockaddr *addr, + socklen_t length); extern struct assuan_system_hooks _assuan_system_hooks; diff --git a/src/assuan-socket-connect.c b/src/assuan-socket-connect.c index fa3db4b..609813d 100644 --- a/src/assuan-socket-connect.c +++ b/src/assuan-socket-connect.c @@ -251,7 +251,7 @@ assuan_socket_connect (assuan_context_t ctx, const char *name, return err; } - fd = _assuan_sock_new (ctx, pf, SOCK_STREAM, 0); + fd = _assuan_socket (ctx, pf, SOCK_STREAM, 0); if (fd == ASSUAN_INVALID_FD) { err = _assuan_error (ctx, gpg_err_code_from_syserror ()); @@ -260,7 +260,7 @@ assuan_socket_connect (assuan_context_t ctx, const char *name, return err; } - if (_assuan_sock_connect (ctx, fd, srvr_addr, len) == -1) + if (_assuan_connect (ctx, fd, srvr_addr, len) == -1) { TRACE2 (ctx, ASSUAN_LOG_SYSIO, "assuan_socket_connect", ctx, "can't connect to `%s': %s\n", name, strerror (errno)); diff --git a/src/assuan.h.in b/src/assuan.h.in index ea91973..baf5594 100644 --- a/src/assuan.h.in +++ b/src/assuan.h.in @@ -202,7 +202,7 @@ void assuan_set_io_monitor (assuan_context_t ctx, assuan_io_monitor_t io_monitor, void *hook_data); -#define ASSUAN_SYSTEM_HOOKS_VERSION 1 +#define ASSUAN_SYSTEM_HOOKS_VERSION 2 #define ASSUAN_SPAWN_DETACHED 128 struct assuan_system_hooks { @@ -245,6 +245,8 @@ struct assuan_system_hooks int action, int *status, int options); int (*socketpair) (assuan_context_t ctx, int _namespace, int style, int protocol, assuan_fd_t filedes[2]); + int (*socket) (assuan_context_t ctx, int namespace, int style, int protocol); + int (*connect) (assuan_context_t ctx, int sock, struct sockaddr *addr, socklen_t length); }; typedef struct assuan_system_hooks *assuan_system_hooks_t; @@ -470,6 +472,8 @@ int __assuan_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name, void *atforkvalue, unsigned int flags); int __assuan_socketpair (assuan_context_t ctx, int _namespace, int style, int protocol, assuan_fd_t filedes[2]); +int __assuan_socket (assuan_context_t ctx, int namespace, int style, int protocol); +int __assuan_connect (assuan_context_t ctx, int sock, struct sockaddr *addr, socklen_t length); #define ASSUAN_SYSTEM_PTH_IMPL \ @@ -492,7 +496,8 @@ int __assuan_socketpair (assuan_context_t ctx, int _namespace, int style, { ASSUAN_SYSTEM_HOOKS_VERSION, _assuan_pth_usleep, __assuan_pipe, \ __assuan_close, _assuan_pth_read, _assuan_pth_write, \ _assuan_pth_recvmsg, _assuan_pth_sendmsg, \ - __assuan_spawn, _assuan_pth_waitpid, __assuan_socketpair } + __assuan_spawn, _assuan_pth_waitpid, __assuan_socketpair, \ + __assuan_socket, __assuan_connect } extern struct assuan_system_hooks _assuan_system_pth; #define ASSUAN_SYSTEM_PTH &_assuan_system_pth diff --git a/src/libassuan.def b/src/libassuan.def index 59aba41..a2e7b61 100644 --- a/src/libassuan.def +++ b/src/libassuan.def @@ -101,6 +101,8 @@ EXPORTS assuan_free @80 _assuan_w32ce_prepare_pipe @81 _assuan_w32ce_finish_pipe @82 + __assuan_socket @83 + __assuan_connect @84 ; END diff --git a/src/libassuan.vers b/src/libassuan.vers index b91d8e4..b14a940 100644 --- a/src/libassuan.vers +++ b/src/libassuan.vers @@ -20,6 +20,12 @@ # Please remember to add new functions also to libassuan.def #----------------------------------------------------------- +LIBASSUAN_1.1 { + global: + __assuan_socket; + __assuan_connect; +}; + LIBASSUAN_1.0 { global: assuan_accept; diff --git a/src/system-posix.c b/src/system-posix.c index e36767a..68294c0 100644 --- a/src/system-posix.c +++ b/src/system-posix.c @@ -321,6 +321,21 @@ __assuan_socketpair (assuan_context_t ctx, int namespace, int style, } +int +__assuan_socket (assuan_context_t ctx, int namespace, int style, int protocol) +{ + return socket (namespace, style, protocol); +} + + +int +__assuan_connect (assuan_context_t ctx, int sock, struct sockaddr *addr, + socklen_t length) +{ + return connect (sock, addr, length); +} + + /* The default system hooks for assuan contexts. */ struct assuan_system_hooks _assuan_system_hooks = @@ -335,5 +350,7 @@ struct assuan_system_hooks _assuan_system_hooks = __assuan_sendmsg, __assuan_spawn, __assuan_waitpid, - __assuan_socketpair + __assuan_socketpair, + __assuan_socket, + __assuan_connect }; diff --git a/src/system-w32.c b/src/system-w32.c index 5c11114..539d34e 100644 --- a/src/system-w32.c +++ b/src/system-w32.c @@ -514,6 +514,21 @@ __assuan_socketpair (assuan_context_t ctx, int namespace, int style, return -1; } + +int +__assuan_socket (assuan_context_t ctx, int namespace, int style, int protocol) +{ + return _assuan_sock_new (ctx, namespace, style, protocol); +} + + +int +__assuan_connect (assuan_context_t ctx, int sock, struct sockaddr *addr, + socklen_t length) +{ + return _assuan_sock_connect (ctx, sock, addr, length); +} + /* The default system hooks for assuan contexts. */ struct assuan_system_hooks _assuan_system_hooks = @@ -528,5 +543,7 @@ struct assuan_system_hooks _assuan_system_hooks = __assuan_sendmsg, __assuan_spawn, __assuan_waitpid, - __assuan_socketpair + __assuan_socketpair, + __assuan_socket, + __assuan_connect }; diff --git a/src/system-w32ce.c b/src/system-w32ce.c index 6b5c3c9..da660ea 100644 --- a/src/system-w32ce.c +++ b/src/system-w32ce.c @@ -660,6 +660,21 @@ __assuan_socketpair (assuan_context_t ctx, int namespace, int style, } +int +__assuan_socket (assuan_context_t ctx, int namespace, int style, int protocol) +{ + return _assuan_sock_new (ctx, namespace, style, protocol); +} + + +int +__assuan_connect (assuan_context_t ctx, int sock, struct sockaddr *addr, + socklen_t length) +{ + return _assuan_sock_connect (ctx, sock, addr, length); +} + + /* The default system hooks for assuan contexts. */ struct assuan_system_hooks _assuan_system_hooks = @@ -674,5 +689,7 @@ struct assuan_system_hooks _assuan_system_hooks = __assuan_sendmsg, __assuan_spawn, __assuan_waitpid, - __assuan_socketpair + __assuan_socketpair, + __assuan_socket, + __assuan_connect }; diff --git a/src/system.c b/src/system.c index 373fc5b..1fca056 100644 --- a/src/system.c +++ b/src/system.c @@ -108,8 +108,10 @@ _assuan_system_hooks_copy (assuan_system_hooks_t dst, assuan_system_hooks_t src) { - memset (dst, '\0', sizeof (*dst)); - + /* Reset the defaults. */ + if (dst != &_assuan_system_hooks) + memcpy (dst, &_assuan_system_hooks, sizeof (*dst)); + dst->version = ASSUAN_SYSTEM_HOOKS_VERSION; if (src->version >= 1) { @@ -124,7 +126,12 @@ _assuan_system_hooks_copy (assuan_system_hooks_t dst, dst->waitpid = src->waitpid; dst->socketpair = src->socketpair; } - if (src->version > 1) + if (src->version >= 2) + { + dst->socket = src->socket; + dst->connect = src->connect; + } + if (src->version > 2) /* FIXME. Application uses newer version of the library. What to do? */ ; @@ -385,3 +392,29 @@ _assuan_socketpair (assuan_context_t ctx, int namespace, int style, return TRACE_SYSERR (res); } + + +int +_assuan_socket (assuan_context_t ctx, int namespace, int style, int protocol) +{ + int res; + TRACE_BEG3 (ctx, ASSUAN_LOG_SYSIO, "_assuan_socket", ctx, + "namespace=%i,style=%i,protocol=%i", + namespace, style, protocol); + + res = (ctx->system.socket) (ctx, namespace, style, protocol); + return TRACE_SYSRES (res); +} + + +int +_assuan_connect (assuan_context_t ctx, int sock, struct sockaddr *addr, socklen_t length) +{ + int res; + TRACE_BEG3 (ctx, ASSUAN_LOG_SYSIO, "_assuan_connect", ctx, + "socket=%i,addr=%p,length=%i", sock, addr, length); + + res = (ctx->system.connect) (ctx, sock, addr, length); + return TRACE_SYSRES (res); +} + |