X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=os%2Fwindows%2Fposix.c;h=41fc480df9f14f92a75ff07a5fda30fa098deb06;hb=1246147d5402d46ecb098dc06c9b31bf6810800c;hp=49bce43955465ca23483660005da8c2770489a5c;hpb=3899da22920c2ac1b30080f915189eb77c94cf8a;p=fio.git diff --git a/os/windows/posix.c b/os/windows/posix.c index 49bce439..41fc480d 100755 --- a/os/windows/posix.c +++ b/os/windows/posix.c @@ -12,12 +12,15 @@ #include #include #include +#include #include #include #include #include #include #include +#include +#include #include "../os-windows.h" #include "../../lib/hweight.h" @@ -226,6 +229,30 @@ char *dlerror(void) return dl_error; } +/* Copied from http://blogs.msdn.com/b/joshpoley/archive/2007/12/19/date-time-formats-and-conversions.aspx */ +void Time_tToSystemTime(time_t dosTime, SYSTEMTIME *systemTime) +{ + LARGE_INTEGER jan1970FT; + LARGE_INTEGER utcFT; + jan1970FT.QuadPart = 116444736000000000LL; // january 1st 1970 + utcFT.QuadPart = ((unsigned __int64)dosTime) * 10000000 + jan1970FT.QuadPart; + + FileTimeToSystemTime((FILETIME*)&utcFT, systemTime); +} + +char* ctime_r(const time_t *t, char *buf) +{ + SYSTEMTIME systime; + const char * const dayOfWeek[] = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" }; + const char * const monthOfYear[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + + Time_tToSystemTime(*t, &systime); + /* We don't know how long `buf` is, but assume it's rounded up from the minimum of 25 to 32 */ + StringCchPrintfA(buf, 32, "%s %s %d %02d:%02d:%02d %04d", dayOfWeek[systime.wDayOfWeek - 1], monthOfYear[systime.wMonth - 1], + systime.wDay, systime.wHour, systime.wMinute, systime.wSecond, systime.wYear); + return buf; +} + int gettimeofday(struct timeval *restrict tp, void *restrict tzp) { FILETIME fileTime; @@ -706,9 +733,22 @@ ssize_t readv(int fildes, const struct iovec *iov, int iovcnt) ssize_t writev(int fildes, const struct iovec *iov, int iovcnt) { - log_err("%s is not implemented\n", __func__); - errno = ENOSYS; - return -1; + int i; + DWORD bytes_written = 0; + for (i = 0; i < iovcnt; i++) + { + int len = send((SOCKET)fildes, iov[i].iov_base, iov[i].iov_len, 0); + if (len == SOCKET_ERROR) + { + DWORD err = GetLastError(); + errno = win_to_posix_error(err); + bytes_written = -1; + break; + } + bytes_written += len; + } + + return bytes_written; } long long strtoll(const char *restrict str, char **restrict endptr, @@ -750,7 +790,6 @@ int poll(struct pollfd fds[], nfds_t nfds, int timeout) FD_SET(fds[i].fd, &exceptfds); } - rc = select(nfds, &readfds, &writefds, &exceptfds, to); if (rc != SOCKET_ERROR) { @@ -770,7 +809,6 @@ int poll(struct pollfd fds[], nfds_t nfds, int timeout) fds[i].revents |= POLLHUP; } } - return rc; } @@ -872,6 +910,14 @@ uid_t geteuid(void) return -1; } +in_addr_t inet_network(const char *cp) +{ + in_addr_t hbo; + in_addr_t nbo = inet_addr(cp); + hbo = ((nbo & 0xFF) << 24) + ((nbo & 0xFF00) << 8) + ((nbo & 0xFF0000) >> 8) + ((nbo & 0xFF000000) >> 24); + return hbo; +} + const char* inet_ntop(int af, const void *restrict src, char *restrict dst, socklen_t size) {