From 4d40a27542230e9131eb0d30904bfdeb2d6a9f59 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 18 Apr 2009 23:01:23 +0200 Subject: [PATCH] Use src/lib/w32/w32sockets.c for client Move client's w32_connect() to w32sockets.c. Replace w32_recv() and w32_send() by read() and write(). Replace w32_close() by w32_close_function. Replace call of WSAStartup() in w32_sysdep_init() by w32_socket_init(). Remove the identical copies of fd_is_socket(), w32_set_winsock_errno(), w32_socket(). --- Make.mk | 3 +- src/client/Makefile.in | 9 ++- src/client/configure.ac | 1 + src/client/expect.c | 11 --- src/client/host.c | 2 - src/client/login.c | 3 +- src/client/main.c | 2 +- src/client/play.c | 15 ++-- src/client/sysdep_w32.c | 157 ++------------------------------------- src/client/sysdep_w32.h | 24 ------ src/lib/w32/sys/socket.h | 3 + src/lib/w32/w32sockets.c | 19 +++++ 12 files changed, 49 insertions(+), 200 deletions(-) diff --git a/Make.mk b/Make.mk index afa731c1..adaad9a9 100644 --- a/Make.mk +++ b/Make.mk @@ -74,7 +74,8 @@ gamedir := $(localstatedir)/empire builtindir := $(datadir)/empire/builtin einfodir := $(datadir)/empire/info.nr ehtmldir := $(datadir)/empire/info.html -client/w32 := sys/uio.h w32io.c w32types.h +client/w32 := arpa/inet.h netdb.h netinet/in.h sys/time.h sys/socket.h \ +sys/uio.h unistd.h w32io.c w32sockets.c w32types.h # How to substitute Autoconf output variables # Recursively expanded so that $@ and $< work. diff --git a/src/client/Makefile.in b/src/client/Makefile.in index 00491351..54805f50 100644 --- a/src/client/Makefile.in +++ b/src/client/Makefile.in @@ -95,7 +95,12 @@ termlib.$O: misc.h version.$O: version.h $(obj): config.h -expect.$O: w32/w32types.h -play.$O: w32/w32types.h +expect.$O: w32/sys/socket.h w32/unistd.h w32/w32types.h +host.$O: w32/sys/socket.h w32/netinet/in.h w32/arpa/inet.h w32/netdb.h w32/unistd.h w32/w32types.h +login.$O: w32/unistd.h w32/w32types.h +main.$O: w32/unistd.h w32/w32types.h +play.$O: w32/sys/socket.h w32/unistd.h w32/w32types.h ringbuf.$O: w32/sys/uio.h w32/w32types.h +sysdep_w32.$O: w32/sys/socket.h w32/w32io.$O: misc.h w32/sys/uio.h w32/w32types.h +w32/w32sockets.$O: w32/sys/socket.h w32/unistd.h w32/w32types.h diff --git a/src/client/configure.ac b/src/client/configure.ac index 9625e435..0b92095d 100644 --- a/src/client/configure.ac +++ b/src/client/configure.ac @@ -56,6 +56,7 @@ LIBS="$LIBS_SOCKETS $LIBS" LIB_SOCKET_NSL if test "$Windows_API" = yes; then AC_LIBOBJ([w32/w32io]) + AC_LIBOBJ([w32/w32sockets]) fi diff --git a/src/client/expect.c b/src/client/expect.c index 63735ffa..50aa7891 100644 --- a/src/client/expect.c +++ b/src/client/expect.c @@ -39,23 +39,12 @@ #include #include #include -#ifdef _WIN32 -#include "w32types.h" -#else #include #include #include -#endif #include "misc.h" #include "proto.h" -#ifdef _WIN32 -#define read(sock, buffer, buf_size) \ - w32_recv((sock), (buffer), (buf_size), 0) -#define write(sock, buffer, buf_size) \ - w32_send((sock), (buffer), (buf_size), 0) -#endif - int recvline(int s, char *buf) { diff --git a/src/client/host.c b/src/client/host.c index d7ea626c..dde057cd 100644 --- a/src/client/host.c +++ b/src/client/host.c @@ -40,14 +40,12 @@ #include #include #include -#ifndef _WIN32 #include #include #include #include #include #include -#endif #include "misc.h" /* Portability cruft, should become unnecessary eventually */ diff --git a/src/client/login.c b/src/client/login.c index 77d1bd83..48d4321a 100644 --- a/src/client/login.c +++ b/src/client/login.c @@ -38,8 +38,9 @@ #include #include #include -#if !defined(_WIN32) #include +#ifdef _WIN32 +#include #endif #include "misc.h" #include "proto.h" diff --git a/src/client/main.c b/src/client/main.c index 3df9d3ba..dea0a01d 100644 --- a/src/client/main.c +++ b/src/client/main.c @@ -39,8 +39,8 @@ #include #ifndef _WIN32 #include -#include #endif +#include #include "misc.h" #include "version.h" diff --git a/src/client/play.c b/src/client/play.c index 313dbeb5..d20e8f45 100644 --- a/src/client/play.c +++ b/src/client/play.c @@ -39,14 +39,13 @@ #include #include #include -#ifndef _WIN32 -#include -#include -#else +#ifdef _WIN32 #include -#include -#include "w32types.h" +#include +#else +#include #endif +#include #include "linebuf.h" #include "misc.h" #include "proto.h" @@ -204,7 +203,7 @@ w32_select(int nfds, fd_set *rdfd, fd_set *wrfd, fd_set *errfd, struct timeval* default: assert(0); } - sock = W32_FD_TO_SOCKET(sockfd); + sock = w32_fd2socket(sockfd); assert(wrfd->fd_count == 0 || (wrfd->fd_count == 1 && wrfd->fd_array[0] == (SOCKET)sockfd)); @@ -295,8 +294,6 @@ w32_ring_from_file_or_bounce_buf(struct ring *r, int fd) return res; } #define ring_from_file w32_ring_from_file_or_bounce_buf -#define read(sock, buffer, buf_size) \ - w32_recv((sock), (buffer), (buf_size), 0) #define select(nfds, rd, wr, error, time) \ w32_select((nfds), (rd), (wr), (error), (time)) #define sigemptyset(mask) ((void)0) diff --git a/src/client/sysdep_w32.c b/src/client/sysdep_w32.c index 9fc08f2a..46a21334 100644 --- a/src/client/sysdep_w32.c +++ b/src/client/sysdep_w32.c @@ -33,54 +33,12 @@ */ #ifdef _WIN32 -#include -#include +#include + +#include +#include #include "misc.h" - -static int -fd_is_socket(int fd, SOCKET *sockp) -{ - SOCKET sock; - WSANETWORKEVENTS ev; - - sock = W32_FD_TO_SOCKET(fd); - if (sockp) - *sockp = sock; - return WSAEnumNetworkEvents(sock, NULL, &ev) == 0; -} - -void -w32_set_winsock_errno(void) -{ - int err = WSAGetLastError(); - WSASetLastError(0); - - /* Map some WSAE* errors to the runtime library's error codes. */ - switch (err) - { - case WSA_INVALID_HANDLE: - errno = EBADF; - break; - case WSA_NOT_ENOUGH_MEMORY: - errno = ENOMEM; - break; - case WSA_INVALID_PARAMETER: - errno = EINVAL; - break; - case WSAEWOULDBLOCK: - errno = EAGAIN; - break; - case WSAENAMETOOLONG: - errno = ENAMETOOLONG; - break; - case WSAENOTEMPTY: - errno = ENOTEMPTY; - break; - default: - errno = (err > 10000 && err < 10025) ? err - 10000 : err; - break; - } -} +#include "sys/socket.h" /* * Get user name in the WIN32 environment @@ -102,15 +60,11 @@ w32_getpw(void) return &pwd; } -/* - * Initialize the WIN32 socket library and - * set up stdout to work around bugs - */ void w32_sysdep_init(void) { int err; - WSADATA WsaData; + /* * stdout is unbuffered under Windows if connected to a character * device, and putchar() screws up when printing multibyte strings @@ -120,107 +74,12 @@ w32_sysdep_init(void) * after each prompt is required. */ setvbuf(stdout, NULL, _IOLBF, 4096); - err = WSAStartup(MAKEWORD(2, 0), &WsaData); + + err = w32_socket_init(); if (err != 0) { printf("WSAStartup Failed, error code %d\n", err); exit(1); } } -/* - * POSIX compatible socket() replacement - */ -#undef socket -int -w32_socket(int domain, int type, int protocol) -{ - SOCKET sock; - - /* - * We have to use WSASocket() to create non-overlapped IO sockets. - * Overlapped IO sockets cannot be used with read/write. - */ - sock = WSASocket(domain, type, protocol, NULL, 0, 0); - if (sock == INVALID_SOCKET) { - w32_set_winsock_errno(); - return -1; - } - return W32_SOCKET_TO_FD(sock); -} - -/* - * 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 compatible recv() replacement - */ -#undef recv -int -w32_recv(int sockfd, void *buffer, size_t buf_size, int flags) -{ - SOCKET socket = W32_FD_TO_SOCKET(sockfd); - int result; - - result = recv(socket, buffer, buf_size, flags); - if (result == SOCKET_ERROR) { - w32_set_winsock_errno(); - return -1; - } - return result; -} - -/* - * POSIX compatible send() replacement - */ -int -w32_send(int sockfd, const void *buffer, size_t buf_size, int flags) -{ - SOCKET socket = W32_FD_TO_SOCKET(sockfd); - int result; - - result = send(socket, buffer, buf_size, flags); - if (result == SOCKET_ERROR) - w32_set_winsock_errno(); - return result; -} - -/* - * POSIX compatible close() replacement - */ -int -w32_close(int fd) -{ - SOCKET sock; - - if (fd_is_socket(fd, &sock)) { - if (closesocket(sock)) { - w32_set_winsock_errno(); - return -1; - } - /* - * This always fails because the underlying handle is already - * gone, but it closes the fd just fine. - */ - _close(fd); - return 0; - } - return _close(fd); -} - #endif /* _WIN32 */ diff --git a/src/client/sysdep_w32.h b/src/client/sysdep_w32.h index 0ab4c303..89069026 100644 --- a/src/client/sysdep_w32.h +++ b/src/client/sysdep_w32.h @@ -33,39 +33,15 @@ */ #ifndef _SYSDEF_W32_H -#include #include -#include -#include -#include struct passwd { char *pw_name; }; -#define W32_FD_TO_SOCKET(fd) ((SOCKET)_get_osfhandle((fd))) -#define W32_SOCKET_TO_FD(fh) (_open_osfhandle((long)(fh), O_RDWR | O_BINARY)) - -extern void w32_set_winsock_errno(void); - -extern int w32_recv(int sockfd, void *, size_t, int flags); -extern int w32_send(int sockfd, const void *, size_t, int flags); -extern int w32_close(int fd); -extern int w32_socket(int domain, int type, int protocol); -extern int w32_connect(int sockfd, const struct sockaddr *, int addrlen); - extern struct passwd *w32_getpw(void); extern void w32_sysdep_init(void); -#define recv(sockfd, buffer, buf_size, flags) \ - w32_recv((sockfd), (buffer), (buf_size), (flags)) -#define close(fd) \ - w32_close((fd)) -#define socket(domain, type, protocol) \ - w32_socket((domain), (type), (protocol)) -#define connect(sockfd, addr, addrlen) \ - w32_connect((sockfd), (addr), (addrlen)) - #ifdef _MSC_VER #define pclose _pclose #define popen _popen diff --git a/src/lib/w32/sys/socket.h b/src/lib/w32/sys/socket.h index ac5927ac..c11daadb 100644 --- a/src/lib/w32/sys/socket.h +++ b/src/lib/w32/sys/socket.h @@ -43,6 +43,8 @@ typedef int socklen_t; w32_accept((fd), (addr), (addrlen)) #define bind(fd, name, namelen) \ w32_bind((fd), (name), (namelen)) +#define connect(fd, addr, addrlen) \ + w32_connect((fd), (addr), (addrlen)) #define listen(fd, backlog) \ w32_listen((fd), (backlog)) #define setsockopt(fd, level, optname, optval, optlen) \ @@ -54,6 +56,7 @@ typedef int socklen_t; extern int w32_accept(int fd, struct sockaddr *addr, socklen_t *addrlen); extern int w32_bind(int fd, const struct sockaddr *name, socklen_t namelen); +extern int w32_connect(int fd, const struct sockaddr *addr, socklen_t addrlen); extern int w32_listen(int fd, int backlog); extern int w32_setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen); diff --git a/src/lib/w32/w32sockets.c b/src/lib/w32/w32sockets.c index 318949d4..6e90468f 100644 --- a/src/lib/w32/w32sockets.c +++ b/src/lib/w32/w32sockets.c @@ -147,6 +147,25 @@ 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(). */