]> git.pond.sub.org Git - empserver/commitdiff
(tcp_listen, posix_setsockopt) [_WIN32]: Move the special
authorRon Koenderink <rkoenderink@yahoo.ca>
Fri, 17 Aug 2007 03:11:45 +0000 (03:11 +0000)
committerRon Koenderink <rkoenderink@yahoo.ca>
Fri, 17 Aug 2007 03:11:45 +0000 (03:11 +0000)
SO_REUSEADDR code for _WIN32 from tcp_listen() to
posix_setsockopt().

[_WIN32] (posix_open): Switch to _sopen() for _sopen_s() as MinGW
does not support _sopen_s() yet.

[_WIN32] (posix_fd2socket): Fix typo.

src/lib/gen/tcp_listen.c
src/lib/w32/posixio.c

index 2ec839edd860430385f0a71937498da98349cf38..ad951ed4d441a9d9f92badbbf7464748d7835edf 100644 (file)
@@ -77,19 +77,8 @@ tcp_listen(char *host, char *serv, size_t *addrlenp)
        if (fd < 0)
            continue;           /* error, try next one */
 
-#ifndef _WIN32
-       /*
-        * SO_REUSEADDR requests to permit another bind even when the
-        * port is still in state TIME_WAIT.  Windows' SO_REUSEADDR is
-        * broken: it makes bind() succeed no matter what, even if
-        * there's another server running on the same port.  Luckily,
-        * bind() seems to be broken as well: it seems to succeed while
-        * the port is in state TIME_WAIT by default; thus we get the
-        * behavior we want by not setting SO_REUSEADDR.
-        */
        if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
            cant_listen(host, serv, strerror(errno));
-#endif
        if (bind(fd, res->ai_addr, res->ai_addrlen) == 0)
            break;              /* success */
 
@@ -134,11 +123,8 @@ tcp_listen(char *host, char *serv, size_t *addrlenp)
     }
     if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        cant_listen(host, serv, strerror(errno));
-#ifndef _WIN32
-    /* see comment on setsockopt() above */
     if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
        cant_listen(host, serv, strerror(errno));
-#endif
     if (bind(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
        cant_listen(host, serv, strerror(errno));
     if (listen(fd, SOMAXCONN) < 0)
index b031ee288f80f11f8b3855fcc2f6a2101d74a6e6..58dafd92266061546be6bdb7af0d79c865170c41 100644 (file)
@@ -193,7 +193,7 @@ int
 posix_fd2socket(int fd)
 {
     int handle;
-    enum dmap_io_type type;
+    enum fdmap_io_type type;
 
     if (!lookup_handle(fd, FDMAP_IO_SOCKET, WSAENOTSOCK,
        &type, &handle))
@@ -271,8 +271,22 @@ int
 posix_setsockopt(int fd, int level, int optname,
                      const char *optval, int optlen)
 {
-    SOCKET_FUNCTION(setsockopt(handle, level, optname,
-                   optval, optlen))
+    /*
+     * SO_REUSEADDR requests from tcp_listen.c
+     * to permit another bind even when the
+     * port is still in state TIME_WAIT.  Windows' SO_REUSEADDR is
+     * broken: it makes bind() succeed no matter what, even if
+     * there's another server running on the same port.  Luckily,
+     * bind() seems to be broken as well: it seems to succeed while
+     * the port is in state TIME_WAIT by default; thus we get the
+     * behavior we want by not setting SO_REUSEADDR.
+     */
+    if (level == SOL_SOCKET && optname == SO_REUSEADDR)
+       return 0;
+    {
+       SOCKET_FUNCTION(setsockopt(handle, level, optname,
+                       optval, optlen))
+    }
 }
 
 /*
@@ -404,7 +418,7 @@ posix_open(const char *fname, int oflag, ...)
      * We don't implement fcntl() for F_SETLK.  Instead, we lock *all*
      * files we open.  Not ideal, but it works for Empire.
      */
-    _sopen_s(&handle, fname, oflag,
+    handle = _sopen(fname, oflag,
        oflag & O_RDONLY ? SH_DENYNO : SH_DENYWR, pmode);
     if (handle == -1) {
        free_fd(new_fd);