From 555fb0b9e9a6228e7cc3f743679d98237e22a6ea Mon Sep 17 00:00:00 2001 From: Hannes Date: Tue, 23 Jun 2015 15:08:39 +0200 Subject: [PATCH] fix headers to be used with Visual Studio 2015 RC --- include/catta/timeval.h | 2 + include/catta/watch.h | 2 + src/compat/windows/wincompat.h | 116 +++++++++++++++++++++++++++++++-- 3 files changed, 115 insertions(+), 5 deletions(-) diff --git a/include/catta/timeval.h b/include/catta/timeval.h index 0323f92..d78d229 100644 --- a/include/catta/timeval.h +++ b/include/catta/timeval.h @@ -23,7 +23,9 @@ /** \file timeval.h Functions to facilitate timeval handling */ #include +#ifndef _MSC_VER #include +#endif #include diff --git a/include/catta/watch.h b/include/catta/watch.h index ef50797..7824724 100644 --- a/include/catta/watch.h +++ b/include/catta/watch.h @@ -23,7 +23,9 @@ /** \file watch.h Simplistic main loop abstraction */ #include +#ifndef _MSC_VER #include +#endif #include diff --git a/src/compat/windows/wincompat.h b/src/compat/windows/wincompat.h index 7fe21f4..1ce3ac8 100644 --- a/src/compat/windows/wincompat.h +++ b/src/compat/windows/wincompat.h @@ -14,6 +14,79 @@ #include #include #include +#include + +// TODO: fix mingw32 x86 or drop support and use x86_x64 +// copied from x86_64-4.8.3-release-posix-seh-rt_v3-rev0 for mingw32 x86 4.8.1 +#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) + // from winsock2.h + #define POLLRDNORM 0x0100 + #define POLLRDBAND 0x0200 + #define POLLIN (POLLRDNORM | POLLRDBAND) + #define POLLPRI 0x0400 + + #define POLLWRNORM 0x0010 + #define POLLOUT (POLLWRNORM) + #define POLLWRBAND 0x0020 + + #define POLLERR 0x0001 + #define POLLHUP 0x0002 + #define POLLNVAL 0x0004 + + typedef struct pollfd { + SOCKET fd; + short events; + short revents; + } WSAPOLLFD, *PWSAPOLLFD, *LPWSAPOLLFD; + + // to fix redefenition of 'timespec' defined in pthread.h and parts/time.h used by simple-watch.c + #define HAVE_STRUCT_TIMESPEC + + // from ws2ipdef.h + #define IPV6_HOPOPTS 1 + #define IPV6_HDRINCL 2 + #define IPV6_UNICAST_HOPS 4 + #define IPV6_MULTICAST_IF 9 + #define IPV6_MULTICAST_HOPS 10 + #define IPV6_MULTICAST_LOOP 11 + #define IPV6_ADD_MEMBERSHIP 12 + #define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP + #define IPV6_DROP_MEMBERSHIP 13 + #define IPV6_LEAVE_GROUP IPV6_DROP_MEMBERSHIP + #define IPV6_DONTFRAG 14 + #define IPV6_PKTINFO 19 + #define IPV6_HOPLIMIT 21 + #define IPV6_PROTECTION_LEVEL 23 + #define IPV6_RECVIF 24 + #define IPV6_RECVDSTADDR 25 + #define IPV6_CHECKSUM 26 + #define IPV6_V6ONLY 27 + #define IPV6_IFLIST 28 + #define IPV6_ADD_IFLIST 29 + #define IPV6_DEL_IFLIST 30 + #define IPV6_UNICAST_IF 31 + #define IPV6_RTHDR 32 + #define IPV6_RECVRTHDR 38 + #define IPV6_TCLASS 39 + #define IPV6_RECVTCLASS 40 + + // from errno.h + #ifndef EADDRINUSE + #define EADDRINUSE 100 + #endif + + #ifndef EWOULDBLOCK + #define EWOULDBLOCK 140 + #endif + + // from mswsock.h + #define MSG_TRUNC 0x0100 + #define MSG_CTRUNC 0x0200 + + // from netioapi.h + //.... lots of dependencies x-( + // TODO: fix mingw32 x86 or drop support and use x86_x64 +#endif // wrappers around WSAStartup/WSACleanup to avoid clutter @@ -47,12 +120,31 @@ struct msghdr { // MSDN says this struct is called wsacmsghdr but MingW uses _WSACMSGHDR. // TODO: Verify what it is on actual Windows. // cf. http://msdn.microsoft.com/en-us/library/ms741645(v=vs.85).aspx +// --> +// MingW32 x86 4.8.1 uses wsacmsghdr, MingW x86_x64 uses _WSACMSGHDR and Visual Studio 2015 RC (ws2def.h) defines: +// #if(_WIN32_WINNT >= 0x0600) +// #define _WSACMSGHDR cmsghdr +// #endif //(_WIN32_WINNT>=0x0600) +// typedef struct _WSACMSGHDR { +// SIZE_T cmsg_len; +// INT cmsg_level; +// INT cmsg_type; +// /* followed by UCHAR cmsg_data[] */ +// } WSACMSGHDR, *PWSACMSGHDR, FAR *LPWSACMSGHDR; #ifdef __MINGW32__ -#define cmsghdr _WSACMSGHDR // as in 'struct cmsghdr' -#else -#define cmsghdr wsacmsghdr // as in 'struct cmsghdr' + #ifdef __MINGW64_VERSION_MAJOR + #define cmsghdr _WSACMSGHDR // as in 'struct cmsghdr' + #else + #define cmsghdr wsacmsghdr // as in 'struct cmsghdr' + #endif +#elif (_WIN32_WINNT < 0x0600) + #define cmsghdr _WSACMSGHDR #endif +// VS2015 ws2def.h already defines: #define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR +#ifdef CMSG_FIRSTHDR +#undef CMSG_FIRSTHDR +#endif static inline struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *m) { WSAMSG wm; wm.Control.len = m->msg_controllen; @@ -60,6 +152,10 @@ static inline struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *m) { return WSA_CMSG_FIRSTHDR(&wm); } +// VS2015 ws2def.h already defines: #define CMSG_NXTHDR WSA_CMSG_NXTHDR +#ifdef CMSG_NXTHDR +#undef CMSG_NXTHDR +#endif static inline struct cmsghdr *CMSG_NXTHDR(struct msghdr *m, struct cmsghdr *c) { WSAMSG wm; wm.Control.len = m->msg_controllen; @@ -67,14 +163,24 @@ static inline struct cmsghdr *CMSG_NXTHDR(struct msghdr *m, struct cmsghdr *c) { return WSA_CMSG_NXTHDR(&wm, c); } -#define CMSG_SPACE(len) WSA_CMSG_SPACE(len) -#define CMSG_LEN(len) WSA_CMSG_LEN(len) +#ifndef CMSG_SPACE + #define CMSG_SPACE(len) WSA_CMSG_SPACE(len) +#endif +#ifndef CMSG_LEN + #define CMSG_LEN(len) WSA_CMSG_LEN(len) +#endif // we're going to be naughty and redefine CMSG_DATA as an alias even though it // is also a constant defined in wincrypt.h which we don't care about. #undef CMSG_DATA #define CMSG_DATA(c) WSA_CMSG_DATA(c) +// VS2012 and up has no ssize_t defined, before it was defined as unsigned int +#ifndef _SSIZE_T +#define _SSIZE_T +typedef signed int ssize_t; +#endif + ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags); ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); -- 2.39.5