/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2009, Dave Pare, Jeff Bailey, Thomas Ruschak,
- * Ken Stevens, Steve McClure
+ * Copyright (C) 1986-2013, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Ken Stevens, Steve McClure, Markus Armbruster
*
- * This program is free software; you can redistribute it and/or modify
+ * Empire is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ---
*
* w32sockets.c: POSIX socket emulation layer for Windows
*
* Known contributors to this file:
- * Ron Koenderink, 2007
- * Markus Armbruster, 2007-2009
+ * Ron Koenderink, 2007-2010
+ * Markus Armbruster, 2007-2010
*/
/*
#define W32_SOCKET_TO_FD(fh) (_open_osfhandle((long)(fh), O_RDWR | O_BINARY))
SOCKET
-posix_fd2socket(int fd)
+w32_fd2socket(int fd)
{
return W32_FD_TO_SOCKET(fd);
}
fd_is_socket(int fd, SOCKET *sockp)
{
SOCKET sock;
- WSANETWORKEVENTS ev;
+ BOOL val;
+ int size = sizeof(val);
sock = W32_FD_TO_SOCKET(fd);
if (sockp)
*sockp = sock;
- return WSAEnumNetworkEvents(sock, NULL, &ev) == 0;
+ return getsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&val, &size)
+ == 0;
}
void
w32_set_winsock_errno(void)
{
- int err = WSAGetLastError();
- WSASetLastError(0);
+ int err = WSAGetLastError();
+ WSASetLastError(0);
- /* Map some WSAE* errors to the runtime library's error codes. */
- switch (err)
- {
+ /* Map some WSAE* errors to the runtime library's error codes. */
+ switch (err) {
case WSA_INVALID_HANDLE:
- errno = EBADF;
- break;
+ errno = EBADF;
+ break;
case WSA_NOT_ENOUGH_MEMORY:
- errno = ENOMEM;
- break;
+ errno = ENOMEM;
+ break;
case WSA_INVALID_PARAMETER:
- errno = EINVAL;
- break;
+ errno = EINVAL;
+ break;
case WSAEWOULDBLOCK:
- errno = EAGAIN;
- break;
+ errno = EAGAIN;
+ break;
case WSAENAMETOOLONG:
- errno = ENAMETOOLONG;
- break;
+ errno = ENAMETOOLONG;
+ break;
case WSAENOTEMPTY:
- errno = ENOTEMPTY;
- break;
+ errno = ENOTEMPTY;
+ break;
default:
- errno = (err > 10000 && err < 10025) ? err - 10000 : err;
- break;
+ errno = (err > 10000 && err < 10025) ? err - 10000 : err;
+ break;
}
}
*/
#undef accept
int
-posix_accept(int fd, struct sockaddr *addr, socklen_t *addrlen)
+w32_accept(int fd, struct sockaddr *addr, socklen_t *addrlen)
{
SOCKET sock;
*/
#undef bind
int
-posix_bind(int fd, const struct sockaddr *name, socklen_t namelen)
+w32_bind(int fd, const struct sockaddr *name, socklen_t namelen)
{
SOCKET_FUNCTION(bind(sock, name, namelen));
}
+/*
+ * POSIX compatible connect() replacement
+ */
+#undef connect
+int
+w32_connect(int sockfd, const struct sockaddr *addr, int addrlen)
+{
+ SOCKET sock = W32_FD_TO_SOCKET(sockfd);
+ int result;
+
+ result = connect(sock, addr, addrlen);
+ if (result == SOCKET_ERROR) {
+ /* FIXME map WSAEWOULDBLOCK to EINPROGRESS */
+ w32_set_winsock_errno();
+ return -1;
+ }
+ return result;
+}
+
/*
* POSIX equivalent for listen().
*/
#undef listen
int
-posix_listen(int fd, int backlog)
+w32_listen(int fd, int backlog)
{
SOCKET_FUNCTION(listen(sock, backlog));
}
*/
#undef setsockopt
int
-posix_setsockopt(int fd, int level, int optname,
- const void *optval, socklen_t optlen)
+w32_setsockopt(int fd, int level, int optname,
+ const void *optval, socklen_t optlen)
{
/*
* SO_REUSEADDR requests to permit another bind even when the
*/
#undef shutdown
int
-posix_shutdown(int fd, int how)
+w32_shutdown(int fd, int how)
{
SOCKET_FUNCTION(shutdown(sock, how));
}
*/
#undef socket
int
-posix_socket(int domain, int type, int protocol)
+w32_socket(int domain, int type, int protocol)
{
SOCKET sock;
unsigned long nonblocking;
SOCKET sock;
- switch (cmd)
- {
+ switch (cmd) {
case F_GETFL:
return 0;
case F_SETFL: