summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Polyakov <appro@openssl.org>2009-12-30 12:56:16 +0000
committerAndy Polyakov <appro@openssl.org>2009-12-30 12:56:16 +0000
commit5448e6739cc628f1f920bd1f2515d8ee69004ea0 (patch)
treefffd81bf911a6611919fd4b227e5e45d454eeb54
parentf0389d8d37cfc1a25373915d1f2279c71285f64b (diff)
b_sock.c: correct indirect calls on WinSock platforms [from HEAD].
PR: 2130 Submitted by: Eugeny Gostyukhin
-rw-r--r--crypto/bio/b_sock.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/crypto/bio/b_sock.c b/crypto/bio/b_sock.c
index 886786cf64..8a69e99f82 100644
--- a/crypto/bio/b_sock.c
+++ b/crypto/bio/b_sock.c
@@ -88,6 +88,17 @@ NETDB_DEFINE_CONTEXT
static int wsa_init_done=0;
#endif
+/*
+ * WSAAPI specifier is required to make indirect calls to run-time
+ * linked WinSock 2 functions used in this module, to be specific
+ * [get|free]addrinfo and getnameinfo. This is because WinSock uses
+ * uses non-C calling convention, __stdcall vs. __cdecl, on x86
+ * Windows. On non-WinSock platforms WSAAPI needs to be void.
+ */
+#ifndef WSAAPI
+#define WSAAPI
+#endif
+
#if 0
static unsigned long BIO_ghbn_hits=0L;
static unsigned long BIO_ghbn_miss=0L;
@@ -627,12 +638,12 @@ int BIO_get_accept_socket(char *host, int bind_mode)
#ifdef EAI_FAMILY
do {
static union { void *p;
- int (*f)(const char *,const char *,
+ int (WSAAPI *f)(const char *,const char *,
const struct addrinfo *,
struct addrinfo **);
} p_getaddrinfo = {NULL};
static union { void *p;
- void (*f)(struct addrinfo *);
+ void (WSAAPI *f)(struct addrinfo *);
} p_freeaddrinfo = {NULL};
struct addrinfo *res,hint;
@@ -840,7 +851,7 @@ int BIO_accept(int sock, char **addr)
char h[NI_MAXHOST],s[NI_MAXSERV];
size_t nl;
static union { void *p;
- int (*f)(const struct sockaddr *,size_t/*socklen_t*/,
+ int (WSAAPI *f)(const struct sockaddr *,size_t/*socklen_t*/,
char *,size_t,char *,size_t,int);
} p_getnameinfo = {NULL};
/* 2nd argument to getnameinfo is specified to