2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1986-2015, Dave Pare, Jeff Bailey, Thomas Ruschak,
4 * Ken Stevens, Steve McClure, Markus Armbruster
6 * Empire is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 * See files README, COPYING and CREDITS in the root of the source
22 * tree for related information and legal notices. It is expected
23 * that future projects/authors will amend these files as needed.
27 * w32io.c: POSIX I/O emulation layer for Windows
29 * Known contributors to this file:
30 * Ron Koenderink, 2007
31 * Markus Armbruster, 2007-2009
35 * POSIX sockets are file descriptors. Windows sockets are something
36 * else, with a separate set of functions to operate on them. To
37 * present a more POSIX-like interface to our application code, we
38 * provide a compatibility layer that wraps file descriptors around
51 int (*w32_close_function)(int) = _close;
52 int (*w32_read_function)(int, void *, unsigned) = _read;
53 int (*w32_write_function)(int, const void *, unsigned) = _write;
56 * POSIX equivalent for readv
57 * Modelled after the GNU's libc/sysdeps/posix/readv.c
60 readv(int fd, const struct iovec *iov, int iovcnt)
63 unsigned char *buffer, *buffer_location;
64 size_t total_bytes = 0;
68 for (i = 0; i < iovcnt; i++) {
69 total_bytes += iov[i].iov_len;
72 buffer = malloc(total_bytes);
73 if (buffer == NULL && total_bytes != 0) {
78 bytes_read = read(fd, buffer, total_bytes);
84 bytes_left = bytes_read;
85 buffer_location = buffer;
86 for (i = 0; i < iovcnt; i++) {
87 size_t copy = MIN(iov[i].iov_len, bytes_left);
89 memcpy(iov[i].iov_base, buffer_location, copy);
91 buffer_location += copy;
102 * POSIX equivalent for writev
103 * Modelled after the GNU's libc/sysdeps/posix/writev.c
106 writev(int fd, const struct iovec *iov, int iovcnt)
109 unsigned char *buffer, *buffer_location;
110 size_t total_bytes = 0;
113 for (i = 0; i < iovcnt; i++)
114 total_bytes += iov[i].iov_len;
116 buffer = malloc(total_bytes);
117 if (buffer == NULL && total_bytes != 0) {
122 buffer_location = buffer;
123 for (i = 0; i < iovcnt; i++) {
124 memcpy(buffer_location, iov[i].iov_base, iov[i].iov_len);
125 buffer_location += iov[i].iov_len;
128 bytes_written = write(fd, buffer, total_bytes);
130 return bytes_written;