diff --git a/stdlib/public/RuntimeModule/Win32Extras.cpp b/stdlib/public/RuntimeModule/Win32Extras.cpp index 3c45650d791b8..031c576a95fe3 100644 --- a/stdlib/public/RuntimeModule/Win32Extras.cpp +++ b/stdlib/public/RuntimeModule/Win32Extras.cpp @@ -17,19 +17,32 @@ #ifdef _WIN32 +#include "modules/OS/Libc.h" + +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX #include -#include "modules/OS/Libc.h" +#include +#include +#include -extern "C" ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset) { - HANDLE hFile = _get_osfhandle(fd); +namespace { +namespace runtime { +using ssize_t = std::make_signed::type; +} +} + +extern "C" runtime::ssize_t pread(int fd, void *buf, size_t nbyte, size_t offset) { + intptr_t hFile = _get_osfhandle(fd); OVERLAPPED ovl = {0}; DWORD dwBytesRead = 0; - ovl.Offset = (DWORD)offset; - ovl.OffsetHigh = (DWORD)(offset >> 32); + ovl.Offset = static_cast(offset & 0xffff); + ovl.OffsetHigh = static_cast(offset >> 32); - if (!ReadFile(hFile, buf, (DWORD)count, &dwBytesRead, &ovl)) { + if (!ReadFile(reinterpret_cast(hFile), buf, static_cast(nbyte), + &dwBytesRead, &ovl)) { errno = EIO; return -1; } @@ -37,15 +50,16 @@ extern "C" ssize_t pread(int fd, void *buf, size_t nbyte, off_t offset) { return dwBytesRead; } -extern "C" ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset) { - HANDLE hFile = _get_osfhandle(fd); +extern "C" runtime::ssize_t pwrite(int fd, const void *buf, size_t nbyte, size_t offset) { + intptr_t hFile = _get_osfhandle(fd); OVERLAPPED ovl = {0}; DWORD dwBytesRead = 0; - ovl.Offset = (DWORD)offset; - ovl.OffsetHigh = (DWORD)(offset >> 32); + ovl.Offset = static_cast(offset & 0xffff); + ovl.OffsetHigh = static_cast(offset >> 32); - if (!WriteFile(hFile, buf, (DWORD)count, &dwBytesRead, &ovl)) { + if (!WriteFile(reinterpret_cast(hFile), buf, static_cast(nbyte), + &dwBytesRead, &ovl)) { errno = EIO; return -1; } @@ -54,4 +68,3 @@ extern "C" ssize_t pwrite(int fd, const void *buf, size_t nbyte, off_t offset) { } #endif // _WIN32 - diff --git a/stdlib/public/RuntimeModule/modules/OS/Libc.h b/stdlib/public/RuntimeModule/modules/OS/Libc.h index 4c80af120c5d3..320fa41580e56 100644 --- a/stdlib/public/RuntimeModule/modules/OS/Libc.h +++ b/stdlib/public/RuntimeModule/modules/OS/Libc.h @@ -21,6 +21,9 @@ #include #include #include +#if defined(_WIN32) +#include +#endif // .. Swift affordances ........................................................ @@ -33,7 +36,14 @@ namespace backtrace { /* open() is usually declared as a variadic function; these don't import into Swift. */ static inline int _swift_open(const char *filename, int oflag, int mode) { +#if defined(_WIN32) + int fh; + if (_sopen_s(&fh, filename, oflag, _SH_DENYNO, mode)) + return -1; + return fh; +#else return open(filename, oflag, mode); +#endif } /* errno is typically not going to be easily accessible (it's often a macro),