JNIEXPORT jint JNICALL Java_sun_nio_ch_FileDispatcherImpl_read0(JNIEnv *env, jclass clazz, jobject fdo, jlong address, jint len) { DWORD read = 0; BOOL result = 0; HANDLE h = (HANDLE)(handleval(env, fdo)); if (h == INVALID_HANDLE_VALUE) { JNU_ThrowIOExceptionWithLastError(env, "Invalid handle"); return IOS_THROWN; } result = ReadFile(h, /* File handle to read */ (LPVOID)address, /* address to put data */ len, /* number of bytes to read */ &read, /* number of bytes read */ NULL); /* no overlapped struct */ if (result == 0) { int error = GetLastError(); if (error == ERROR_BROKEN_PIPE) { return IOS_EOF; } if (error == ERROR_NO_DATA) { return IOS_UNAVAILABLE; } JNU_ThrowIOExceptionWithLastError(env, "Read failed"); return IOS_THROWN; } return convertReturnVal(env, (jint)read, JNI_TRUE); }
JNIEXPORT jint JNICALL Java_sun_nio_ch_FileDispatcherImpl_write0(JNIEnv *env, jclass clazz, jobject fdo, jlong address, jint len, jboolean append) { BOOL result = 0; DWORD written = 0; HANDLE h = (HANDLE)(handleval(env, fdo)); if (h != INVALID_HANDLE_VALUE) { OVERLAPPED ov; LPOVERLAPPED lpOv; if (append == JNI_TRUE) { ov.Offset = (DWORD)0xFFFFFFFF; ov.OffsetHigh = (DWORD)0xFFFFFFFF; ov.hEvent = NULL; lpOv = &ov; } else { lpOv = NULL; } result = WriteFile(h, /* File handle to write */ (LPCVOID)address, /* pointers to the buffers */ len, /* number of bytes to write */ &written, /* receives number of bytes written */ lpOv); /* overlapped struct */ } if ((h == INVALID_HANDLE_VALUE) || (result == 0)) { JNU_ThrowIOExceptionWithLastError(env, "Write failed"); } return convertReturnVal(env, (jint)written, JNI_FALSE); }
JNIEXPORT jint JNICALL Java_sun_nio_ch_FileDispatcherImpl_pwrite0(JNIEnv *env, jclass clazz, jobject fdo, jlong address, jint len, jlong offset) { BOOL result = 0; DWORD written = 0; HANDLE h = (HANDLE)(handleval(env, fdo)); DWORD lowPos = 0; long highPos = 0; DWORD lowOffset = 0; long highOffset = 0; lowPos = SetFilePointer(h, 0, &highPos, FILE_CURRENT); if (lowPos == ((DWORD)-1)) { if (GetLastError() != ERROR_SUCCESS) { JNU_ThrowIOExceptionWithLastError(env, "Seek failed"); return IOS_THROWN; } } lowOffset = (DWORD)offset; highOffset = (DWORD)(offset >> 32); lowOffset = SetFilePointer(h, lowOffset, &highOffset, FILE_BEGIN); if (lowOffset == ((DWORD)-1)) { if (GetLastError() != ERROR_SUCCESS) { JNU_ThrowIOExceptionWithLastError(env, "Seek failed"); return IOS_THROWN; } } result = WriteFile(h, /* File handle to write */ (LPCVOID)address, /* pointers to the buffers */ len, /* number of bytes to write */ &written, /* receives number of bytes written */ NULL); /* no overlapped struct */ if ((h == INVALID_HANDLE_VALUE) || (result == 0)) { JNU_ThrowIOExceptionWithLastError(env, "Write failed"); return IOS_THROWN; } lowPos = SetFilePointer(h, lowPos, &highPos, FILE_BEGIN); if (lowPos == ((DWORD)-1)) { if (GetLastError() != ERROR_SUCCESS) { JNU_ThrowIOExceptionWithLastError(env, "Seek failed"); return IOS_THROWN; } } return convertReturnVal(env, (jint)written, JNI_FALSE); }
JNIEXPORT jlong JNICALL Java_sun_nio_ch_FileDispatcherImpl_readv0(JNIEnv *env, jclass clazz, jobject fdo, jlong address, jint len) { DWORD read = 0; BOOL result = 0; jlong totalRead = 0; LPVOID loc; int i = 0; DWORD num = 0; struct iovec *iovecp = (struct iovec *)jlong_to_ptr(address); HANDLE h = (HANDLE)(handleval(env, fdo)); if (h == INVALID_HANDLE_VALUE) { JNU_ThrowIOExceptionWithLastError(env, "Invalid handle"); return IOS_THROWN; } for(i=0; i<len; i++) { loc = (LPVOID)jlong_to_ptr(iovecp[i].iov_base); num = iovecp[i].iov_len; result = ReadFile(h, /* File handle to read */ loc, /* address to put data */ num, /* number of bytes to read */ &read, /* number of bytes read */ NULL); /* no overlapped struct */ if (read > 0) { totalRead += read; } if (read < num) { break; } } if (result == 0) { int error = GetLastError(); if (error == ERROR_BROKEN_PIPE) { return IOS_EOF; } if (error == ERROR_NO_DATA) { return IOS_UNAVAILABLE; } JNU_ThrowIOExceptionWithLastError(env, "Read failed"); return IOS_THROWN; } return convertLongReturnVal(env, totalRead, JNI_TRUE); }
JNIEXPORT jlong JNICALL Java_sun_nio_ch_FileDispatcherImpl_writev0(JNIEnv *env, jclass clazz, jobject fdo, jlong address, jint len, jboolean append) { BOOL result = 0; DWORD written = 0; HANDLE h = (HANDLE)(handleval(env, fdo)); jlong totalWritten = 0; if (h != INVALID_HANDLE_VALUE) { LPVOID loc; int i = 0; DWORD num = 0; struct iovec *iovecp = (struct iovec *)jlong_to_ptr(address); OVERLAPPED ov; LPOVERLAPPED lpOv; if (append == JNI_TRUE) { ov.Offset = (DWORD)0xFFFFFFFF; ov.OffsetHigh = (DWORD)0xFFFFFFFF; ov.hEvent = NULL; lpOv = &ov; } else { lpOv = NULL; } for(i=0; i<len; i++) { loc = (LPVOID)jlong_to_ptr(iovecp[i].iov_base); num = iovecp[i].iov_len; result = WriteFile(h, /* File handle to write */ loc, /* pointers to the buffers */ num, /* number of bytes to write */ &written,/* receives number of bytes written */ lpOv); /* overlapped struct */ if (written > 0) { totalWritten += written; } if (written < num) { break; } } } if ((h == INVALID_HANDLE_VALUE) || (result == 0)) { JNU_ThrowIOExceptionWithLastError(env, "Write failed"); } return convertLongReturnVal(env, totalWritten, JNI_FALSE); }
/************************************************************** * Channel */ JNIEXPORT jlong JNICALL Java_sun_nio_ch_FileChannelImpl_map0(JNIEnv *env, jobject this, jint prot, jlong off, jlong len) { void *mapAddress = 0; jint lowOffset = (jint)off; jint highOffset = (jint)(off >> 32); jlong maxSize = off + len; jint lowLen = (jint)(maxSize); jint highLen = (jint)(maxSize >> 32); jobject fdo = (*env)->GetObjectField(env, this, chan_fd); HANDLE fileHandle = (HANDLE)(handleval(env, fdo)); HANDLE mapping; DWORD mapAccess = FILE_MAP_READ; DWORD fileProtect = PAGE_READONLY; DWORD mapError; BOOL result; if (prot == sun_nio_ch_FileChannelImpl_MAP_RO) { fileProtect = PAGE_READONLY; mapAccess = FILE_MAP_READ; } else if (prot == sun_nio_ch_FileChannelImpl_MAP_RW) { fileProtect = PAGE_READWRITE; mapAccess = FILE_MAP_WRITE; } else if (prot == sun_nio_ch_FileChannelImpl_MAP_PV) { fileProtect = PAGE_WRITECOPY; mapAccess = FILE_MAP_COPY;
JNIEXPORT jint JNICALL Java_sun_nio_ch_FileDispatcherImpl_pread0(JNIEnv *env, jclass clazz, jobject fdo, jlong address, jint len, jlong offset) { DWORD read = 0; BOOL result = 0; HANDLE h = (HANDLE)(handleval(env, fdo)); DWORD lowPos = 0; long highPos = 0; DWORD lowOffset = 0; long highOffset = 0; if (h == INVALID_HANDLE_VALUE) { JNU_ThrowIOExceptionWithLastError(env, "Invalid handle"); return IOS_THROWN; } lowPos = SetFilePointer(h, 0, &highPos, FILE_CURRENT); if (lowPos == ((DWORD)-1)) { if (GetLastError() != ERROR_SUCCESS) { JNU_ThrowIOExceptionWithLastError(env, "Seek failed"); return IOS_THROWN; } } lowOffset = (DWORD)offset; highOffset = (DWORD)(offset >> 32); lowOffset = SetFilePointer(h, lowOffset, &highOffset, FILE_BEGIN); if (lowOffset == ((DWORD)-1)) { if (GetLastError() != ERROR_SUCCESS) { JNU_ThrowIOExceptionWithLastError(env, "Seek failed"); return IOS_THROWN; } } result = ReadFile(h, /* File handle to read */ (LPVOID)address, /* address to put data */ len, /* number of bytes to read */ &read, /* number of bytes read */ NULL); /* struct with offset */ if (result == 0) { int error = GetLastError(); if (error == ERROR_BROKEN_PIPE) { return IOS_EOF; } if (error == ERROR_NO_DATA) { return IOS_UNAVAILABLE; } JNU_ThrowIOExceptionWithLastError(env, "Read failed"); return IOS_THROWN; } lowPos = SetFilePointer(h, lowPos, &highPos, FILE_BEGIN); if (lowPos == ((DWORD)-1)) { if (GetLastError() != ERROR_SUCCESS) { JNU_ThrowIOExceptionWithLastError(env, "Seek failed"); return IOS_THROWN; } } return convertReturnVal(env, (jint)read, JNI_TRUE); }
if (lowPos == ((DWORD)-1)) { if (GetLastError() != ERROR_SUCCESS) { JNU_ThrowIOExceptionWithLastError(env, "Seek failed"); return IOS_THROWN; } } return convertReturnVal(env, (jint)written, JNI_FALSE); } JNIEXPORT jint JNICALL Java_sun_nio_ch_FileDispatcherImpl_force0(JNIEnv *env, jobject this, jobject fdo, jboolean md) { int result = 0; HANDLE h = (HANDLE)(handleval(env, fdo)); if (h != INVALID_HANDLE_VALUE) { result = FlushFileBuffers(h); if (result == 0) { int error = GetLastError(); if (error != ERROR_ACCESS_DENIED) { JNU_ThrowIOExceptionWithLastError(env, "Force failed"); return IOS_THROWN; } } } else { JNU_ThrowIOExceptionWithLastError(env, "Force failed"); return IOS_THROWN; } return 0;