summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Brinkmann <marcus.brinkmann@ruhr-uni-bochum.de>2011-02-02 13:28:22 +0100
committerMarcus Brinkmann <marcus.brinkmann@ruhr-uni-bochum.de>2011-02-02 13:28:22 +0100
commit1875301d3a5a61e79097e0cd20e1ef8900e7515a (patch)
treee2017cf41662817fc9f4b8607010afd98ff2b614 /src
parent88d8aea1614fcf1f549d85c0a6a0082dcd6a9787 (diff)
downloadlibassuan-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/ChangeLog23
-rw-r--r--src/assuan-defs.h3
-rw-r--r--src/assuan-socket-connect.c4
-rw-r--r--src/assuan.h.in9
-rw-r--r--src/libassuan.def2
-rw-r--r--src/libassuan.vers6
-rw-r--r--src/system-posix.c19
-rw-r--r--src/system-w32.c19
-rw-r--r--src/system-w32ce.c19
-rw-r--r--src/system.c39
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);
+}
+