mirror of
https://github.com/postgres/postgres.git
synced 2025-08-18 12:22:09 +03:00
Provide pg_pread() and pg_pwrite() for random I/O.
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.com
This commit is contained in:
55
src/port/pread.c
Normal file
55
src/port/pread.c
Normal file
@@ -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
|
||||
}
|
Reference in New Issue
Block a user