shithub: opusfile

Download patch

ref: 4ce926cb7eab2e349a38840b765b77587649fbdf
parent: 25477092988deb11338abe8002f3ef76afac068c
author: Timothy B. Terriberry <tterribe@xiph.org>
date: Wed Jan 9 11:01:35 EST 2013

Fix warnings when compiling with a recent MSVC.

Apparently Vista includes more things in its Winsock implementation
 and errno.h than earlier versions of Windows.

--- a/src/http.c
+++ b/src/http.c
@@ -214,18 +214,31 @@
 
 #  define OP_INVALID_SOCKET (INVALID_SOCKET)
 
+/*Vista and later support WSAPoll(), but we don't want to rely on that.
+  Instead we re-implement it badly using select().
+  Unfortunately, they define a conflicting struct pollfd, so we only define our
+   own if it looks like that one has not already been defined.*/
+#  if !defined(POLLIN)
+/*Equivalent to POLLIN.*/
+#   define POLLRDNORM (0x0100)
+/*Priority band data can be read.*/
+#   define POLLRDBAND (0x0200)
 /*There is data to read.*/
-#  define POLLIN   (0x0001)
+#   define POLLIN     (POLLRDNORM|POLLRDBAND)
 /* There is urgent data to read.*/
-#  define POLLPRI  (0x0002)
+#   define POLLPRI    (0x0400)
+/*Equivalent to POLLOUT.*/
+#   define POLLWRNORM (0x0010)
 /*Writing now will not block.*/
-#  define POLLOUT  (0x0004)
+#   define POLLOUT    (POLLWRNORM)
+/*Priority data may be written.*/
+#   define POLLWRBAND (0x0020)
 /*Error condition (output only).*/
-#  define POLLERR  (0x0008)
+#   define POLLERR    (0x0001)
 /*Hang up (output only).*/
-#  define POLLHUP  (0x0010)
+#   define POLLHUP    (0x0002)
 /*Invalid request: fd not open (output only).*/
-#  define POLLNVAL (0x0020)
+#   define POLLNVAL   (0x0004)
 
 struct pollfd{
   /*File descriptor.*/
@@ -235,11 +248,12 @@
   /*Returned events.*/
   short   revents;
 };
+#  endif
 
+/*But Winsock never defines nfds_t (it's simply hard-coded to ULONG).*/
 typedef unsigned long nfds_t;
 
-/*Winsock has no poll(), so we reimplement it (badly) using select().
-  The usage of FD_SET() below is O(N^2).
+/*The usage of FD_SET() below is O(N^2).
   This is okay because select() is limited to 64 sockets in Winsock, anyway.
   In practice, we only ever call it with one or two sockets.*/
 static int op_poll_win32(struct pollfd *_fds,nfds_t _nfds,int _timeout){
@@ -295,6 +309,10 @@
 #  define setsockopt(_fd,_level,_name,_val,_len) \
  setsockopt(_fd,_level,_name,(const char *)(_val),_len)
 #  define poll(_fds,_nfds,_timeout) op_poll_win32(_fds,_nfds,_timeout)
+
+#  if defined(_MSC_VER)
+typedef ptrdiff_t ssize_t;
+#  endif
 
 # else
 /*Normal Berkeley sockets.*/
--- a/src/winerrno.h
+++ b/src/winerrno.h
@@ -15,9 +15,38 @@
 # include <errno.h>
 # include <winerror.h>
 
-/*These conflict with the MSVC errno definitions, but we don't need to use the
-   original ones in any file that deals with sockets.*/
+/*These conflict with the MSVC errno.h definitions, but we don't need to use
+   the original ones in any file that deals with sockets.
+  We could map the WSA errors to the errno.h ones (most of which are only
+   available on sufficiently new versions of MSVC), but they aren't ordered the
+   same, and given how rarely we actually look at the values, I don't think
+   it's worth a lookup table.*/
+# undef EWOULDBLOCK
+# undef EINPROGRESS
+# undef EALREADY
+# undef ENOTSOCK
+# undef EDESTADDRREQ
+# undef EMSGSIZE
+# undef EPROTOTYPE
+# undef ENOPROTOOPT
+# undef EPROTONOSUPPORT
+# undef EOPTNOTSUPP
+# undef EAFNOSUPPORT
+# undef EADDRINUSE
+# undef EADDRNOTAVAIL
+# undef ENETDOWN
+# undef ENETUNREACH
+# undef ENETRESET
+# undef ECONNABORTED
+# undef ECONNRESET
+# undef ENOBUFS
+# undef EISCONN
+# undef ENOTCONN
+# undef ETIMEDOUT
+# undef ECONNREFUSED
+# undef ELOOP
 # undef ENAMETOOLONG
+# undef EHOSTUNREACH
 # undef ENOTEMPTY
 
 # define EWOULDBLOCK     (WSAEWOULDBLOCK-WSABASEERR)