blob: 4f7965e741d2e9877303b64280b73fd096e236ef [file] [log] [blame]
/**
* This file has no copyright assigned and is placed in the Public Domain.
* This file is part of the mingw-w64 runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
#include <errno.h>
#include <io.h>
#include <unistd.h>
#if defined(__i386__) || defined(__x86_64__)
#include <windows.h>
#include <msvcrt.h>
#endif
int __cdecl ftruncate64(int fd, _off64_t length)
{
errno_t error;
/* Function symbol _chsize_s is available since Windows Vista, so load it dynamically on x86 systems */
#if defined(__i386__) || defined(__x86_64__)
extern int __cdecl __mingw_ftruncate64(int fd, _off64_t length);
static errno_t (__cdecl *volatile chsize_s_ptr)(int, __int64);
static volatile long init = 0;
if (!init) {
HMODULE msvcrt = __mingw_get_msvcrt_handle();
FARPROC func = msvcrt ? GetProcAddress(msvcrt, "_chsize_s") : NULL;
(void)InterlockedExchangePointer((PVOID volatile *)&chsize_s_ptr, func);
(void)InterlockedExchange(&init, 1);
}
if (!chsize_s_ptr)
return __mingw_ftruncate64(fd, length);
#define _chsize_s chsize_s_ptr
#endif
/* msvcrt.dll's _chsize_s does not call invalid parameter exception handler, so it is not needed to validate input parameters */
error = _chsize_s(fd, length);
if (error) {
errno = error;
return -1;
}
return 0;
}