deep-c-rsc/JCGO/native/jcgofile.c
2021-07-16 17:12:20 -05:00

2466 lines
62 KiB
C

/*
* @(#) $(JCGO)/native/jcgofile.c --
* a part of the JCGO native layer library (file I/O impl).
**
* Project: JCGO (http://www.ivmaisoft.com/jcgo/)
* Copyright (C) 2001-2013 Ivan Maidanski <ivmai@mail.ru>
* All rights reserved.
*/
/*
* Used control macros: JCGO_CLOCKGETTM, JCGO_ERRSTDOUT, JCGO_ERRTOLOG,
* JCGO_JNIUSCORE, JCGO_NOCWDIR, JCGO_NOFILES, JCGO_NOTIME, JCGO_NOUTIMBUF,
* JCGO_ONEROOTFS, JCGO_SYSDUALW, JCGO_SYSWCHAR, JCGO_UNIFSYS, JCGO_WIN32,
* JCGO_WINFILE, JCGO_WMAIN.
* Macros for tuning: STATIC, STATICDATA.
*/
/*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
**
* This software is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License (GPL) for more details.
**
* Linking this library statically or dynamically with other modules is
* making a combined work based on this library. Thus, the terms and
* conditions of the GNU General Public License cover the whole
* combination.
**
* As a special exception, the copyright holders of this library give you
* permission to link this library with independent modules to produce an
* executable, regardless of the license terms of these independent
* modules, and to copy and distribute the resulting executable under
* terms of your choice, provided that you also meet, for each linked
* independent module, the terms and conditions of the license of that
* module. An independent module is a module which is not derived from
* or based on this library. If you modify this library, you may extend
* this exception to your version of the library, but you are not
* obligated to do so. If you do not wish to do so, delete this
* exception statement from your version.
*/
#ifndef JCGO_BUILDING_JNU
#define JCGO_BUILDING_FILEAPI
#include "jcgojnu.h"
#endif
#ifdef JCGO_VER
#include "jcgofile.h"
#ifndef STATIC
#define STATIC static
#endif
#ifndef STATICDATA
#define STATICDATA STATIC
#endif
#define JCGO_ALIGNED_BUFSIZE(type) (sizeof(type) > sizeof(void *) ? sizeof(type) + (sizeof(void *) << 1) - 1 : (sizeof(type) << 1) - 1)
#define JCGO_ALIGNED_BUFPTR(type, buf) ((type *)(volatile void *)&(buf)[((sizeof(type) > sizeof(void *) ? sizeof(void *) << 1 : sizeof(type)) - 1) - (unsigned)((char *)(buf) - &((char *)NULL)[1]) % (sizeof(type) > sizeof(void *) ? sizeof(void *) << 1 : sizeof(type))])
#ifndef JCGO_NOTIME
#define JCGO_WINEPOCH_MILLIS ((LONGLONG)134774L * 24L * 60L * 60L * 1000L)
#ifdef JCGO_WIN32
#ifndef _WINBASE_NO_QUERYPERFORMANCECOUNTER
STATICDATA double jcgo_win32PerfTickNanos = 0;
STATICDATA int jcgo_win32UsePerfCounter = 0;
#endif
#endif
#endif
#ifdef JCGO_SYSWCHAR
#ifdef JCGO_SYSDUALW
#ifndef JCGO_USEWCHAR_VAREXPORT
#ifdef JNUBIGEXPORT
#define JCGO_USEWCHAR_VAREXPORT JNUBIGEXPORT
#else
#define JCGO_USEWCHAR_VAREXPORT JNIEXPORT
#endif
#endif
JCGO_USEWCHAR_VAREXPORT int jcgo_sysWCharOn = 0;
#ifndef JCGO_USEWCHAR_OSMAJORVERMIN
#ifdef JCGO_WIN32
#define JCGO_USEWCHAR_OSMAJORVERMIN 5 /* "Windows 2000" */
#endif
#endif
#ifdef JCGO_USEWCHAR_OSMAJORVERMIN
#ifndef JCGO_JNIUSCORE
#define _Java_gnu_classpath_VMSystemProperties_getOsVerMajorMinor0 Java_gnu_classpath_VMSystemProperties_getOsVerMajorMinor0
#endif
#ifdef JCGO_BUILDING_JNU
#ifndef JCGO_NATCLASS_gnu_classpath_VMSystemProperties
#undef JCGO_USEWCHAR_OSMAJORVERMIN
#endif
#else
#ifndef NOJAVA_gnu_classpath_VMSystemProperties_getOsVerMajorMinor0
JNIIMPORT jint JNICALL
_Java_gnu_classpath_VMSystemProperties_getOsVerMajorMinor0( JNIEnv *pJniEnv,
jclass This, jint isMinor );
#endif
#endif
#endif
#endif /* JCGO_SYSDUALW */
#endif /* JCGO_SYSWCHAR */
#ifdef JCGO_ERRTOLOG
STATICDATA int jcgo_outLogFD = 0;
STATICDATA int jcgo_errLogFD = 0;
#ifndef JCGO_NOFILES
#ifndef JCGO_WINFILE
#define JCGO_OPENLOG_MODE (JCGO_OPEN_BASEMODE | O_WRONLY | O_TRUNC)
#endif
STATIC int jcgo_initFileEnvLog( void )
{
#ifndef _STDLIB_NO_GETENV
char *cstr = getenv("STDERROUT_LOGFILE");
#ifdef JCGO_WINFILE
#ifdef JCGO_SYSWCHAR
wchar_t wbuf[JCGO_PATH_MAXSIZE];
#endif
#endif
if (cstr != NULL && *cstr)
{
#ifdef JCGO_WINFILE
return (int)JCGO_WINF_HANDLETONUM(JCGO_JNUTCHAR_E(CreateFileA(cstr,
GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL), (unsigned)mbstowcs(wbuf, cstr,
JCGO_PATH_MAXSIZE) < (unsigned)JCGO_PATH_MAXSIZE ? CreateFileW(wbuf,
GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL) : INVALID_HANDLE_VALUE));
#else
return open(cstr, JCGO_OPENLOG_MODE | O_CREAT, JCGO_PERM_OPEN);
#endif
}
#endif
return -1;
}
STATIC int jcgo_initFileLogA( int redirect, CONST char *argv0 )
{
unsigned i;
unsigned len;
#ifdef JCGO_WINFILE
#ifdef JCGO_SYSWCHAR
wchar_t wbuf[JCGO_PATH_MAXSIZE];
#endif
#endif
char cbuf[JCGO_PATH_MAXSIZE];
if ((jcgo_errLogFD = jcgo_initFileEnvLog()) == -1 && argv0 != NULL)
{
len = 0;
while ((cbuf[len] = argv0[len]) != '\0')
if (++len >= sizeof(cbuf))
break;
if (len - (unsigned)1 < sizeof(cbuf) - 1)
{
i = len;
#ifdef JCGO_UNIFSYS
cbuf[len] = '.';
#else
do
{
if (!(--i) || cbuf[i - 1] == JCGO_FILE_CSEP)
{
i = len;
cbuf[len] = '.';
break;
}
} while (cbuf[i] != '.');
#endif
if (i < sizeof(cbuf) - 4)
{
cbuf[i + 1] = 'l';
cbuf[i + 2] = 'o';
cbuf[i + 3] = 'g';
cbuf[i + 4] = '\0';
#ifdef JCGO_WINFILE
jcgo_errLogFD = (int)JCGO_WINF_HANDLETONUM(JCGO_JNUTCHAR_E(CreateFileA(
cbuf, GENERIC_WRITE, FILE_SHARE_READ, NULL,
(redirect & 0x4) != 0 ? CREATE_ALWAYS :
TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL),
(unsigned)mbstowcs(wbuf, cbuf, JCGO_PATH_MAXSIZE) <
(unsigned)JCGO_PATH_MAXSIZE ? CreateFileW(wbuf,
GENERIC_WRITE, FILE_SHARE_READ, NULL,
(redirect & 0x4) != 0 ? CREATE_ALWAYS :
TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) :
INVALID_HANDLE_VALUE));
#else
jcgo_errLogFD = open(cbuf, (redirect & 0x4) != 0 ? JCGO_OPENLOG_MODE |
O_CREAT : JCGO_OPENLOG_MODE, JCGO_PERM_OPEN);
#endif
}
}
}
(void)JCGO_FD_SETCLOEXEC(jcgo_errLogFD);
if (jcgo_errLogFD == -1)
return -1;
jcgo_outLogFD = jcgo_errLogFD;
if ((redirect & 0x2) == 0)
{
jcgo_outLogFD = JCGO_FD_OUTFD;
#ifndef JCGO_WINFILE
#ifndef JCGO_UNIFSYS
setmode(JCGO_FD_OUTFD, O_BINARY);
#endif
#endif
}
return 0;
}
#ifdef JCGO_WMAIN
STATIC int jcgo_initFileLogW( int redirect, CONST wchar_t *wargv0 )
{
unsigned i;
unsigned len;
wchar_t wbuf[JCGO_PATH_MAXSIZE];
if ((jcgo_errLogFD = jcgo_initFileEnvLog()) == -1 && wargv0 != NULL)
{
len = 0;
while ((wbuf[len] = wargv0[len]) != (wchar_t)0)
if (++len >= sizeof(wbuf) / sizeof(wchar_t))
break;
if (len - (unsigned)1 < sizeof(wbuf) / sizeof(wchar_t) - 1)
{
i = len;
#ifdef JCGO_UNIFSYS
wbuf[len] = (wchar_t)0x2e; /*'.'*/
#else
do
{
if (!(--i) || wbuf[i - 1] == (wchar_t)JCGO_FILE_WSEP)
{
i = len;
wbuf[len] = (wchar_t)0x2e; /*'.'*/
break;
}
} while (wbuf[i] != (wchar_t)0x2e); /*'.'*/
#endif
if (i < sizeof(wbuf) / sizeof(wchar_t) - 4)
{
wbuf[i + 1] = (wchar_t)0x6c; /*'l'*/
wbuf[i + 2] = (wchar_t)0x6f; /*'o'*/
wbuf[i + 3] = (wchar_t)0x67; /*'g'*/
wbuf[i + 4] = (wchar_t)0;
#ifdef JCGO_WINFILE
jcgo_errLogFD = (int)JCGO_WINF_HANDLETONUM(CreateFileW(wbuf,
GENERIC_WRITE, FILE_SHARE_READ, NULL,
(redirect & 0x4) != 0 ? CREATE_ALWAYS :
TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL));
#else
jcgo_errLogFD = _wopen(wbuf, (redirect & 0x4) != 0 ? JCGO_OPENLOG_MODE |
O_CREAT : JCGO_OPENLOG_MODE, JCGO_PERM_OPEN);
#endif
}
}
}
(void)JCGO_FD_SETCLOEXEC(jcgo_errLogFD);
if (jcgo_errLogFD == -1)
return -1;
jcgo_outLogFD = jcgo_errLogFD;
if ((redirect & 0x2) == 0)
{
jcgo_outLogFD = JCGO_FD_OUTFD;
#ifndef JCGO_WINFILE
#ifndef JCGO_UNIFSYS
setmode(JCGO_FD_OUTFD, O_BINARY);
#endif
#endif
}
return 0;
}
#endif /* JCGO_WMAIN */
#endif /* ! JCGO_NOFILES */
#endif /* JCGO_ERRTOLOG */
STATIC void jcgo_initFileIO( void )
{
#ifndef JCGO_NOTIME
#ifdef JCGO_WIN32
#ifndef _WINBASE_NO_QUERYPERFORMANCECOUNTER
LARGE_INTEGER timerFreq;
#endif
#endif
#endif
#ifdef JCGO_SYSWCHAR
#ifdef JCGO_SYSDUALW
#ifndef _STDLIB_NO_GETENV
char *cstr;
#endif
#endif
#endif
#ifndef JCGO_UNIFSYS
#ifndef JCGO_WINFILE
#ifdef O_TEXT
setmode(JCGO_FD_INFD, O_TEXT);
#endif
#ifndef JCGO_ERRTOLOG
setmode(JCGO_FD_OUTFD, O_BINARY);
#ifndef JCGO_ERRSTDOUT
setmode(JCGO_FD_ERRFD, O_BINARY);
#endif
#endif
#endif
#endif
#ifdef LC_CTYPE
setlocale(LC_CTYPE, "");
#endif
#ifndef JCGO_NOTIME
#ifndef JCGO_WINFILE
#ifndef _TIME_NO_TZSET
tzset();
#endif
#endif
#ifdef JCGO_WIN32
#ifndef _WINBASE_NO_QUERYPERFORMANCECOUNTER
if (QueryPerformanceFrequency(&timerFreq) && timerFreq.QuadPart > 1L &&
timerFreq.QuadPart <= (LONGLONG)1000L * 1000L * 1000L)
{
jcgo_win32PerfTickNanos = 1.0e9 / (double)timerFreq.QuadPart;
jcgo_win32UsePerfCounter = 1;
}
#endif
#endif
#endif
#ifdef JCGO_SYSWCHAR
#ifdef JCGO_SYSDUALW
jcgo_sysWCharOn = 0;
#ifndef _STDLIB_NO_GETENV
if ((cstr = getenv("USE_UNICODE_API")) != NULL && *cstr)
{
if (*cstr != '0' || *(cstr + 1))
jcgo_sysWCharOn = 1;
}
else
#endif
{
#ifdef JCGO_USEWCHAR_OSMAJORVERMIN
#ifndef NOJAVA_gnu_classpath_VMSystemProperties_getOsVerMajorMinor0
if ((int)_Java_gnu_classpath_VMSystemProperties_getOsVerMajorMinor0(
NULL, NULL, 0) >= JCGO_USEWCHAR_OSMAJORVERMIN)
jcgo_sysWCharOn = 1;
#endif
#endif
}
#endif
#endif
}
JCGO_JNI_EXPF(void,
jcgo_JavaWriteLnToStderr)( CONST char *cstr, CONST char *cstr2 )
{
#ifdef JCGO_ERRTOLOG
int fd = jcgo_errLogFD;
#else
#ifdef JCGO_ERRSTDOUT
int fd = JCGO_FD_OUTFD;
#else
int fd = JCGO_FD_ERRFD;
#endif
#endif
unsigned len = 0;
#ifdef JCGO_WINFILE
HANDLE handle = JCGO_WINF_NUMTOHANDLE(fd);
DWORD nBytesWritten;
#else
int errcode;
#endif
while (*(cstr + len))
len++;
if (!len ||
#ifdef JCGO_WINFILE
WriteFile(handle, cstr, (DWORD)len, &nBytesWritten, NULL)
#else
JCGO_FD_WRITE(fd, (void *)cstr, len, &errcode) >= 0
#endif
)
{
len = 0;
while (*(cstr2 + len))
len++;
#ifdef JCGO_WINFILE
if (!len || WriteFile(handle, cstr2, (DWORD)len, &nBytesWritten, NULL))
(void)WriteFile(handle, (void *)JCGO_NEW_LINE, sizeof(JCGO_NEW_LINE) - 1,
&nBytesWritten, NULL);
#else
if (!len || JCGO_FD_WRITE(fd, (void *)cstr2, len, &errcode) >= 0)
(void)JCGO_FD_WRITE(fd, (void *)JCGO_NEW_LINE, sizeof(JCGO_NEW_LINE) - 1,
&errcode);
#endif
}
}
JCGO_JNI_EXPF(char **,
jcgo_JavaInitInOutA)( char **argv, jint redirect )
{
JCGO_ARGV_WILDCARDSTMT(&argv);
jcgo_initFileIO();
#ifdef JCGO_ERRTOLOG
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(redirect);
#else
if (((int)redirect & 0x1) != 0 &&
!jcgo_initFileLogA((int)redirect, argv != NULL ? argv[0] : NULL))
return argv;
#endif
jcgo_outLogFD = JCGO_FD_OUTFD;
jcgo_errLogFD = JCGO_FD_ERRFD;
#ifndef JCGO_WINFILE
#ifndef JCGO_UNIFSYS
setmode(JCGO_FD_OUTFD, O_BINARY);
setmode(JCGO_FD_ERRFD, O_BINARY);
#endif
#endif
#else
JCGO_UNUSED_VAR(redirect);
#endif
return argv;
}
JCGO_JNI_EXPF(jstring,
jcgo_JavaConvertCmdArgA)( JNIEnv *pJniEnv, CONST char *cstr )
{
return jcgo_JnuNewStringPlatform(pJniEnv, cstr);
}
#ifdef JCGO_WMAIN
JCGO_JNI_EXPF(wchar_t **,
jcgo_JavaInitInOutW)( wchar_t **wargv, jint redirect )
{
JCGO_ARGV_WWILDCARDSTMT(&wargv);
jcgo_initFileIO();
#ifdef JCGO_ERRTOLOG
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(redirect);
#else
if (((int)redirect & 0x1) != 0 &&
!jcgo_initFileLogW((int)redirect, wargv != NULL ? wargv[0] : NULL))
return wargv;
#endif
jcgo_outLogFD = JCGO_FD_OUTFD;
jcgo_errLogFD = JCGO_FD_ERRFD;
#ifndef JCGO_WINFILE
#ifndef JCGO_UNIFSYS
setmode(JCGO_FD_OUTFD, O_BINARY);
setmode(JCGO_FD_ERRFD, O_BINARY);
#endif
#endif
#else
JCGO_UNUSED_VAR(redirect);
#endif
return wargv;
}
JCGO_JNI_EXPF(jstring,
jcgo_JavaConvertCmdArgW)( JNIEnv *pJniEnv, CONST wchar_t *wstr )
{
return jcgo_JnuNewStringWide(pJniEnv, wstr);
}
#endif /* JCGO_WMAIN */
#ifdef JCGO_WINFILE
int jcgo_winFileErrnoGet(void)
{
DWORD error = GetLastError();
switch (error)
{
case 0:
return 0;
case ERROR_NOT_READY:
return EAGAIN;
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_TARGET_HANDLE:
return EBADF;
case ERROR_BUSY:
case ERROR_BUSY_DRIVE:
case ERROR_NO_PROC_SLOTS:
case ERROR_PATH_BUSY:
case ERROR_PIPE_BUSY:
return EBUSY;
case ERROR_ALREADY_ASSIGNED:
case ERROR_ALREADY_EXISTS:
case ERROR_FILE_EXISTS:
return EEXIST;
case ERROR_INSUFFICIENT_BUFFER:
case ERROR_INVALID_DATA:
case ERROR_INVALID_FUNCTION:
case ERROR_INVALID_PARAMETER:
return EINVAL;
case ERROR_NO_MORE_SEARCH_HANDLES:
case ERROR_TOO_MANY_OPEN_FILES:
return EMFILE;
case ERROR_BAD_PATHNAME:
case ERROR_BUFFER_OVERFLOW:
case ERROR_FILENAME_EXCED_RANGE:
case ERROR_FILE_NOT_FOUND:
case ERROR_INVALID_DRIVE:
case ERROR_INVALID_NAME:
case ERROR_OPEN_FAILED:
case ERROR_PATH_NOT_FOUND:
return ENOENT;
case ERROR_BAD_FORMAT:
case ERROR_BAD_LENGTH:
case ERROR_CHILD_NOT_COMPLETE:
case ERROR_EXE_MACHINE_TYPE_MISMATCH:
case ERROR_TOO_MANY_MODULES:
return ENOEXEC;
case ERROR_NOT_ENOUGH_MEMORY:
case ERROR_OUTOFMEMORY:
case ERROR_OUT_OF_STRUCTURES:
return ENOMEM;
case ERROR_DISK_FULL:
case ERROR_HANDLE_DISK_FULL:
return ENOSPC;
case ERROR_BAD_PIPE:
case ERROR_BROKEN_PIPE:
case ERROR_NO_DATA:
case ERROR_PIPE_NOT_CONNECTED:
return EPIPE;
case ERROR_WRITE_PROTECT:
return EROFS;
case ERROR_NEGATIVE_SEEK:
case ERROR_SEEK_ON_DEVICE:
return ESPIPE;
}
return error == ERROR_DIRECTORY ? ENOTDIR :
error >= ERROR_INVALID_STARTING_CODESEG &&
error <= ERROR_INFLOOP_IN_RELOC_CHAIN ? ENOEXEC : EACCES;
}
#endif /* JCGO_WINFILE */
#ifndef JCGO_EXCLUDE_VMCHANNEL
#ifndef JCGO_NOFILES
#define JCGO_FCHMODE_READ 0x1
#define JCGO_FCHMODE_WRITE 0x2
#define JCGO_FCHMODE_APPEND 0x4
#define JCGO_FCHMODE_EXCL 0x8
#define JCGO_FCHMODE_SYNC 0x10
#define JCGO_FCHMODE_DSYNC 0x20
#ifndef JCGO_WINFILE
STATIC jlong jcgo_lseek( int fd, jlong ofs, int whence, int *perrcode )
{
JCGO_BIGFLSEEK_T pos = (JCGO_BIGFLSEEK_T)ofs;
if (sizeof(pos) < sizeof(jlong) && whence == SEEK_SET &&
(ofs & ~(((jlong)2L << (sizeof(pos) < sizeof(jlong) ?
(int)sizeof(pos) * 8 - 1 : 0)) - (jlong)1L)) != (jlong)0L)
pos = (JCGO_BIGFLSEEK_T)-1;
JCGO_BIGF_VLSEEK(fd, &pos, whence);
ofs = (jlong)-1L;
pos = (JCGO_BIGFLSEEK_T)(pos + 1);
if (pos)
{
ofs = (jlong)(pos - 1);
if (sizeof(pos) < sizeof(jlong) && ofs < (jlong)0L)
ofs = ((jlong)2L << (sizeof(pos) < sizeof(jlong) ?
(int)sizeof(pos) * 8 - 1 : 0)) + ofs;
}
else *perrcode = errno;
return ofs;
}
STATIC int jcgo_ftruncate( int fd, int *perrcode )
{
#ifdef JCGO_FD_SETENDOFFILE
return JCGO_FD_SETENDOFFILE(fd, perrcode);
#else
JCGO_BIGFTRUNC_T ofs;
JCGO_BIGFLSEEK_T pos = 0;
JCGO_BIGF_VLSEEK(fd, &pos, SEEK_CUR);
pos = (JCGO_BIGFLSEEK_T)(pos + 1);
if (pos)
{
ofs = (JCGO_BIGFTRUNC_T)(pos - 1);
if ((JCGO_BIGFLSEEK_T)ofs + (JCGO_BIGFLSEEK_T)1 != pos)
ofs = (JCGO_BIGFTRUNC_T)-1;
if (!JCGO_BIGF_TRUNC(fd, ofs))
return 0;
}
*perrcode = errno;
return -1;
#endif
}
#endif /* ! JCGO_WINFILE */
#endif /* ! JCGO_NOFILES */
#ifndef NOJAVA_gnu_java_nio_VMChannel_getStdinFD0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_getStdinFD0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
return JCGO_FD_INFD;
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_getStdoutFD0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_getStdoutFD0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
#ifdef JCGO_ERRTOLOG
return jcgo_outLogFD;
#else
return JCGO_FD_OUTFD;
#endif
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_getStderrFD0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_getStderrFD0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
#ifdef JCGO_ERRTOLOG
return jcgo_errLogFD;
#else
#ifdef JCGO_ERRSTDOUT
return JCGO_FD_OUTFD;
#else
return JCGO_FD_ERRFD;
#endif
#endif
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_isIOErrorFileExists0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_isIOErrorFileExists0)( JNIEnv *pJniEnv,
jclass This, jint res )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
return (int)res == -EEXIST ? 1 : 0;
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_isIOErrorNoResources0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_isIOErrorNoResources0)( JNIEnv *pJniEnv,
jclass This, jint res )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
return (int)res == -EAGAIN || (int)res == -EMFILE || (int)res == -ENFILE ||
(int)res == -ENOMEM ? 1 : 0;
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_isIOErrorInterrupted0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_isIOErrorInterrupted0)( JNIEnv *pJniEnv,
jclass This, jint res )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
return (int)res == -EINTR || (int)res == -EAGAIN ? 1 : 0;
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_getIOErrorMsg0
JCGO_JNI_EXPF(jstring,
Java_gnu_java_nio_VMChannel_getIOErrorMsg0)( JNIEnv *pJniEnv, jclass This,
jint res )
{
#ifdef JCGO_WINFILE
char *cstr = NULL;
switch (-(int)res)
{
case EACCES:
cstr = "Permission denied";
break;
case EAGAIN:
cstr = "No more processes";
break;
case EBADF:
cstr = "Bad file number";
break;
case EBUSY:
cstr = "Device or resource busy";
break;
case EEXIST:
cstr = "File exists";
break;
case EINVAL:
cstr = "Invalid argument";
break;
case EMFILE:
cstr = "Too many open files";
break;
case ENOENT:
cstr = "No such file or directory";
break;
case ENOEXEC:
cstr = "Exec format error";
break;
case ENOMEM:
cstr = "Not enough space";
break;
case ENOSPC:
cstr = "No space left on device";
break;
case ENOTDIR:
cstr = "Not a directory";
break;
case EPIPE:
cstr = "Broken pipe";
break;
case EROFS:
cstr = "Read-only file system";
break;
case ESPIPE:
cstr = "Illegal seek";
break;
}
#else
char *cstr = strerror(-(int)res);
#endif
JCGO_UNUSED_VAR(This);
return jcgo_JnuNewStringPlatform(pJniEnv, cstr != NULL ? cstr : "");
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_fileOpen0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_fileOpen0)( JNIEnv *pJniEnv, jclass This,
jintArray fdArr, jstring path, jint mode )
{
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(fdArr);
JCGO_UNUSED_VAR(path);
JCGO_UNUSED_VAR(mode);
return -ENOENT;
#else
#ifdef JCGO_WINFILE
DWORD dwDesiredAccess;
DWORD dwShareMode;
DWORD dwCreationDisposition;
DWORD dwFlagsAndAttributes;
HANDLE handle;
LONG distanceToMoveHigh = 0;
#else
int flags;
int accperm;
int fd;
#endif
int errcode = ENOENT;
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
JCGO_UNUSED_VAR(This);
if (JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
dwCreationDisposition = OPEN_ALWAYS;
dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL;
if (((int)mode & (JCGO_FCHMODE_READ | JCGO_FCHMODE_WRITE)) ==
(JCGO_FCHMODE_READ | JCGO_FCHMODE_WRITE))
{
dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
if (((int)mode & JCGO_FCHMODE_EXCL) != 0)
dwCreationDisposition = CREATE_NEW;
dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS;
}
else
{
if (((int)mode & JCGO_FCHMODE_READ) != 0)
{
dwDesiredAccess = GENERIC_READ;
dwCreationDisposition = OPEN_EXISTING;
}
else
{
dwDesiredAccess = GENERIC_WRITE;
if (((int)mode & JCGO_FCHMODE_EXCL) != 0)
dwCreationDisposition = CREATE_NEW;
else if (((int)mode & JCGO_FCHMODE_APPEND) == 0)
dwCreationDisposition = CREATE_ALWAYS;
}
}
if (((int)mode & (JCGO_FCHMODE_SYNC | JCGO_FCHMODE_DSYNC)) != 0 &&
(dwDesiredAccess & GENERIC_WRITE) != 0)
dwFlagsAndAttributes |= FILE_FLAG_WRITE_THROUGH;
handle = JCGO_JNUTCHAR_E(CreateFileA(JCGO_JNUTCHAR_C(tbuf), dwDesiredAccess,
dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes,
NULL), CreateFileW(tbuf, dwDesiredAccess, dwShareMode, NULL,
dwCreationDisposition, dwFlagsAndAttributes, NULL));
if (handle != INVALID_HANDLE_VALUE)
{
if (((int)mode & JCGO_FCHMODE_APPEND) != 0)
(void)SetFilePointer(handle, 0, &distanceToMoveHigh, FILE_END);
}
else errcode = jcgo_winFileErrnoGet();
#else
flags = ((int)mode & (JCGO_FCHMODE_READ | JCGO_FCHMODE_WRITE)) ==
(JCGO_FCHMODE_READ | JCGO_FCHMODE_WRITE) ? JCGO_OPEN_BASEMODE |
O_CREAT | O_RDWR : ((int)mode & JCGO_FCHMODE_READ) != 0 ?
JCGO_OPEN_BASEMODE | O_RDONLY :
((int)mode & JCGO_FCHMODE_APPEND) != 0 ?
JCGO_OPEN_BASEMODE | O_CREAT | O_WRONLY | O_APPEND :
JCGO_OPEN_BASEMODE | O_CREAT | O_WRONLY | O_TRUNC;
accperm = JCGO_PERM_OPEN;
if (((int)mode & JCGO_FCHMODE_EXCL) != 0 && (flags & O_CREAT) != 0)
{
accperm = JCGO_PERM_TMPFILE;
flags |= O_EXCL;
}
if (((int)mode & JCGO_FCHMODE_SYNC) != 0)
flags |= O_SYNC;
if (((int)mode & JCGO_FCHMODE_DSYNC) != 0)
flags |= O_DSYNC;
if ((flags & (O_CREAT | O_APPEND)) != (O_CREAT | O_APPEND) ||
(fd = JCGO_FD_TOPEN(flags & ~O_CREAT, tbuf, 0, &errcode)) == -1)
fd = JCGO_FD_TOPEN(flags, tbuf, accperm, &errcode);
(void)JCGO_FD_SETCLOEXEC(fd);
#endif
JCGO_FILEIOCALL_END(pJniEnv)
#ifdef JCGO_WINFILE
jcgo_JnuSetIntArrayElement(pJniEnv, fdArr, 0,
(jint)JCGO_WINF_HANDLETONUM(handle));
if (handle != INVALID_HANDLE_VALUE)
return 0;
#else
jcgo_JnuSetIntArrayElement(pJniEnv, fdArr, 0, (jint)fd);
if (fd != -1)
return 0;
#endif
}
return (jint)(-errcode);
#endif
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_fileRead0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_fileRead0)( JNIEnv *pJniEnv, jclass This,
jbyteArray buffer, jint off, jint len, jint fd )
{
int res;
int errcode;
char *buf =
(char *)jcgo_JnuGetByteArrayElemsRegion(pJniEnv, buffer, off, len);
#ifdef JCGO_WINFILE
DWORD nBytesRead = 0;
if (fd == -2)
return 0;
#endif
JCGO_UNUSED_VAR(This);
if (buf == NULL)
return 0;
res = (int)(((unsigned)-1) >> 2) + 1;
errcode = ~(int)((volatile char *)buf - (volatile char *)NULL);
if ((jint)res >= len)
res = (int)len;
if ((unsigned)res > (unsigned)errcode)
res = errcode + 1;
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
if (ReadFile(JCGO_WINF_NUMTOHANDLE(fd), buf, (DWORD)res, &nBytesRead,
NULL) || nBytesRead)
res = (int)nBytesRead;
else
{
errcode = jcgo_winFileErrnoGet();
res = -1;
}
#else
res = JCGO_FD_READ((int)fd, buf, (unsigned)res, &errcode);
#endif
JCGO_FILEIOCALL_END(pJniEnv)
jcgo_JnuReleaseByteArrayElemsRegion(pJniEnv, buffer, (jbyte *)buf, off);
return (jint)(res >= 0 ? res : errcode != EPIPE ? -errcode : 0);
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_fileWrite0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_fileWrite0)( JNIEnv *pJniEnv, jclass This,
jbyteArray buffer, jint off, jint len, jint fd )
{
int res;
int errcode;
char *buf =
(char *)jcgo_JnuGetByteArrayElemsRegion(pJniEnv, buffer, off, len);
#ifdef JCGO_WINFILE
DWORD nBytesWritten;
if (fd == -2)
return len > 0 ? len : 0;
#endif
JCGO_UNUSED_VAR(This);
if (buf == NULL)
return 0;
res = (int)(((unsigned)-1) >> 2) + 1;
errcode = ~(int)((volatile char *)buf - (volatile char *)NULL);
if ((jint)res >= len)
res = (int)len;
if (len > 0)
{
if ((unsigned)res > (unsigned)errcode)
res = errcode + 1;
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
if (WriteFile(JCGO_WINF_NUMTOHANDLE(fd), buf, (DWORD)res, &nBytesWritten,
NULL))
res = (int)nBytesWritten;
else
{
errcode = jcgo_winFileErrnoGet();
res = -1;
}
#else
res = JCGO_FD_WRITE((int)fd, buf, (unsigned)res, &errcode);
#endif
JCGO_FILEIOCALL_END(pJniEnv)
if (res < 0 && errcode == ENOSPC)
res = 0;
}
#ifndef JCGO_NOFILES
else
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
res = 0;
if (!SetEndOfFile(JCGO_WINF_NUMTOHANDLE(fd)))
{
errcode = jcgo_winFileErrnoGet();
res = -1;
}
#else
res = jcgo_ftruncate((int)fd, &errcode);
#endif
JCGO_FILEIOCALL_END(pJniEnv)
}
#endif
jcgo_JnuReleaseByteArrayElemsRegion(pJniEnv, buffer, (jbyte *)buf, off);
return (jint)(res >= 0 ? res : -errcode);
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_fileAvailable0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_fileAvailable0)( JNIEnv *pJniEnv, jclass This,
jint fd )
{
#ifdef JCGO_FD_INAVAIL
JCGO_FDINAVAIL_T avail = 0;
int res;
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_FILEIOCALL_BEGIN(pJniEnv)
res = JCGO_FD_INAVAIL((int)fd, &avail);
if (res < 0 && (res = -errno) >= 0)
res = -EINVAL;
JCGO_FILEIOCALL_END(pJniEnv)
if (res >= 0 && (res = (int)avail) < 0)
res = (int)(((unsigned)-1) >> 1);
return (jint)res;
#else
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(fd);
return -EINVAL;
#endif
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_fileSelect0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_fileSelect0)( JNIEnv *pJniEnv, jclass This,
jint fd, jint iswrite )
{
int res = -EINVAL;
#ifdef JCGO_FD_SELECT
struct timeval tv;
fd_set fdsread;
if ((int)fd >= 0)
{
FD_ZERO(&fdsread);
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_SET((unsigned)fd, &fdsread);
JCGO_FILEIOCALL_BEGIN(pJniEnv)
res = JCGO_FD_SELECT((int)fd + 1, (int)iswrite ? NULL : &fdsread,
(int)iswrite ? &fdsread : NULL, NULL, &tv);
if (res < 0 && (res = -errno) >= 0)
res = -EINVAL;
JCGO_FILEIOCALL_END(pJniEnv)
}
#else
JCGO_UNUSED_VAR(fd);
JCGO_UNUSED_VAR(iswrite);
#endif
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
return (jint)res;
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_fileSeek0
JCGO_JNI_EXPF(jlong,
Java_gnu_java_nio_VMChannel_fileSeek0)( JNIEnv *pJniEnv, jclass This,
jlong ofs, jint fd, jint direction )
{
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(ofs);
JCGO_UNUSED_VAR(fd);
JCGO_UNUSED_VAR(direction);
return -ESPIPE;
#else
jlong pos;
#ifdef JCGO_WINFILE
LONG distanceToMoveHigh;
#else
int errcode = EINVAL;
#endif
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
distanceToMoveHigh = (LONG)(((LONGLONG)ofs) >> (sizeof(LONG) * 8));
if ((DWORD)(pos = SetFilePointer(JCGO_WINF_NUMTOHANDLE(fd), (LONG)ofs,
&distanceToMoveHigh, (int)direction > 0 ? FILE_BEGIN :
(int)direction < 0 ? FILE_END : FILE_CURRENT)) != (DWORD)-1L ||
GetLastError() == 0)
{
pos = (jlong)(((LONGLONG)distanceToMoveHigh << (sizeof(DWORD) * 8)) |
(DWORD)pos);
if (pos < (jlong)0L)
pos = (jlong)-EINVAL;
}
else pos = (jlong)-jcgo_winFileErrnoGet();
#else
pos = jcgo_lseek((int)fd, ofs, (int)direction > 0 ? SEEK_SET :
(int)direction < 0 ? SEEK_END : SEEK_CUR, &errcode);
if (pos < (jlong)0L)
pos = (jlong)-errcode;
#endif
JCGO_FILEIOCALL_END(pJniEnv)
return pos;
#endif
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_lockingOpHasPos0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_lockingOpHasPos0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
#ifdef JCGO_WINFILE
return 1;
#else
#ifdef JCGO_BIGFLOCK_T
#ifdef JCGO_BIGFLOCK_HASPOS
return 1;
#else
return 0;
#endif
#else
return 1;
#endif
#endif
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_fileLock0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_fileLock0)( JNIEnv *pJniEnv, jclass This,
jlong pos, jlong len, jint fd, jint sharedOrUnlock, jint doWait )
{
#ifdef JCGO_WINFILE
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(pos);
JCGO_UNUSED_VAR(len);
JCGO_UNUSED_VAR(fd);
JCGO_UNUSED_VAR(sharedOrUnlock);
JCGO_UNUSED_VAR(doWait);
return -EINVAL;
#else
#ifdef _WINBASE_NO_LOCKFILEEX
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(pos);
JCGO_UNUSED_VAR(len);
JCGO_UNUSED_VAR(fd);
JCGO_UNUSED_VAR(sharedOrUnlock);
JCGO_UNUSED_VAR(doWait);
return -EINVAL;
#else
OVERLAPPED overlapped;
int res = 0;
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
overlapped.Offset = (DWORD)pos;
overlapped.OffsetHigh = (DWORD)(((LONGLONG)pos) >> (sizeof(DWORD) * 8));
JCGO_FILEIOCALL_BEGIN(pJniEnv)
if (!((int)sharedOrUnlock >= 0 ? LockFileEx(JCGO_WINF_NUMTOHANDLE(fd),
((int)sharedOrUnlock ? 0 : LOCKFILE_EXCLUSIVE_LOCK) | ((int)doWait ? 0 :
LOCKFILE_FAIL_IMMEDIATELY), 0, (DWORD)len, (DWORD)(((LONGLONG)len) >>
(sizeof(DWORD) * 8)), &overlapped) :
UnlockFileEx(JCGO_WINF_NUMTOHANDLE(fd), 0, (DWORD)len,
(DWORD)(((LONGLONG)len) >> (sizeof(DWORD) * 8)), &overlapped)))
res = -jcgo_winFileErrnoGet();
JCGO_FILEIOCALL_END(pJniEnv)
return (jint)res;
#endif
#endif
#else
#ifdef JCGO_BIGFLOCK_T
int res;
JCGO_BIGFLOCK_T fl;
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
#ifdef JCGO_BIGFLOCK_HASPOS
if (pos - (jlong)1L >= (jlong)(~((JCGO_BIGFLKOFF_T)1L <<
((int)sizeof(JCGO_BIGFLKOFF_T) * 8 - 1))))
return -EINVAL;
#endif
if (len >= (jlong)(~((JCGO_BIGFLKOFF_T)1L <<
((int)sizeof(JCGO_BIGFLKOFF_T) * 8 - 1))))
len = (jlong)(~((JCGO_BIGFLKOFF_T)1L <<
((int)sizeof(JCGO_BIGFLKOFF_T) * 8 - 1)));
JCGO_FILEIOCALL_BEGIN(pJniEnv)
res = JCGO_BIGF_LOCK(&fl, (int)fd, (JCGO_BIGFLKOFF_T)pos,
(JCGO_BIGFLKOFF_T)len, (int)sharedOrUnlock < 0, (int)sharedOrUnlock,
(int)doWait);
if (res < 0 && (res = -errno) >= 0)
res = -EINVAL;
JCGO_FILEIOCALL_END(pJniEnv)
return (jint)res;
#else
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(pos);
JCGO_UNUSED_VAR(len);
JCGO_UNUSED_VAR(fd);
JCGO_UNUSED_VAR(sharedOrUnlock);
JCGO_UNUSED_VAR(doWait);
return -EINVAL;
#endif
#endif
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_fileFlush0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_fileFlush0)( JNIEnv *pJniEnv, jclass This,
jint fd, jint metadata )
{
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(fd);
JCGO_UNUSED_VAR(metadata);
return 0;
#else
int res;
int errcode = 0;
JCGO_FILEIOCALL_BEGIN(pJniEnv)
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(metadata);
#ifdef JCGO_WINFILE
res = 0;
if (!FlushFileBuffers(JCGO_WINF_NUMTOHANDLE(fd)))
{
errcode = jcgo_winFileErrnoGet();
res = -1;
}
#else
res = JCGO_FD_FSYNC((int)fd, &errcode);
#endif
JCGO_FILEIOCALL_END(pJniEnv)
return (jint)(res >= 0 ? res : -errcode);
#endif
}
#endif
#ifndef NOJAVA_gnu_java_nio_VMChannel_fileClose0
JCGO_JNI_EXPF(jint,
Java_gnu_java_nio_VMChannel_fileClose0)( JNIEnv *pJniEnv, jclass This,
jint fd )
{
int res;
int errcode = 0;
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
res = 0;
if (!CloseHandle(JCGO_WINF_NUMTOHANDLE(fd)))
{
errcode = jcgo_winFileErrnoGet();
res = -1;
}
#else
res = JCGO_FD_CLOSE((int)fd, &errcode);
#endif
JCGO_FILEIOCALL_END(pJniEnv)
return (jint)(res < 0 && errcode != EBADF ? -errcode : 0);
}
#endif
#endif /* ! JCGO_EXCLUDE_VMCHANNEL */
#ifndef JCGO_EXCLUDE_VMFILE
#ifndef NOJAVA_java_io_VMFile_length
JCGO_JNI_EXPF(jlong,
Java_java_io_VMFile_length)( JNIEnv *pJniEnv, jclass This, jstring path )
{
jlong filelen = (jlong)0L;
#ifndef JCGO_NOFILES
#ifdef JCGO_WINFILE
HANDLE handle;
#ifdef JCGO_SYSWCHAR
WIN32_FIND_DATAW finddata;
#else
WIN32_FIND_DATAA finddata;
#endif
#else
int res;
JCGO_BIGFSTAT_T st;
#endif
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
JCGO_UNUSED_VAR(This);
if (JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
handle = JCGO_JNUTCHAR_E(FindFirstFileA(JCGO_JNUTCHAR_C(tbuf),
JCGO_JNUTCHAR_R(WIN32_FIND_DATAA, &finddata)),
FindFirstFileW(tbuf, &finddata));
if (handle != INVALID_HANDLE_VALUE)
{
filelen = (jlong)(((LONGLONG)finddata.nFileSizeHigh <<
(sizeof(DWORD) * 8)) | finddata.nFileSizeLow);
FindClose(handle);
if (JCGO_JNUTCHAR_E(GetFileAttributesA(JCGO_JNUTCHAR_C(tbuf)),
GetFileAttributesW(tbuf)) == INVALID_FILE_ATTRIBUTES)
filelen = (jlong)0L;
}
#else
res = JCGO_BIGF_TSTAT(tbuf, &st);
if (!res && (st.st_mode & S_IFMT) == S_IFREG && (st.st_size + 1) != 0)
{
filelen = (jlong)st.st_size;
if (sizeof(st.st_size) < sizeof(jlong) && filelen < (jlong)0L)
filelen = ((jlong)2L << (sizeof(st.st_size) < sizeof(jlong) ?
(int)sizeof(st.st_size) * 8 - 1 : 0)) + filelen;
}
#endif
JCGO_FILEIOCALL_END(pJniEnv)
}
#else
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(path);
#endif
return filelen;
}
#endif
#ifndef NOJAVA_java_io_VMFile_currentTime0
JCGO_JNI_EXPF(jlong,
Java_java_io_VMFile_currentTime0)( JNIEnv *pJniEnv, jclass This, jint isNano )
{
#ifdef JCGO_NOTIME
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(isNano);
return (jlong)0L;
#else
#ifdef JCGO_WINFILE
SYSTEMTIME sysTime;
FILETIME fileTime;
#else
JCGO_CURTIME_T curt;
#endif
#ifdef JCGO_WIN32
#ifndef _WINBASE_NO_QUERYPERFORMANCECOUNTER
LARGE_INTEGER timeCounter;
if ((int)isNano && jcgo_win32UsePerfCounter &&
QueryPerformanceCounter(&timeCounter))
return (jlong)(timeCounter.QuadPart * jcgo_win32PerfTickNanos);
#endif
#endif
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
#ifdef JCGO_WINFILE
fileTime.dwLowDateTime = 0;
fileTime.dwHighDateTime = 0;
JCGO_FILEIOCALL_BEGIN(pJniEnv)
GetSystemTime(&sysTime);
(void)SystemTimeToFileTime(&sysTime, &fileTime);
JCGO_FILEIOCALL_END(pJniEnv)
return (int)isNano ? (jlong)(((LONGLONG)fileTime.dwHighDateTime <<
(sizeof(DWORD) * 8)) | fileTime.dwLowDateTime) * (jlong)100L :
(jlong)((((LONGLONG)fileTime.dwHighDateTime << (sizeof(DWORD) * 8)) |
fileTime.dwLowDateTime) / 10000L - JCGO_WINEPOCH_MILLIS);
#else
#ifdef JCGO_CLOCKGETTM
#ifdef _POSIX_MONOTONIC_CLOCK
if ((int)isNano)
{
struct timespec ts;
if (!clock_gettime(CLOCK_MONOTONIC, &ts))
return (jlong)ts.tv_sec * ((jlong)1000L * (jlong)1000L * (jlong)1000L) +
(jlong)ts.tv_nsec;
}
#endif
#endif
JCGO_FILEIOCALL_BEGIN(pJniEnv)
JCGO_CURTIME_GET(&curt);
JCGO_FILEIOCALL_END(pJniEnv)
if (!(int)isNano)
return JCGO_CURTIME_ASMILLIS(jlong, &curt);
return JCGO_CURTIME_ASNANOS(jlong, &curt);
#endif
#endif
}
#endif
#ifndef NOJAVA_java_io_VMFile_isCaseSensitive0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_isCaseSensitive0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
#ifdef JCGO_NOFILES
return 0;
#else
return (jint)JCGO_PATH_ISCASESENSITIVE;
#endif
}
#endif
#ifndef NOJAVA_java_io_VMFile_isLongNameSupported0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_isLongNameSupported0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
#ifdef JCGO_NOFILES
return 0;
#else
return (jint)JCGO_PATH_HASLONGNAMES;
#endif
}
#endif
#ifndef NOJAVA_java_io_VMFile_isUniRootFileSys0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_isUniRootFileSys0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
#ifdef JCGO_UNIFSYS
return 1;
#else
#ifdef JCGO_ONEROOTFS
return 1;
#else
return 0;
#endif
#endif
}
#endif
#ifndef NOJAVA_java_io_VMFile_isDotFileHidden0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_isDotFileHidden0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
#ifdef JCGO_UNIFSYS
return 1;
#else
return 0;
#endif
}
#endif
#ifndef NOJAVA_java_io_VMFile_getFilePathSepChar0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_getFilePathSepChar0)( JNIEnv *pJniEnv, jclass This,
jint isPath )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
return (jint)((int)isPath ? JCGO_PATH_WDELIM : JCGO_FILE_WSEP);
}
#endif
#ifndef NOJAVA_java_io_VMFile_getLineSeparator0
JCGO_JNI_EXPF(jstring,
Java_java_io_VMFile_getLineSeparator0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(This);
return jcgo_JnuNewStringPlatform(pJniEnv, JCGO_NEW_LINE);
}
#endif
#ifndef NOJAVA_java_io_VMFile_getDosUnixDrivePrefix0
JCGO_JNI_EXPF(jstring,
Java_java_io_VMFile_getDosUnixDrivePrefix0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(This);
return jcgo_JnuNewStringPlatform(pJniEnv, JCGO_DOSUNIX_DRIVEPREFIX);
}
#endif
#ifndef NOJAVA_java_io_VMFile_getLibNamePrefixSuffix0
JCGO_JNI_EXPF(jstring,
Java_java_io_VMFile_getLibNamePrefixSuffix0)( JNIEnv *pJniEnv, jclass This,
jint isSuffix )
{
JCGO_UNUSED_VAR(This);
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(isSuffix);
return jcgo_JnuNewStringPlatform(pJniEnv, "");
#else
return jcgo_JnuNewStringPlatform(pJniEnv, (int)isSuffix ?
JCGO_PATH_LIBSUFFIX : JCGO_PATH_LIBPREFIX);
#endif
}
#endif
#ifndef NOJAVA_java_io_VMFile_mapLibraryName0
JCGO_JNI_EXPF(jstring,
Java_java_io_VMFile_mapLibraryName0)( JNIEnv *pJniEnv, jclass This,
jstring libname )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
return libname;
}
#endif
#ifndef NOJAVA_java_io_VMFile_getenv0
JCGO_JNI_EXPF(jstring,
Java_java_io_VMFile_getenv0)( JNIEnv *pJniEnv, jclass This, jstring name )
{
#ifdef _STDLIB_NO_GETENV
JCGO_UNUSED_VAR(name);
#else
#ifdef _STDLIB_NO_WGETENV
char *cstr;
char cbuf[JCGO_GETENV_MAXNAMESIZE];
if (jcgo_JnuStringToPlatformChars(pJniEnv, name, cbuf, sizeof(cbuf)) <= 0)
return NULL;
JCGO_FILEIOCALL_BEGIN(pJniEnv)
cstr = getenv(cbuf);
JCGO_FILEIOCALL_END(pJniEnv)
if (cstr != NULL)
return jcgo_JnuNewStringPlatform(pJniEnv, cstr);
#else
JCGO_JNUTCHAR_T *tstr;
JCGO_JNUTCHAR_T tbuf[JCGO_GETENV_MAXNAMESIZE];
if (JCGO_JNU_TSTRINGTOCHARS(pJniEnv, name, tbuf) <= 0)
return NULL;
JCGO_FILEIOCALL_BEGIN(pJniEnv)
tstr = JCGO_JNUTCHAR_E(JCGO_JNUTCHAR_R(JCGO_JNUTCHAR_T,
getenv(JCGO_JNUTCHAR_C(tbuf))), _wgetenv(tbuf));
JCGO_FILEIOCALL_END(pJniEnv)
if (tstr != NULL)
return JCGO_JNU_TNEWSTRING(pJniEnv, tstr);
#endif
#endif
JCGO_UNUSED_VAR(This);
return jcgo_JnuNewStringPlatform(pJniEnv, "");
}
#endif
#ifndef NOJAVA_java_io_VMFile_rename0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_rename0)( JNIEnv *pJniEnv, jclass This, jstring path,
jstring destpath )
{
int res = -EACCES;
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(path);
JCGO_UNUSED_VAR(destpath);
#else
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
JCGO_JNUTCHAR_T tbuf2[JCGO_PATH_MAXSIZE];
if (JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf) > 0 &&
JCGO_JNU_TSTRINGTOCHARS(pJniEnv, destpath, tbuf2) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
res = JCGO_JNUTCHAR_E(MoveFileA(JCGO_JNUTCHAR_C(tbuf),
JCGO_JNUTCHAR_C(tbuf2)), MoveFileW(tbuf, tbuf2)) ? 0 :
-jcgo_winFileErrnoGet();
#else
res = JCGO_JNUTCHAR_E(rename(JCGO_JNUTCHAR_C(tbuf), JCGO_JNUTCHAR_C(tbuf2)),
_wrename(tbuf, tbuf2));
if (res < 0 && (res = -errno) >= 0)
res = -EACCES;
#endif
JCGO_FILEIOCALL_END(pJniEnv)
}
#endif
JCGO_UNUSED_VAR(This);
return (jint)res;
}
#endif
#ifndef NOJAVA_java_io_VMFile_delete0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_delete0)( JNIEnv *pJniEnv, jclass This, jstring path )
{
int res = -EACCES;
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(path);
#else
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
if (JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
res = JCGO_JNUTCHAR_E(DeleteFileA(JCGO_JNUTCHAR_C(tbuf)) ||
RemoveDirectoryA(JCGO_JNUTCHAR_C(tbuf)), DeleteFileW(tbuf) ||
RemoveDirectoryW(tbuf)) ? 0 : -jcgo_winFileErrnoGet();
#else
res = JCGO_PATH_TUNLINK(tbuf);
if (res < 0 && (res = -errno) >= 0)
res = -EACCES;
#endif
JCGO_FILEIOCALL_END(pJniEnv)
}
#endif
JCGO_UNUSED_VAR(This);
return (jint)res;
}
#endif
#ifndef NOJAVA_java_io_VMFile_mkdir0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_mkdir0)( JNIEnv *pJniEnv, jclass This, jstring path )
{
int res = -EACCES;
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(path);
#else
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
if (JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
res = JCGO_JNUTCHAR_E(CreateDirectoryA(JCGO_JNUTCHAR_C(tbuf), NULL),
CreateDirectoryW(tbuf, NULL)) ? 0 : -jcgo_winFileErrnoGet();
#else
res = JCGO_PATH_TMKDIR(tbuf);
if (res < 0 && (res = -errno) >= 0)
res = -EACCES;
#endif
JCGO_FILEIOCALL_END(pJniEnv)
}
#endif
JCGO_UNUSED_VAR(This);
return (jint)res;
}
#endif
#ifndef NOJAVA_java_io_VMFile_access0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_access0)( JNIEnv *pJniEnv, jclass This, jstring path,
jint chkRead, jint chkWrite, jint chkExec )
{
int res = -EACCES;
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(path);
JCGO_UNUSED_VAR(chkRead);
JCGO_UNUSED_VAR(chkWrite);
JCGO_UNUSED_VAR(chkExec);
#else
int mode;
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
if (JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
JCGO_UNUSED_VAR(chkRead);
JCGO_UNUSED_VAR(chkExec);
if ((mode = (int)JCGO_JNUTCHAR_E(GetFileAttributesA(JCGO_JNUTCHAR_C(tbuf)),
GetFileAttributesW(tbuf))) == (int)INVALID_FILE_ATTRIBUTES)
res = -jcgo_winFileErrnoGet();
else if (!(int)chkWrite || (mode & FILE_ATTRIBUTE_READONLY) == 0)
res = 0;
#else
mode = F_OK;
if (((int)chkRead | (int)chkWrite | (int)chkExec) != 0)
mode = ((int)chkRead ? R_OK : 0) | ((int)chkWrite ? W_OK : 0) |
((int)chkExec ? X_OK : 0);
res = JCGO_JNUTCHAR_E(access(JCGO_JNUTCHAR_C(tbuf), mode),
_waccess(tbuf, mode));
if (res < 0 && (res = -errno) >= 0)
res = -EACCES;
#endif
JCGO_FILEIOCALL_END(pJniEnv)
}
#endif
JCGO_UNUSED_VAR(This);
return (jint)res;
}
#endif
#ifndef NOJAVA_java_io_VMFile_isRegFileOrDir0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_isRegFileOrDir0)( JNIEnv *pJniEnv, jclass This,
jstring path )
{
int res = -EACCES;
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(path);
#else
#ifdef JCGO_WINFILE
DWORD attrs;
#else
struct stat st;
#endif
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
if (JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
attrs = JCGO_JNUTCHAR_E(GetFileAttributesA(JCGO_JNUTCHAR_C(tbuf)),
GetFileAttributesW(tbuf));
res = attrs != INVALID_FILE_ATTRIBUTES ?
((attrs & FILE_ATTRIBUTE_DIRECTORY) != 0 ? 2 : 1) :
-jcgo_winFileErrnoGet();
#else
if ((res = JCGO_JNUTCHAR_E(stat(JCGO_JNUTCHAR_C(tbuf), &st),
_wstat(tbuf, (void *)&st))) >= 0)
res = (st.st_mode & S_IFMT) == S_IFREG ? 1 :
(st.st_mode & S_IFMT) == S_IFDIR ? 2 : 0;
else if ((res = -errno) >= 0)
res = -EACCES;
#endif
JCGO_FILEIOCALL_END(pJniEnv)
}
#endif
JCGO_UNUSED_VAR(This);
return (jint)res;
}
#endif
#ifndef NOJAVA_java_io_VMFile_getLastModified0
JCGO_JNI_EXPF(jlong,
Java_java_io_VMFile_getLastModified0)( JNIEnv *pJniEnv, jclass This,
jstring path )
{
jlong mtime = (jlong)0L;
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(path);
#else
#ifdef JCGO_NOTIME
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(path);
#else
#ifdef JCGO_WINFILE
HANDLE handle;
#ifdef JCGO_SYSWCHAR
WIN32_FIND_DATAW finddata;
#else
WIN32_FIND_DATAA finddata;
#endif
#else
int res;
struct stat st;
#endif
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
if (JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
handle = JCGO_JNUTCHAR_E(FindFirstFileA(JCGO_JNUTCHAR_C(tbuf),
JCGO_JNUTCHAR_R(WIN32_FIND_DATAA, &finddata)),
FindFirstFileW(tbuf, &finddata));
if (handle != INVALID_HANDLE_VALUE)
{
mtime = (jlong)(((((LONGLONG)finddata.ftLastWriteTime.dwHighDateTime <<
(sizeof(DWORD) * 8)) | finddata.ftLastWriteTime.dwLowDateTime) /
10000L) - JCGO_WINEPOCH_MILLIS);
FindClose(handle);
if (JCGO_JNUTCHAR_E(GetFileAttributesA(JCGO_JNUTCHAR_C(tbuf)),
GetFileAttributesW(tbuf)) == INVALID_FILE_ATTRIBUTES)
mtime = (jlong)0L;
}
#else
res = JCGO_JNUTCHAR_E(stat(JCGO_JNUTCHAR_C(tbuf), &st),
_wstat(tbuf, (void *)&st));
if (!res && (st.st_mtime + 1) != 0 &&
((st.st_mode & S_IFMT) == S_IFREG || (st.st_mode & S_IFMT) == S_IFDIR))
mtime = (jlong)(unsigned long)st.st_mtime * (jlong)1000L;
#endif
JCGO_FILEIOCALL_END(pJniEnv)
}
#endif
#endif
JCGO_UNUSED_VAR(This);
return mtime;
}
#endif
#ifndef NOJAVA_java_io_VMFile_setLastModified0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_setLastModified0)( JNIEnv *pJniEnv, jclass This,
jlong mtime, jstring path )
{
int res = -EACCES;
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(mtime);
JCGO_UNUSED_VAR(path);
#else
#ifdef JCGO_NOTIME
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(mtime);
JCGO_UNUSED_VAR(path);
#else
#ifdef JCGO_WIN32
HANDLE handle;
LONGLONG wintime;
FILETIME fileTime;
#endif
#ifndef JCGO_WINFILE
#ifndef JCGO_NOUTIMBUF
jlong msectime;
struct utimbuf ut;
#endif
struct stat st;
#endif
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
if (JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifndef JCGO_WINFILE
res = JCGO_JNUTCHAR_E(stat(JCGO_JNUTCHAR_C(tbuf), &st),
_wstat(tbuf, (void *)&st));
if (res < 0)
{
if ((res = -errno) >= 0)
res = -EACCES;
}
else
#endif
{
#ifdef JCGO_NOUTIMBUF
JCGO_UNUSED_VAR(mtime);
#else
#ifndef JCGO_WINFILE
ut.modtime = (time_t)(msectime = mtime / (jlong)1000L);
ut.actime = st.st_atime;
if ((jlong)ut.modtime != msectime)
res = -EINVAL;
else if ((res = JCGO_JNUTCHAR_E(utime(JCGO_JNUTCHAR_C(tbuf), &ut),
_wutime(tbuf, (void *)&ut))) < 0)
#endif
#endif
{
#ifdef JCGO_WINFILE
JCGO_UNUSED_VAR(mtime);
#else
#ifndef JCGO_NOUTIMBUF
if ((res = -errno) >= 0)
res = -EACCES;
#ifdef JCGO_WIN32
else if (res == -EACCES && (st.st_mode & S_IFMT) == S_IFDIR)
#endif
#endif
#endif
{
#ifdef JCGO_WIN32
wintime = ((LONGLONG)mtime + JCGO_WINEPOCH_MILLIS) * 10000L;
fileTime.dwLowDateTime = (DWORD)wintime;
fileTime.dwHighDateTime = (DWORD)(wintime >> (sizeof(DWORD) * 8));
#ifdef JCGO_NOUTIMBUF
#ifndef JCGO_WINFILE
res = -EACCES;
#endif
#endif
if ((handle = JCGO_JNUTCHAR_E(CreateFileA(JCGO_JNUTCHAR_C(tbuf),
GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |
JCGO_WINFLAG_FILEBACKUPSEM, NULL), CreateFileW(tbuf,
GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |
JCGO_WINFLAG_FILEBACKUPSEM, NULL))) != INVALID_HANDLE_VALUE)
{
if (SetFileTime(handle, NULL, NULL, &fileTime))
res = 0;
#ifdef JCGO_WINFILE
else res = -jcgo_winFileErrnoGet();
#endif
CloseHandle(handle);
}
#ifdef JCGO_WINFILE
else res = -jcgo_winFileErrnoGet();
#endif
#endif
}
}
}
JCGO_FILEIOCALL_END(pJniEnv)
}
#endif
#endif
JCGO_UNUSED_VAR(This);
return (jint)res;
}
#endif
#ifndef NOJAVA_java_io_VMFile_setReadOnly0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_setReadOnly0)( JNIEnv *pJniEnv, jclass This,
jstring path )
{
int res = -EACCES;
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(path);
#else
#ifdef JCGO_WINFILE
DWORD attrs;
#else
struct stat st;
#endif
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
if (JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
#ifdef JCGO_WINFILE
res = JCGO_JNUTCHAR_E((attrs = GetFileAttributesA(JCGO_JNUTCHAR_C(tbuf))) !=
INVALID_FILE_ATTRIBUTES && SetFileAttributesA(JCGO_JNUTCHAR_C(tbuf),
attrs | FILE_ATTRIBUTE_READONLY),
(attrs = GetFileAttributesW(tbuf)) != INVALID_FILE_ATTRIBUTES &&
SetFileAttributesW(tbuf, attrs | FILE_ATTRIBUTE_READONLY)) ? 0 :
-jcgo_winFileErrnoGet();
#else
res = JCGO_JNUTCHAR_E(stat(JCGO_JNUTCHAR_C(tbuf), &st),
_wstat(tbuf, (void *)&st));
if (res >= 0 && (st.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)) != 0)
{
st.st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH);
res = JCGO_PATH_TCHMOD(tbuf, st.st_mode);
}
if (res < 0 && (res = -errno) >= 0)
res = -EACCES;
#endif
JCGO_FILEIOCALL_END(pJniEnv)
}
#endif
JCGO_UNUSED_VAR(This);
return (jint)res;
}
#endif
#ifndef NOJAVA_java_io_VMFile_isIOErrorNoEntity0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_isIOErrorNoEntity0)( JNIEnv *pJniEnv, jclass This,
jint res )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
return (int)res == -EACCES || (int)res == -ENOENT || (int)res == -ENOTDIR ?
1 : 0;
}
#endif
#ifndef NOJAVA_java_io_VMFile_realPath0
JCGO_JNI_EXPF(jstring,
Java_java_io_VMFile_realPath0)( JNIEnv *pJniEnv, jclass This, jstring path,
jintArray resArr )
{
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(path);
#else
#ifdef JCGO_PATH_TREALPATH
int res;
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
JCGO_JNUTCHAR_T tbuf2[JCGO_REALPATH_BUFLEN];
res = JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf);
if (res < 0)
return NULL;
if (res > 0)
{
tbuf2[0] = (JCGO_JNUTCHAR_T)0;
res = 0;
JCGO_FILEIOCALL_BEGIN(pJniEnv)
if (JCGO_PATH_TREALPATH(tbuf, tbuf2) == NULL && (res = -errno) >= 0)
res = -EACCES;
JCGO_FILEIOCALL_END(pJniEnv)
jcgo_JnuSetIntArrayElement(pJniEnv, resArr, 0, (jint)res);
return tbuf2[0] && res >= 0 ? JCGO_JNU_TNEWSTRING(pJniEnv, tbuf2) : path;
}
#else
JCGO_UNUSED_VAR(path);
#endif
#endif
JCGO_UNUSED_VAR(This);
jcgo_JnuSetIntArrayElement(pJniEnv, resArr, 0, 0);
return path;
}
#endif
#ifndef NOJAVA_java_io_VMFile_getDrivesMask0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_getDrivesMask0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
return -1;
}
#endif
#ifndef NOJAVA_java_io_VMFile_getVolumeRoot0
JCGO_JNI_EXPF(jstring,
Java_java_io_VMFile_getVolumeRoot0)( JNIEnv *pJniEnv, jclass This,
jint index )
{
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(index);
return jcgo_JnuNewStringPlatform(pJniEnv, "");
}
#endif
#ifndef NOJAVA_java_io_VMFile_checkVolumeRoot0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_checkVolumeRoot0)( JNIEnv *pJniEnv, jclass This,
jstring path )
{
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(path);
#else
#ifdef JCGO_PATHCHKVOLROOT_VIASTAT
int res;
struct stat st;
char cbuf[JCGO_PATH_MAXSIZE];
if (jcgo_JnuStringToPlatformChars(pJniEnv, path, cbuf, sizeof(cbuf)) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
res = stat(cbuf, &st);
if (res < 0 && (res = -errno) >= 0)
res = -ENOENT;
JCGO_FILEIOCALL_END(pJniEnv)
if (res == -EACCES || res == -EBUSY)
return 1;
if (res < 0)
return 0;
if ((st.st_mode & S_IFMT) == S_IFDIR)
return 1;
}
#else
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(path);
#endif
#endif
JCGO_UNUSED_VAR(This);
return -EACCES;
}
#endif
#ifndef NOJAVA_java_io_VMFile_getDriveCurDir0
JCGO_JNI_EXPF(jstring,
Java_java_io_VMFile_getDriveCurDir0)( JNIEnv *pJniEnv, jclass This,
jint drive )
{
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(drive);
return jcgo_JnuNewStringPlatform(pJniEnv, "");
#else
#ifdef JCGO_NOCWDIR
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(drive);
return jcgo_JnuNewStringPlatform(pJniEnv, "");
#else
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(drive);
tbuf[0] = (JCGO_JNUTCHAR_T)0;
JCGO_FILEIOCALL_BEGIN(pJniEnv)
if (JCGO_PATH_TGETDCWD((int)drive, tbuf,
sizeof(tbuf) / sizeof(JCGO_JNUTCHAR_T)) == NULL)
tbuf[0] = (JCGO_JNUTCHAR_T)0;
JCGO_FILEIOCALL_END(pJniEnv)
return JCGO_JNU_TNEWSTRING(pJniEnv, tbuf);
#endif
#endif
}
#endif
#ifndef NOJAVA_java_io_VMFile_getVolumeCurDir0
JCGO_JNI_EXPF(jstring,
Java_java_io_VMFile_getVolumeCurDir0)( JNIEnv *pJniEnv, jclass This,
jstring path )
{
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(path);
#else
#ifdef JCGO_NOCWDIR
JCGO_UNUSED_VAR(path);
#else
#ifdef JCGO_PATHGETDCWD_VIACHDIR
int res;
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
JCGO_JNUTCHAR_T tbuf2[JCGO_PATH_MAXSIZE];
res = JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf);
if (res < 0)
return NULL;
if (res > 0)
{
tbuf2[0] = (JCGO_JNUTCHAR_T)0;
JCGO_FILEIOCALL_BEGIN(pJniEnv)
if (JCGO_PATH_TGETCWD(tbuf2,
sizeof(tbuf2) / sizeof(JCGO_JNUTCHAR_T)) != NULL)
{
res = JCGO_PATH_TCHDIR(tbuf);
tbuf[0] = (JCGO_JNUTCHAR_T)0;
if (!res && JCGO_PATH_TGETCWD(tbuf,
sizeof(tbuf) / sizeof(JCGO_JNUTCHAR_T)) == NULL)
tbuf[0] = (JCGO_JNUTCHAR_T)0;
(void)JCGO_PATH_TCHDIR(tbuf2);
}
else tbuf[0] = (JCGO_JNUTCHAR_T)0;
JCGO_FILEIOCALL_END(pJniEnv)
return JCGO_JNU_TNEWSTRING(pJniEnv, tbuf);
}
#else
JCGO_UNUSED_VAR(path);
#endif
#endif
#endif
JCGO_UNUSED_VAR(This);
return jcgo_JnuNewStringPlatform(pJniEnv, "");
}
#endif
#ifndef NOJAVA_java_io_VMFile_normPlatformPath0
JCGO_JNI_EXPF(jstring,
Java_java_io_VMFile_normPlatformPath0)( JNIEnv *pJniEnv, jclass This,
jstring path )
{
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(path);
#else
#ifdef JCGO_PATH_PLATFCONV
int res;
char cbuf[JCGO_REALPATH_BUFLEN];
res = jcgo_JnuStringToPlatformChars(pJniEnv, path, cbuf, sizeof(cbuf));
if (res < 0)
return NULL;
if (res > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
res = JCGO_PATH_PLATFCONV(cbuf);
JCGO_FILEIOCALL_END(pJniEnv)
if (res != -1)
return jcgo_JnuNewStringPlatform(pJniEnv, cbuf);
}
#else
JCGO_UNUSED_VAR(path);
#endif
#endif
JCGO_UNUSED_VAR(This);
return jcgo_JnuNewStringPlatform(pJniEnv, "");
}
#endif
#ifndef NOJAVA_java_io_VMFile_pathListPlatformSep0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_pathListPlatformSep0)( JNIEnv *pJniEnv, jclass This,
jstring pathlist )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(pathlist);
return 0;
}
#endif
#ifndef NOJAVA_java_io_VMFile_isHidden0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_isHidden0)( JNIEnv *pJniEnv, jclass This, jstring path )
{
int res = -1;
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(path);
#else
#ifdef JCGO_WINFILE
DWORD attrs;
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
if (JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
attrs = JCGO_JNUTCHAR_E(GetFileAttributesA(JCGO_JNUTCHAR_C(tbuf)),
GetFileAttributesW(tbuf));
res = attrs != INVALID_FILE_ATTRIBUTES &&
(attrs & FILE_ATTRIBUTE_HIDDEN) != 0 ? 1 : 0;
JCGO_FILEIOCALL_END(pJniEnv)
}
#else
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(path);
#endif
#endif
JCGO_UNUSED_VAR(This);
return (jint)res;
}
#endif
#ifndef NOJAVA_java_io_VMFile_getLnkDevInode0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_getLnkDevInode0)( JNIEnv *pJniEnv, jclass This,
jstring path, jlongArray devInodeArr )
{
int res = -EACCES;
#ifndef JCGO_NOFILES
#ifndef JCGO_UNIFSYS
#ifndef JCGO_TFIND_T
struct stat st;
char cbuf[JCGO_PATH_MAXSIZE];
if (jcgo_JnuStringToPlatformChars(pJniEnv, path, cbuf, sizeof(cbuf)) > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
res = JCGO_PATH_LSTAT(cbuf, &st);
if (res < 0 && (res = -errno) >= 0)
res = -EACCES;
JCGO_FILEIOCALL_END(pJniEnv)
if (res >= 0)
{
jcgo_JnuSetLongArrayElement(pJniEnv, devInodeArr, 0,
(jlong)(st.st_dev + 1) - (jlong)1L);
jcgo_JnuSetLongArrayElement(pJniEnv, devInodeArr, 1, (jlong)st.st_ino);
}
}
#endif
#endif
#endif
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(path);
JCGO_UNUSED_VAR(devInodeArr);
return (jint)res;
}
#endif
#ifndef NOJAVA_java_io_VMFile_dirOpNeedsSync0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_dirOpNeedsSync0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
#ifdef JCGO_NOFILES
return 0;
#else
return JCGO_TFIND_NEEDSSYNC;
#endif
}
#endif
#ifndef NOJAVA_java_io_VMFile_dirDataSizeAndIsFind0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_dirDataSizeAndIsFind0)( JNIEnv *pJniEnv, jclass This )
{
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
#ifdef JCGO_NOFILES
return 0;
#else
#ifdef JCGO_TFIND_T
return (jint)JCGO_ALIGNED_BUFSIZE(JCGO_TFIND_T);
#else
return -(jint)JCGO_ALIGNED_BUFSIZE(void *);
#endif
#endif
}
#endif
#ifndef NOJAVA_java_io_VMFile_dirOpenReadFirst0
JCGO_JNI_EXPF(jstring,
Java_java_io_VMFile_dirOpenReadFirst0)( JNIEnv *pJniEnv, jclass This,
jbyteArray dirdata, jstring path )
{
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(dirdata);
JCGO_UNUSED_VAR(path);
return jcgo_JnuNewStringPlatform(pJniEnv, "");
#else
int res;
jstring str = NULL;
JCGO_JNUTCHAR_T *tstr = NULL;
#ifdef JCGO_TFIND_T
jbyte *databuf = jcgo_JnuGetByteArrayElemsRegion(pJniEnv, dirdata, 0,
(jint)JCGO_ALIGNED_BUFSIZE(JCGO_TFIND_T));
JCGO_TFIND_T *pfinddata;
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
if (databuf != NULL)
{
res = JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf);
if (res >= 0)
{
if (res > 0)
{
pfinddata = JCGO_ALIGNED_BUFPTR(JCGO_TFIND_T, databuf);
JCGO_FILEIOCALL_BEGIN(pJniEnv)
if (!JCGO_TFIND_FIRST(pfinddata, tbuf))
tstr = JCGO_TFIND_GETNAME(pfinddata);
JCGO_FILEIOCALL_END(pJniEnv)
}
str = tstr != NULL ? JCGO_JNU_TNEWSTRING(pJniEnv, tstr) :
jcgo_JnuNewStringPlatform(pJniEnv, "");
}
jcgo_JnuReleaseByteArrayElemsRegion(pJniEnv, dirdata, databuf, 0);
}
#else
void *pent;
void *dirp;
jbyte *databuf = jcgo_JnuGetByteArrayElemsRegion(pJniEnv, dirdata, 0,
(jint)JCGO_ALIGNED_BUFSIZE(void *));
JCGO_JNUTCHAR_T tbuf[JCGO_PATH_MAXSIZE];
if (databuf != NULL)
{
res = JCGO_JNU_TSTRINGTOCHARS(pJniEnv, path, tbuf);
if (res >= 0)
{
dirp = NULL;
if (res > 0)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
if ((pent = JCGO_JNUTCHAR_E((dirp = opendir(JCGO_JNUTCHAR_C(tbuf))) !=
NULL ? (void *)readdir(dirp) : NULL, (dirp = _wopendir(tbuf)) !=
NULL ? (void *)_wreaddir(dirp) : NULL)) != NULL)
tstr = JCGO_JNUTCHAR_E(JCGO_JNUTCHAR_R(JCGO_JNUTCHAR_T,
((struct dirent *)pent)->d_name),
((struct _wdirent *)pent)->d_name);
JCGO_FILEIOCALL_END(pJniEnv)
if (dirp != NULL)
*JCGO_ALIGNED_BUFPTR(void *, databuf) = dirp;
}
str = tstr != NULL ? JCGO_JNU_TNEWSTRING(pJniEnv, tstr) :
jcgo_JnuNewStringPlatform(pJniEnv, dirp != NULL ? "." : "");
}
jcgo_JnuReleaseByteArrayElemsRegion(pJniEnv, dirdata, databuf, 0);
}
#endif
JCGO_UNUSED_VAR(This);
return str;
#endif
}
#endif
#ifndef NOJAVA_java_io_VMFile_dirReadNext0
JCGO_JNI_EXPF(jstring,
Java_java_io_VMFile_dirReadNext0)( JNIEnv *pJniEnv, jclass This,
jbyteArray dirdata )
{
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(This);
JCGO_UNUSED_VAR(dirdata);
return jcgo_JnuNewStringPlatform(pJniEnv, "");
#else
jstring str = NULL;
JCGO_JNUTCHAR_T *tstr = NULL;
#ifdef JCGO_TFIND_T
jbyte *databuf = jcgo_JnuGetByteArrayElemsRegion(pJniEnv, dirdata, 0,
(jint)JCGO_ALIGNED_BUFSIZE(JCGO_TFIND_T));
JCGO_TFIND_T *pfinddata;
if (databuf != NULL)
{
pfinddata = JCGO_ALIGNED_BUFPTR(JCGO_TFIND_T, databuf);
JCGO_FILEIOCALL_BEGIN(pJniEnv)
if (!JCGO_TFIND_NEXT(pfinddata))
tstr = JCGO_TFIND_GETNAME(pfinddata);
JCGO_FILEIOCALL_END(pJniEnv)
str = tstr != NULL ? JCGO_JNU_TNEWSTRING(pJniEnv, tstr) :
jcgo_JnuNewStringPlatform(pJniEnv, "");
jcgo_JnuReleaseByteArrayElemsRegion(pJniEnv, dirdata, databuf, 0);
}
#else
void *pent;
void *dirp;
jbyte *databuf = jcgo_JnuGetByteArrayElemsRegion(pJniEnv, dirdata, 0,
(jint)JCGO_ALIGNED_BUFSIZE(void *));
if (databuf != NULL)
{
if ((dirp = *JCGO_ALIGNED_BUFPTR(void *, databuf)) != NULL)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
if ((pent = JCGO_JNUTCHAR_E((void *)readdir(dirp),
(void *)_wreaddir(dirp))) != NULL)
tstr = JCGO_JNUTCHAR_E(JCGO_JNUTCHAR_R(JCGO_JNUTCHAR_T,
((struct dirent *)pent)->d_name),
((struct _wdirent *)pent)->d_name);
JCGO_FILEIOCALL_END(pJniEnv)
}
str = tstr != NULL ? JCGO_JNU_TNEWSTRING(pJniEnv, tstr) :
jcgo_JnuNewStringPlatform(pJniEnv, "");
jcgo_JnuReleaseByteArrayElemsRegion(pJniEnv, dirdata, databuf, 0);
}
#endif
JCGO_UNUSED_VAR(This);
return str;
#endif
}
#endif
#ifndef NOJAVA_java_io_VMFile_dirIsHiddenFound0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_dirIsHiddenFound0)( JNIEnv *pJniEnv, jclass This,
jbyteArray dirdata )
{
int ishidden = -1;
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(dirdata);
#else
#ifdef JCGO_TFIND_T
jbyte *databuf = jcgo_JnuGetByteArrayElemsRegion(pJniEnv, dirdata, 0,
(jint)JCGO_ALIGNED_BUFSIZE(JCGO_TFIND_T));
if (databuf != NULL)
{
ishidden = 0;
if (JCGO_TFIND_ISHIDDEN(JCGO_ALIGNED_BUFPTR(JCGO_TFIND_T, databuf)))
ishidden = 1;
jcgo_JnuReleaseByteArrayElemsRegion(pJniEnv, dirdata, databuf, 0);
}
#else
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(dirdata);
#endif
#endif
JCGO_UNUSED_VAR(This);
return ishidden;
}
#endif
#ifndef NOJAVA_java_io_VMFile_dirClose0
JCGO_JNI_EXPF(jint,
Java_java_io_VMFile_dirClose0)( JNIEnv *pJniEnv, jclass This,
jbyteArray dirdata )
{
#ifdef JCGO_NOFILES
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(dirdata);
#else
#ifdef JCGO_TFIND_T
jbyte *databuf = jcgo_JnuGetByteArrayElemsRegion(pJniEnv, dirdata, 0,
(jint)JCGO_ALIGNED_BUFSIZE(JCGO_TFIND_T));
if (databuf == NULL)
return 0;
JCGO_FILEIOCALL_BEGIN(pJniEnv)
(void)JCGO_TFIND_CLOSE(JCGO_ALIGNED_BUFPTR(JCGO_TFIND_T, databuf));
JCGO_FILEIOCALL_END(pJniEnv)
#else
void *dirp;
jbyte *databuf = jcgo_JnuGetByteArrayElemsRegion(pJniEnv, dirdata, 0,
(jint)JCGO_ALIGNED_BUFSIZE(void *));
if (databuf == NULL)
return 0;
if ((dirp = *JCGO_ALIGNED_BUFPTR(void *, databuf)) != NULL)
{
JCGO_FILEIOCALL_BEGIN(pJniEnv)
(void)JCGO_JNUTCHAR_E(closedir(dirp), _wclosedir(dirp));
JCGO_FILEIOCALL_END(pJniEnv)
}
#endif
jcgo_JnuReleaseByteArrayElemsRegion(pJniEnv, dirdata, databuf, 0);
#endif
JCGO_UNUSED_VAR(This);
return 0;
}
#endif
#endif /* ! JCGO_EXCLUDE_VMFILE */
#ifndef JCGO_EXCLUDE_VMTIMEZONE
#ifndef NOJAVA_java_util_VMTimeZone_getCTimezoneAndDaylight0
JCGO_JNI_EXPF(jint,
Java_java_util_VMTimeZone_getCTimezoneAndDaylight0)( JNIEnv *pJniEnv,
jclass This )
{
#ifndef JCGO_NOTIME
#ifdef JCGO_WINFILE
TIME_ZONE_INFORMATION tzInfo;
if (GetTimeZoneInformation(&tzInfo) != TIME_ZONE_ID_INVALID)
return (jint)(((tzInfo.Bias * 60L) << 1) | (tzInfo.DaylightBias ? 1 : 0));
#else
/* return (jint)((_timezone << 1) | (_daylight ? 1 : 0)); */
struct tm *ptm;
long tzofs = 0L;
long tzofs2 = 0L;
time_t value = (time_t)0x3697ed80L; /* 1999-01-10T00:00:00Z */
JCGO_FILEIOCALL_BEGIN(pJniEnv)
if ((ptm = localtime(&value)) != NULL)
{
tzofs = (((long)(10 - ptm->tm_mday) * 24L - (long)ptm->tm_hour) * 60L -
(long)ptm->tm_min) * 60L - (long)ptm->tm_sec;
value = (time_t)0x37868d00L; /* 1999-07-10T00:00:00Z */
if ((ptm = localtime(&value)) != NULL)
tzofs2 = (((long)(10 - ptm->tm_mday) * 24L - (long)ptm->tm_hour) * 60L -
(long)ptm->tm_min) * 60L - (long)ptm->tm_sec;
}
JCGO_FILEIOCALL_END(pJniEnv)
if (ptm != NULL)
return (jint)(((tzofs > tzofs2 ? tzofs : tzofs2) << 1) |
(tzofs != tzofs2 ? 1 : 0));
#endif
#endif
JCGO_UNUSED_VAR(pJniEnv);
JCGO_UNUSED_VAR(This);
return 0;
}
#endif
#endif /* ! JCGO_EXCLUDE_VMTIMEZONE */
#endif