Merge pull request #23 from warped-rudi/master-updates
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Wed, 19 Sep 2012 00:54:22 +0000 (17:54 -0700)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Wed, 19 Sep 2012 00:54:22 +0000 (17:54 -0700)
Merged. Thanks!

.gitignore
lib/socket.c
win32/win32_errnowrapper.h

index 98e7babb2e3cd809b8d3fabe419979b4b4f3c045..764892375f84f9667fa872d190b9679cb7f35775 100644 (file)
@@ -6,7 +6,14 @@
 *.a
 *.lo
 *.o
+*.obj
+*.lib
+*.dll
+*.ilk
+*.pdb
+*.ex?
 *-stamp
+libnfs-raw-*.x
 Makefile
 examples/nfsclient-raw
 examples/nfsclient-sync
index ea16d8c9e508f7ab247ec892b29196136717828c..1bb34f0ef9e57212d7919d4fee3d0d524c3488f6 100644 (file)
@@ -363,8 +363,6 @@ static int rpc_connect_sockaddr_async(struct rpc_context *rpc, struct sockaddr_s
                return -1;
        }
 
-
-#if !defined(WIN32)
        /* Some systems allow you to set capabilities on an executable
         * to allow the file to be executed with privilege to bind to
         * privileged system ports, even if the user is not root.
@@ -379,42 +377,43 @@ static int rpc_connect_sockaddr_async(struct rpc_context *rpc, struct sockaddr_s
         * On linux, use
         *    sudo setcap 'cap_net_bind_service=+ep' /path/executable
         * to make the executable able to bind to a system port.
+        *
+        * On Windows, there is no concept of privileged ports. Thus
+        * binding will usually succeed.
         */
-       if (1) {
-               static int port = 200;
-               int i;
-               int one = 1;
-
-               setsockopt(rpc->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one));
-
-               for (i = 0; i < 500; i++) {
-                       struct sockaddr_in sin;
-
-                       if(++port > 700) port = 200;
-
-                       memset(&sin, 0, sizeof(sin));
-                       sin.sin_port        = htons(port);
-                       sin.sin_family      = AF_INET;
-                       sin.sin_addr.s_addr = 0;
-
-                       if (bind(rpc->fd, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) != 0 && errno != EACCES) {
-                               /* we didnt get EACCES, so try again */
-                               continue;
+       {
+               struct sockaddr_in sin;
+               static int portOfs = 0;
+               const int firstPort = 512;      /* >= 512 according to Sun docs */
+               const int portCount = IPPORT_RESERVED - firstPort;
+               int startOfs = portOfs, port, rc;
+
+               do {
+                       rc = -1;
+                       port = htons(firstPort + portOfs);
+                       portOfs = (portOfs + 1) % portCount;
+
+                       /* skip well-known ports */
+                       if (!getservbyport(port, "tcp")) {
+                               memset(&sin, 0, sizeof(sin));
+                               sin.sin_port        = port;
+                               sin.sin_family      = AF_INET;
+                               sin.sin_addr.s_addr = 0;
+
+                               rc = bind(rpc->fd, (struct sockaddr *)&sin, sizeof(struct sockaddr_in));
+#if !defined(WIN32)
+                               /* we got EACCES, so don't try again */
+                               if (rc != 0 && errno == EACCES)
+                                       break;
+#endif
                        }
-                       break;
-               }
+               } while (rc != 0 && portOfs != startOfs);
        }
-#endif
 
        set_nonblocking(rpc->fd);
 
-#if defined(WIN32)
-       if (connect(rpc->fd, (struct sockaddr *)s, socksize) == 0 && errno != EINPROGRESS   )
-#else
-       if (connect(rpc->fd, (struct sockaddr *)s, socksize) != 0 && errno != EINPROGRESS) 
-#endif
-       {
-         rpc_set_error(rpc, "connect() to server failed. %s(%d)", strerror(errno), errno);
+       if (connect(rpc->fd, (struct sockaddr *)s, socksize) != 0 && errno != EINPROGRESS) {
+               rpc_set_error(rpc, "connect() to server failed. %s(%d)", strerror(errno), errno);
                return -1;
        }               
 
index 4477d3f975512bc5c776b01f932600106738abb5..ebed01c35eed8a00a8f56a14895f0bbbd7983925 100644 (file)
@@ -9,7 +9,8 @@
 #undef EINPROGRESS
 
 #define EWOULDBLOCK WSAEWOULDBLOCK
-#define EAGAIN         WSAEWOULDBLOCK                                  //same on windows
+#define EAGAIN         WSAEWOULDBLOCK                  //same on windows
 #define EINTR       WSAEINTR
-#define EINPROGRESS WSAEINPROGRESS
+#define EINPROGRESS WSAEWOULDBLOCK                     //does not map to WSAEINPROGRESS !
+
 #endif //WIN32_ERRNOWRAPPER_H_