diff options
Diffstat (limited to 'ares')
-rw-r--r-- | ares/setup_once.h | 107 |
1 files changed, 106 insertions, 1 deletions
diff --git a/ares/setup_once.h b/ares/setup_once.h index 4f7ed59bb..c15fbfa15 100644 --- a/ares/setup_once.h +++ b/ares/setup_once.h @@ -91,6 +91,13 @@ struct timeval { #endif +#if defined(__minix) +/* Minix doesn't support recv on TCP sockets */ +#define sread(x,y,z) (ssize_t)read((RECV_TYPE_ARG1)(x), \ + (RECV_TYPE_ARG2)(y), \ + (RECV_TYPE_ARG3)(z)) + +#elif defined(HAVE_RECV) /* * The definitions for the return type and arguments types * of functions recv() and send() belong and come from the @@ -136,7 +143,14 @@ struct timeval { #endif #endif /* HAVE_RECV */ -#ifdef HAVE_SEND + +#if defined(__minix) +/* Minix doesn't support send on TCP sockets */ +#define swrite(x,y,z) (ssize_t)write((SEND_TYPE_ARG1)(x), \ + (SEND_TYPE_ARG2)(y), \ + (SEND_TYPE_ARG3)(z)) + +#elif defined(HAVE_SEND) #if !defined(SEND_TYPE_ARG1) || \ !defined(SEND_QUAL_ARG2) || \ !defined(SEND_TYPE_ARG2) || \ @@ -358,5 +372,96 @@ typedef int sig_atomic_t; #endif +/* + * We use this ZERO_NULL to avoid picky compiler warnings, + * when assigning a NULL pointer to a function pointer var. + */ + +#define ZERO_NULL 0 + + +#if defined (__LP64__) && defined(__hpux) && !defined(_XOPEN_SOURCE_EXTENDED) +#include <sys/socket.h> +/* HP-UX has this oddity where it features a few functions that don't work + with socklen_t so we need to convert to ints + + This is due to socklen_t being a 64bit int under 64bit ABI, but the + pre-xopen (default) interfaces require an int, which is 32bits. + + Therefore, Anytime socklen_t is passed by pointer, the libc function + truncates the 64bit socklen_t value by treating it as a 32bit value. + + + Note that some socket calls are allowed to have a NULL pointer for + the socklen arg. +*/ + +inline static int Curl_hp_getsockname(int s, struct sockaddr *name, + socklen_t *namelen) +{ + int rc; + if(namelen) { + int len = *namelen; + rc = getsockname(s, name, &len); + *namelen = len; + } + else + rc = getsockname(s, name, 0); + return rc; +} + +inline static int Curl_hp_getsockopt(int s, int level, int optname, + void *optval, socklen_t *optlen) +{ + int rc; + if(optlen) { + int len = *optlen; + rc = getsockopt(s, level, optname, optval, &len); + *optlen = len; + } + else + rc = getsockopt(s, level, optname, optval, 0); + return rc; +} + +inline static int Curl_hp_accept(int sockfd, struct sockaddr *addr, + socklen_t *addrlen) +{ + int rc; + if(addrlen) { + int len = *addrlen; + rc = accept(sockfd, addr, &len); + *addrlen = len; + } + else + rc = accept(sockfd, addr, 0); + return rc; +} + + +inline static ssize_t Curl_hp_recvfrom(int s, void *buf, size_t len, int flags, + struct sockaddr *from, + socklen_t *fromlen) +{ + ssize_t rc; + if(fromlen) { + int fromlen32 = *fromlen; + rc = recvfrom(s, buf, len, flags, from, &fromlen32); + *fromlen = fromlen32; + } + else { + rc = recvfrom(s, buf, len, flags, from, 0); + } + return rc; +} + +#define getsockname(a,b,c) Curl_hp_getsockname((a),(b),(c)) +#define getsockopt(a,b,c,d,e) Curl_hp_getsockopt((a),(b),(c),(d),(e)) +#define accept(a,b,c) Curl_hp_accept((a),(b),(c)) +#define recvfrom(a,b,c,d,e,f) Curl_hp_recvfrom((a),(b),(c),(d),(e),(f)) + +#endif /* HPUX work-around */ + + #endif /* __SETUP_ONCE_H */ |