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_FileDispatcher_pwrite0(JNIEnv *env, jclass clazz, jobject fdo, jlong address, jint len, jlong offset) { jint fd = fdval(env, fdo); void *buf = (void *)jlong_to_ptr(address); return convertReturnVal(env, pwrite64(fd, buf, len, offset), JNI_FALSE); }
JNIEXPORT jint JNICALL Java_sun_nio_ch_FileDispatcher_read0(JNIEnv *env, jclass clazz, jobject fdo, jlong address, jint len) { jint fd = fdval(env, fdo); void *buf = (void *)jlong_to_ptr(address); return convertReturnVal(env, read(fd, buf, len), JNI_TRUE); }
JNIEXPORT jint JNICALL Java_sun_nio_ch_DatagramDispatcher_write0(JNIEnv *env, jclass clazz, jobject fdo, jlong address, jint len) { jint fd = fdval(env, fdo); void *buf = (void *)jlong_to_ptr(address); int result = send(fd, buf, len, 0); if (result < 0 && errno == ECONNREFUSED) { JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0); return -2; } return convertReturnVal(env, result, 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 jint JNICALL Java_sun_nio_ch_DatagramDispatcher_read0(JNIEnv *env, jclass clazz, jobject fdo, jlong address, jint len) { /* set up */ int i = 0; DWORD read = 0; DWORD flags = 0; jint fd = fdval(env, fdo); WSABUF buf; /* destination buffer and size */ buf.buf = (char *)address; buf.len = (u_long)len; /* read into the buffers */ i = WSARecv((SOCKET)fd, /* Socket */ &buf, /* pointers to the buffers */ (DWORD)1, /* number of buffers to process */ &read, /* receives number of bytes read */ &flags, /* no flags */ 0, /* no overlapped sockets */ 0); /* no completion routine */ if (i == SOCKET_ERROR) { int theErr = (jint)WSAGetLastError(); if (theErr == WSAEWOULDBLOCK) { return IOS_UNAVAILABLE; } if (theErr == WSAECONNRESET) { purgeOutstandingICMP(env, clazz, fd); JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0); return IOS_THROWN; } JNU_ThrowIOExceptionWithLastError(env, "Write failed"); return IOS_THROWN; } return convertReturnVal(env, (jint)read, JNI_TRUE); }
JNIEXPORT jint JNICALL Java_sun_nio_ch_SocketDispatcher_read0(JNIEnv *env, jclass clazz, jobject fdo, jlong address, jint len) { /* set up */ int i = 0; DWORD read = 0; DWORD flags = 0; jint fd = fdval(env, fdo); WSABUF buf; /* limit size */ if (len > MAX_BUFFER_SIZE) len = MAX_BUFFER_SIZE; /* destination buffer and size */ buf.buf = (char *)address; buf.len = (u_long)len; /* read into the buffers */ i = WSARecv((SOCKET)fd, /* Socket */ &buf, /* pointers to the buffers */ (DWORD)1, /* number of buffers to process */ &read, /* receives number of bytes read */ &flags, /* no flags */ 0, /* no overlapped sockets */ 0); /* no completion routine */ if (i == SOCKET_ERROR) { int theErr = (jint)WSAGetLastError(); if (theErr == WSAEWOULDBLOCK) { 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_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); }