[or-cvs] Attempt to make sockets code work right on windows.

Nick Mathewson nickm at seul.org
Thu Aug 14 17:13:54 UTC 2003


Update of /home/or/cvsroot/src/common
In directory moria.mit.edu:/tmp/cvs-serv27349/src/common

Modified Files:
	fakepoll.c util.c util.h 
Log Message:
Attempt to make sockets code work right on windows.

Index: fakepoll.c
===================================================================
RCS file: /home/or/cvsroot/src/common/fakepoll.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- fakepoll.c	12 Aug 2003 08:18:13 -0000	1.6
+++ fakepoll.c	14 Aug 2003 17:13:51 -0000	1.7
@@ -8,6 +8,7 @@
 
 #include "orconfig.h"
 #include "fakepoll.h"
+
 #ifdef USE_FAKE_POLL
 #include <sys/types.h>
 #ifdef HAVE_UNISTD_H
@@ -30,6 +31,9 @@
 {
 	unsigned int idx, maxfd, fd;
 	int r;
+#ifdef MS_WINDOWS
+        int any_fds_set = 0;
+#endif
 	fd_set readfds, writefds, exceptfds;
 #ifdef USING_FAKE_TIMEVAL
 #undef timeval
@@ -46,15 +50,26 @@
 	maxfd = -1;
 	for (idx = 0; idx < nfds; ++idx) {
 		fd = ufds[idx].fd;
-		if (fd > maxfd && ufds[idx].events)
-			maxfd = fd;
-		if (ufds[idx].events & (POLLIN))
+                if (ufds[idx].events) {
+                        if (fd > maxfd) 
+                                maxfd = fd;
+#ifdef MS_WINDOWS
+                        any_fds_set = 1;
+#endif
+                }
+		if (ufds[idx].events & POLLIN)
 			FD_SET(fd, &readfds);
 		if (ufds[idx].events & POLLOUT)
 			FD_SET(fd, &writefds);
-		if (ufds[idx].events & (POLLERR))
+		if (ufds[idx].events & POLLERR)
 			FD_SET(fd, &exceptfds);
 	}
+#ifdef MS_WINDOWS
+        if (!any_fds_set) {
+                usleep(timeout);
+                return 0;
+        }
+#endif
 	r = select(maxfd+1, &readfds, &writefds, &exceptfds, 
 		   timeout == -1 ? NULL : &_timeout);
 	if (r <= 0)

Index: util.c
===================================================================
RCS file: /home/or/cvsroot/src/common/util.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- util.c	12 Aug 2003 08:18:13 -0000	1.13
+++ util.c	14 Aug 2003 17:13:51 -0000	1.14
@@ -4,7 +4,7 @@
 
 #include "../or/or.h"
 
-#ifdef _MSC_VER
+#ifdef MS_WINDOWS
 #include <io.h>
 #include <limits.h>
 #include <process.h>
@@ -90,7 +90,7 @@
 
 void set_socket_nonblocking(int socket)
 {
-#ifdef _MSC_VER
+#ifdef MS_WINDOWS
 	/* Yes means no and no means yes.  Do you not want to be nonblocking? */
 	int nonblocking = 0;
 	ioctlsocket(socket, FIONBIO, (unsigned long*) &nonblocking);
@@ -101,7 +101,7 @@
 
 int spawn_func(int (*func)(void *), void *data)
 {
-#ifdef _MSC_VER
+#ifdef MS_WINDOWS
   int rv;
   rv = _beginthread(func, 0, data);
   if (rv == (unsigned long) -1)
@@ -125,7 +125,7 @@
 
 void spawn_exit()
 {
-#ifdef _MSC_VER
+#ifdef MS_WINDOWS
   _endthread();
 #else
   exit(0);
@@ -137,7 +137,7 @@
 int
 tor_socketpair(int family, int type, int protocol, int fd[2])
 {
-#ifdef HAVE_SOCKETPAIR_XXX
+#ifdef HAVE_SOCKETPAIR_XXXX
     /* For testing purposes, we never fall back to real socketpairs. */
     return socketpair(family, type, protocol, fd);
 #else
@@ -153,8 +153,8 @@
         || family != AF_UNIX
 #endif
         ) {
-#ifdef _MSC_VER
-		errno = WSAEAFNOSUPPORT;
+#ifdef MS_WINDOWS
+        errno = WSAEAFNOSUPPORT;
 #else
         errno = EAFNOSUPPORT;
 #endif
@@ -213,7 +213,7 @@
     return 0;
 
   abort_tidy_up_and_fail:
-#ifdef _MSC_VER
+#ifdef MS_WINDOWS
   errno = WSAECONNABORTED;
 #else
   errno = ECONNABORTED; /* I hope this is portable and appropriate.  */
@@ -232,3 +232,16 @@
     }
 #endif
 }
+
+#ifdef MS_WINDOWS
+int correct_socket_errno(int s)
+{
+  int r, optval, optvallen=sizeof(optval);
+  assert(errno == WSAEWOULDBLOCK);
+  if (getsockopt(s, SOL_SOCKET, SO_ERROR, (void*)&optval, &optvallen))
+    return errno;
+  if (optval)
+    return optval;
+  return WSAEWOULDBLOCK;
+}
+#endif

Index: util.h
===================================================================
RCS file: /home/or/cvsroot/src/common/util.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- util.h	12 Aug 2003 08:18:13 -0000	1.7
+++ util.h	14 Aug 2003 17:13:51 -0000	1.8
@@ -13,6 +13,12 @@
 #ifdef HAVE_TIME_H
 #include <time.h>
 #endif
+#if _MSC_VER > 1300
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#elif defined(_MSC_VER)
+#include <winsock.h>
+#endif
 #ifndef HAVE_GETTIMEOFDAY
 #ifdef HAVE_FTIME
 #define USING_FAKE_TIMEVAL
@@ -23,7 +29,7 @@
 #endif
 #endif
 
-#ifdef _MSC_VER
+#ifdef MS_WINDOWS
 /* Windows names string functions funnily. */
 #define strncasecmp strnicmp
 #define strcasecmp stricmp
@@ -54,5 +60,25 @@
 void spawn_exit();
 
 int tor_socketpair(int family, int type, int protocol, int fd[2]);
+
+/* For stupid historical reasons, windows sockets have an independent set of 
+ * errnos which they use as the fancy strikes them.
+ */
+#ifdef MS_WINDOWS
+#define ERRNO_EAGAIN(e)           ((e) == EAGAIN || \
+                                   (e) == WSAEWOULDBLOCK || \
+                                   (e) == EWOULDBLOCK)
+#define ERRNO_EINPROGRESS(e)      ((e) == EINPROGRESS || \
+                                   (e) == WSAEINPROGRESS)
+#define ERRNO_CONN_EINPROGRESS(e) ((e) == EINPROGRESS || \
+                                   (e) == WSAEINPROGRESS || (e) == WSAEINVAL)
+int correct_socket_errno(int s);
+#else
+#define ERRNO_EAGAIN(e)           ((e) == EAGAIN)
+#define ERRNO_EINPROGRESS(e)      ((e) == EINPROGRESS)
+#define ERRNO_CONN_EINPROGRESS(e) ((e) == EINPROGRESS)
+#define correct_socket_errno(s)   (errno)
+#endif
+
 
 #endif



More information about the tor-commits mailing list