]> git.meshlink.io Git - catta/commitdiff
fix headers to be used with Visual Studio 2015 RC
authorHannes <hannes.ahrens@everbase.net>
Tue, 23 Jun 2015 13:08:39 +0000 (15:08 +0200)
committerHannes <hannes.ahrens@everbase.net>
Tue, 23 Jun 2015 13:08:39 +0000 (15:08 +0200)
include/catta/timeval.h
include/catta/watch.h
src/compat/windows/wincompat.h

index 0323f925d3bb9a560960a717e2ad48a87d614ca9..d78d2296e3fba51fc75a84be4211a9402abca14c 100644 (file)
@@ -23,7 +23,9 @@
 /** \file timeval.h Functions to facilitate timeval handling */
 
 #include <inttypes.h>
+#ifndef _MSC_VER
 #include <sys/time.h>
+#endif
 
 #include <catta/cdecl.h>
 
index ef50797638118f3059ba2eb331dc447835deda79..7824724ba0826b8aa2068344f5020464f7c75dfe 100644 (file)
@@ -23,7 +23,9 @@
 /** \file watch.h Simplistic main loop abstraction */
 
 #include <sys/poll.h>
+#ifndef _MSC_VER
 #include <sys/time.h>
+#endif
 
 #include <catta/cdecl.h>
 
index 7fe21f4a8bf410a9ab459a193f8a548c218157f0..1ce3ac87db8fa41d2f469c13ab3ba6d0ebe96e1a 100644 (file)
 #include <winsock2.h>
 #include <ws2tcpip.h>
 #include <mswsock.h>
+#include <sys/types.h>
+
+// 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);