2018-11-06 21:50:01 +01:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* pwrite.c
|
|
|
|
* Implementation of pwrite(2) for platforms that lack one.
|
|
|
|
*
|
2019-01-02 18:44:25 +01:00
|
|
|
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
2018-11-06 21:50:01 +01:00
|
|
|
*
|
|
|
|
* IDENTIFICATION
|
|
|
|
* src/port/pwrite.c
|
|
|
|
*
|
|
|
|
* Note that this implementation changes the current file position, unlike
|
2019-06-17 09:13:16 +02:00
|
|
|
* the POSIX function, so we use the name pg_pwrite().
|
2018-11-06 21:50:01 +01:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#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
|
|
|
|
}
|