mirror of https://github.com/postgres/postgres
Forward to POSIX pread() and pwrite(), or emulate them if unavailable. The emulation is not perfect as the file position is changed, so we'll put pg_ prefixes on the names to minimize the risk of confusion in future patches that might inadvertently try to mix pread() and read() on the same file descriptor. Author: Thomas Munro Reviewed-by: Tom Lane, Jesper Pedersen Discussion: https://postgr.es/m/CAEepm=02rapCpPR3ZGF2vW=SBHSdFYO_bz_f-wwWJonmA3APgw@mail.gmail.compull/34/head
parent
b43df566b3
commit
3fd2a7932e
@ -0,0 +1,55 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* pread.c |
||||
* Implementation of pread(2) for platforms that lack one. |
||||
* |
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group |
||||
* |
||||
* IDENTIFICATION |
||||
* src/port/pread.c |
||||
* |
||||
* Note that this implementation changes the current file position, unlike |
||||
* the POSIX function, so we use the name pg_pread(). |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
|
||||
|
||||
#include "postgres.h" |
||||
|
||||
#ifdef WIN32 |
||||
#include <windows.h> |
||||
#else |
||||
#include <unistd.h> |
||||
#endif |
||||
|
||||
ssize_t |
||||
pg_pread(int fd, void *buf, size_t size, off_t offset) |
||||
{ |
||||
#ifdef WIN32 |
||||
OVERLAPPED overlapped = {0}; |
||||
HANDLE handle; |
||||
DWORD result; |
||||
|
||||
handle = (HANDLE) _get_osfhandle(fd); |
||||
if (handle == INVALID_HANDLE_VALUE) |
||||
{ |
||||
errno = EBADF; |
||||
return -1; |
||||
} |
||||
|
||||
overlapped.Offset = offset; |
||||
if (!ReadFile(handle, buf, size, &result, &overlapped)) |
||||
{ |
||||
_dosmaperr(GetLastError()); |
||||
return -1; |
||||
} |
||||
|
||||
return result; |
||||
#else |
||||
if (lseek(fd, offset, SEEK_SET) < 0) |
||||
return -1; |
||||
|
||||
return read(fd, buf, size); |
||||
#endif |
||||
} |
||||
@ -0,0 +1,55 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* pwrite.c |
||||
* Implementation of pwrite(2) for platforms that lack one. |
||||
* |
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group |
||||
* |
||||
* IDENTIFICATION |
||||
* src/port/pwrite.c |
||||
* |
||||
* Note that this implementation changes the current file position, unlike |
||||
* the POSIX function, so we use the name pg_write(). |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
|
||||
|
||||
#include "postgres.h" |
||||
|
||||
#ifdef WIN32 |
||||
#include <windows.h> |
||||
#else |
||||
#include <unistd.h> |
||||
#endif |
||||
|
||||
ssize_t |
||||
pg_pwrite(int fd, const void *buf, size_t size, off_t offset) |
||||
{ |
||||
#ifdef WIN32 |
||||
OVERLAPPED overlapped = {0}; |
||||
HANDLE handle; |
||||
DWORD result; |
||||
|
||||
handle = (HANDLE) _get_osfhandle(fd); |
||||
if (handle == INVALID_HANDLE_VALUE) |
||||
{ |
||||
errno = EBADF; |
||||
return -1; |
||||
} |
||||
|
||||
overlapped.Offset = offset; |
||||
if (!WriteFile(handle, buf, size, &result, &overlapped)) |
||||
{ |
||||
_dosmaperr(GetLastError()); |
||||
return -1; |
||||
} |
||||
|
||||
return result; |
||||
#else |
||||
if (lseek(fd, offset, SEEK_SET) < 0) |
||||
return -1; |
||||
|
||||
return write(fd, buf, size); |
||||
#endif |
||||
} |
||||
Loading…
Reference in new issue