src/windows/native/java/io/io_util_md.c
Print this page
@@ -305,11 +305,10 @@
static int
handleStdinAvailable(jlong, long *);
int
handleAvailable(jlong fd, jlong *pbytes) {
- jlong current, end;
HANDLE h = (HANDLE)fd;
DWORD type = 0;
type = GetFileType(h);
/* Handle is for keyboard or pipe */
@@ -325,22 +324,21 @@
(*pbytes) = (jlong)(lpbytes);
return ret;
}
/* Handle is for regular file */
if (type == FILE_TYPE_DISK) {
- long highPos = 0;
- DWORD sizeLow = 0;
- DWORD sizeHigh = 0;
- DWORD lowPos = SetFilePointer(h, 0, &highPos, FILE_CURRENT);
- if (lowPos == ((DWORD)-1)) {
+ jlong current, end;
+
+ LARGE_INTEGER filesize;
+ current = handleLseek(fd, 0, SEEK_CUR);
+ if (current < 0) {
return FALSE;
}
- current = (((jlong)highPos) << 32) | lowPos;
- end = GetFileSize(h, &sizeHigh);
- if (sizeLow == ((DWORD)-1)) {
+ if (GetFileSizeEx(h, &filesize) == 0) {
return FALSE;
}
+ end = long_to_jlong(filesize.QuadPart);
*pbytes = end - current;
return TRUE;
}
return FALSE;
}
@@ -556,10 +554,11 @@
}
jlong
handleLseek(jlong fd, jlong offset, jint whence)
{
+ LARGE_INTEGER pos, distance;
DWORD lowPos = 0;
long highPos = 0;
DWORD op = FILE_CURRENT;
HANDLE h = (HANDLE)fd;
@@ -571,15 +570,11 @@
}
if (whence == SEEK_SET) {
op = FILE_BEGIN;
}
- lowPos = (DWORD)offset;
- highPos = (long)(offset >> 32);
- lowPos = SetFilePointer(h, lowPos, &highPos, op);
- if (lowPos == ((DWORD)-1)) {
- if (GetLastError() != ERROR_SUCCESS) {
+ distance.QuadPart = offset;
+ if (SetFilePointerEx(h, distance, &pos, op) == 0) {
return -1;
}
- }
- return (((jlong)highPos) << 32) | lowPos;
+ return long_to_jlong(pos.QuadPart);
}