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().
This commit is contained in:
parent
1153d9c995
commit
4d40a27542
12 changed files with 49 additions and 200 deletions
3
Make.mk
3
Make.mk
|
@ -74,7 +74,8 @@ gamedir := $(localstatedir)/empire
|
||||||
builtindir := $(datadir)/empire/builtin
|
builtindir := $(datadir)/empire/builtin
|
||||||
einfodir := $(datadir)/empire/info.nr
|
einfodir := $(datadir)/empire/info.nr
|
||||||
ehtmldir := $(datadir)/empire/info.html
|
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
|
# How to substitute Autoconf output variables
|
||||||
# Recursively expanded so that $@ and $< work.
|
# Recursively expanded so that $@ and $< work.
|
||||||
|
|
|
@ -95,7 +95,12 @@ termlib.$O: misc.h
|
||||||
version.$O: version.h
|
version.$O: version.h
|
||||||
$(obj): config.h
|
$(obj): config.h
|
||||||
|
|
||||||
expect.$O: w32/w32types.h
|
expect.$O: w32/sys/socket.h w32/unistd.h w32/w32types.h
|
||||||
play.$O: 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
|
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/w32io.$O: misc.h w32/sys/uio.h w32/w32types.h
|
||||||
|
w32/w32sockets.$O: w32/sys/socket.h w32/unistd.h w32/w32types.h
|
||||||
|
|
|
@ -56,6 +56,7 @@ LIBS="$LIBS_SOCKETS $LIBS"
|
||||||
LIB_SOCKET_NSL
|
LIB_SOCKET_NSL
|
||||||
if test "$Windows_API" = yes; then
|
if test "$Windows_API" = yes; then
|
||||||
AC_LIBOBJ([w32/w32io])
|
AC_LIBOBJ([w32/w32io])
|
||||||
|
AC_LIBOBJ([w32/w32sockets])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -39,23 +39,12 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#ifdef _WIN32
|
|
||||||
#include "w32types.h"
|
|
||||||
#else
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "proto.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
|
int
|
||||||
recvline(int s, char *buf)
|
recvline(int s, char *buf)
|
||||||
{
|
{
|
||||||
|
|
|
@ -40,14 +40,12 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#ifndef _WIN32
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
/* Portability cruft, should become unnecessary eventually */
|
/* Portability cruft, should become unnecessary eventually */
|
||||||
|
|
|
@ -38,8 +38,9 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#if !defined(_WIN32)
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "proto.h"
|
#include "proto.h"
|
||||||
|
|
|
@ -39,8 +39,8 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
#include <unistd.h>
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
|
|
@ -39,14 +39,13 @@
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#ifndef _WIN32
|
#ifdef _WIN32
|
||||||
#include <sys/select.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#else
|
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
#include <io.h>
|
#include <sys/socket.h>
|
||||||
#include "w32types.h"
|
#else
|
||||||
|
#include <sys/select.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <unistd.h>
|
||||||
#include "linebuf.h"
|
#include "linebuf.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "proto.h"
|
#include "proto.h"
|
||||||
|
@ -204,7 +203,7 @@ w32_select(int nfds, fd_set *rdfd, fd_set *wrfd, fd_set *errfd, struct timeval*
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
sock = W32_FD_TO_SOCKET(sockfd);
|
sock = w32_fd2socket(sockfd);
|
||||||
|
|
||||||
assert(wrfd->fd_count == 0
|
assert(wrfd->fd_count == 0
|
||||||
|| (wrfd->fd_count == 1 && wrfd->fd_array[0] == (SOCKET)sockfd));
|
|| (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;
|
return res;
|
||||||
}
|
}
|
||||||
#define ring_from_file w32_ring_from_file_or_bounce_buf
|
#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) \
|
#define select(nfds, rd, wr, error, time) \
|
||||||
w32_select((nfds), (rd), (wr), (error), (time))
|
w32_select((nfds), (rd), (wr), (error), (time))
|
||||||
#define sigemptyset(mask) ((void)0)
|
#define sigemptyset(mask) ((void)0)
|
||||||
|
|
|
@ -33,54 +33,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <errno.h>
|
#include <config.h>
|
||||||
#include <fcntl.h>
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <windows.h>
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
#include "sys/socket.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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get user name in the WIN32 environment
|
* Get user name in the WIN32 environment
|
||||||
|
@ -102,15 +60,11 @@ w32_getpw(void)
|
||||||
return &pwd;
|
return &pwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize the WIN32 socket library and
|
|
||||||
* set up stdout to work around bugs
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
w32_sysdep_init(void)
|
w32_sysdep_init(void)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
WSADATA WsaData;
|
|
||||||
/*
|
/*
|
||||||
* stdout is unbuffered under Windows if connected to a character
|
* stdout is unbuffered under Windows if connected to a character
|
||||||
* device, and putchar() screws up when printing multibyte strings
|
* device, and putchar() screws up when printing multibyte strings
|
||||||
|
@ -120,107 +74,12 @@ w32_sysdep_init(void)
|
||||||
* after each prompt is required.
|
* after each prompt is required.
|
||||||
*/
|
*/
|
||||||
setvbuf(stdout, NULL, _IOLBF, 4096);
|
setvbuf(stdout, NULL, _IOLBF, 4096);
|
||||||
err = WSAStartup(MAKEWORD(2, 0), &WsaData);
|
|
||||||
|
err = w32_socket_init();
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
printf("WSAStartup Failed, error code %d\n", err);
|
printf("WSAStartup Failed, error code %d\n", err);
|
||||||
exit(1);
|
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 */
|
#endif /* _WIN32 */
|
||||||
|
|
|
@ -33,39 +33,15 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _SYSDEF_W32_H
|
#ifndef _SYSDEF_W32_H
|
||||||
#include <getopt.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <winsock2.h>
|
|
||||||
#include <ws2tcpip.h>
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
struct passwd {
|
struct passwd {
|
||||||
char *pw_name;
|
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 struct passwd *w32_getpw(void);
|
||||||
extern void w32_sysdep_init(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
|
#ifdef _MSC_VER
|
||||||
#define pclose _pclose
|
#define pclose _pclose
|
||||||
#define popen _popen
|
#define popen _popen
|
||||||
|
|
|
@ -43,6 +43,8 @@ typedef int socklen_t;
|
||||||
w32_accept((fd), (addr), (addrlen))
|
w32_accept((fd), (addr), (addrlen))
|
||||||
#define bind(fd, name, namelen) \
|
#define bind(fd, name, namelen) \
|
||||||
w32_bind((fd), (name), (namelen))
|
w32_bind((fd), (name), (namelen))
|
||||||
|
#define connect(fd, addr, addrlen) \
|
||||||
|
w32_connect((fd), (addr), (addrlen))
|
||||||
#define listen(fd, backlog) \
|
#define listen(fd, backlog) \
|
||||||
w32_listen((fd), (backlog))
|
w32_listen((fd), (backlog))
|
||||||
#define setsockopt(fd, level, optname, optval, optlen) \
|
#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_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_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_listen(int fd, int backlog);
|
||||||
extern int w32_setsockopt(int fd, int level, int optname,
|
extern int w32_setsockopt(int fd, int level, int optname,
|
||||||
const void *optval, socklen_t optlen);
|
const void *optval, socklen_t optlen);
|
||||||
|
|
|
@ -147,6 +147,25 @@ w32_bind(int fd, const struct sockaddr *name, socklen_t namelen)
|
||||||
SOCKET_FUNCTION(bind(sock, name, 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().
|
* POSIX equivalent for listen().
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue