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