2018-11-06 21:50:01 +01:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
2022-08-04 23:42:31 +02:00
|
|
|
* win32pread.c
|
|
|
|
* Implementation of pread(2) for Windows.
|
2018-11-06 21:50:01 +01:00
|
|
|
*
|
2024-01-04 02:49:05 +01:00
|
|
|
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
2018-11-06 21:50:01 +01:00
|
|
|
*
|
|
|
|
* IDENTIFICATION
|
2022-08-04 23:42:31 +02:00
|
|
|
* src/port/win32pread.c
|
2018-11-06 21:50:01 +01:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2022-09-17 18:21:59 +02:00
|
|
|
#include "c.h"
|
2018-11-06 21:50:01 +01:00
|
|
|
|
|
|
|
#include <windows.h>
|
|
|
|
|
|
|
|
ssize_t
|
2022-09-29 02:12:11 +02:00
|
|
|
pg_pread(int fd, void *buf, size_t size, off_t offset)
|
2018-11-06 21:50:01 +01:00
|
|
|
{
|
|
|
|
OVERLAPPED overlapped = {0};
|
|
|
|
HANDLE handle;
|
|
|
|
DWORD result;
|
|
|
|
|
|
|
|
handle = (HANDLE) _get_osfhandle(fd);
|
|
|
|
if (handle == INVALID_HANDLE_VALUE)
|
|
|
|
{
|
|
|
|
errno = EBADF;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2024-03-02 20:40:41 +01:00
|
|
|
/* Avoid overflowing DWORD. */
|
|
|
|
size = Min(size, 1024 * 1024 * 1024);
|
|
|
|
|
2022-09-29 02:12:11 +02:00
|
|
|
/* Note that this changes the file position, despite not using it. */
|
2018-11-06 21:50:01 +01:00
|
|
|
overlapped.Offset = offset;
|
|
|
|
if (!ReadFile(handle, buf, size, &result, &overlapped))
|
|
|
|
{
|
2019-11-20 05:52:15 +01:00
|
|
|
if (GetLastError() == ERROR_HANDLE_EOF)
|
|
|
|
return 0;
|
|
|
|
|
2018-11-06 21:50:01 +01:00
|
|
|
_dosmaperr(GetLastError());
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|