85fee25653
Use _MSC_VER (instead of _WIN32) for things that are specific for Visual Studio. Also remove #include <winsock2.h> from hiredis.h, as it leaks too many symbols and defines into the global namespace, which is undesirable for a public interface header. Anyone who uses the the affected parts of the hiredis API needs to include the appropriate headers anyway in order to declare struct timeval variables.
92 lines
4.2 KiB
C
92 lines
4.2 KiB
C
/*
|
|
* Copyright (c) 2019, Marcus Geelnard <m at bitsnbites dot eu>
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* * Neither the name of Redis nor the names of its contributors may be used
|
|
* to endorse or promote products derived from this software without
|
|
* specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef __SOCKCOMPAT_H
|
|
#define __SOCKCOMPAT_H
|
|
|
|
#ifndef _WIN32
|
|
/* For POSIX systems we use the standard BSD socket API. */
|
|
#include <unistd.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/select.h>
|
|
#include <sys/un.h>
|
|
#include <netinet/in.h>
|
|
#include <netinet/tcp.h>
|
|
#include <arpa/inet.h>
|
|
#include <netdb.h>
|
|
#include <poll.h>
|
|
#else
|
|
/* For Windows we use winsock. */
|
|
#undef _WIN32_WINNT
|
|
#define _WIN32_WINNT 0x0600 /* To get WSAPoll etc. */
|
|
#include <winsock2.h>
|
|
#include <ws2tcpip.h>
|
|
#include <stddef.h>
|
|
|
|
#ifdef _MSC_VER
|
|
typedef signed long ssize_t;
|
|
#endif
|
|
|
|
/* Emulate the parts of the BSD socket API that we need (override the winsock signatures). */
|
|
int win32_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
|
|
const char *win32_gai_strerror(int errcode);
|
|
void win32_freeaddrinfo(struct addrinfo *res);
|
|
SOCKET win32_socket(int domain, int type, int protocol);
|
|
int win32_ioctl(SOCKET fd, unsigned long request, unsigned long *argp);
|
|
int win32_bind(SOCKET sockfd, const struct sockaddr *addr, socklen_t addrlen);
|
|
int win32_connect(SOCKET sockfd, const struct sockaddr *addr, socklen_t addrlen);
|
|
int win32_getsockopt(SOCKET sockfd, int level, int optname, void *optval, socklen_t *optlen);
|
|
int win32_setsockopt(SOCKET sockfd, int level, int optname, const void *optval, socklen_t optlen);
|
|
int win32_close(SOCKET fd);
|
|
ssize_t win32_recv(SOCKET sockfd, void *buf, size_t len, int flags);
|
|
ssize_t win32_send(SOCKET sockfd, const void *buf, size_t len, int flags);
|
|
typedef ULONG nfds_t;
|
|
int win32_poll(struct pollfd *fds, nfds_t nfds, int timeout);
|
|
|
|
#ifndef REDIS_SOCKCOMPAT_IMPLEMENTATION
|
|
#define getaddrinfo(node, service, hints, res) win32_getaddrinfo(node, service, hints, res)
|
|
#undef gai_strerror
|
|
#define gai_strerror(errcode) win32_gai_strerror(errcode)
|
|
#define freeaddrinfo(res) win32_freeaddrinfo(res)
|
|
#define socket(domain, type, protocol) win32_socket(domain, type, protocol)
|
|
#define ioctl(fd, request, argp) win32_ioctl(fd, request, argp)
|
|
#define bind(sockfd, addr, addrlen) win32_bind(sockfd, addr, addrlen)
|
|
#define connect(sockfd, addr, addrlen) win32_connect(sockfd, addr, addrlen)
|
|
#define getsockopt(sockfd, level, optname, optval, optlen) win32_getsockopt(sockfd, level, optname, optval, optlen)
|
|
#define setsockopt(sockfd, level, optname, optval, optlen) win32_setsockopt(sockfd, level, optname, optval, optlen)
|
|
#define close(fd) win32_close(fd)
|
|
#define recv(sockfd, buf, len, flags) win32_recv(sockfd, buf, len, flags)
|
|
#define send(sockfd, buf, len, flags) win32_send(sockfd, buf, len, flags)
|
|
#define poll(fds, nfds, timeout) win32_poll(fds, nfds, timeout)
|
|
#endif /* REDIS_SOCKCOMPAT_IMPLEMENTATION */
|
|
#endif /* _WIN32 */
|
|
|
|
#endif /* __SOCKCOMPAT_H */
|