aboutsummaryrefslogtreecommitdiff
path: root/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c')
-rw-r--r--src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c b/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c
index 108f0de16c..23d7ce2a65 100644
--- a/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c
+++ b/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -70,6 +70,25 @@ static jboolean purgeOutstandingICMP(JNIEnv *env, jint fd)
return got_icmp;
}
+static jfieldID IO_fd_fdID = NULL;
+static jfieldID pdsi_fdID = NULL;
+
+/*
+ * Class: java_net_DualStackPlainDatagramSocketImpl
+ * Method: initIDs
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_initIDs
+ (JNIEnv *env, jclass clazz)
+{
+ pdsi_fdID = (*env)->GetFieldID(env, clazz, "fd",
+ "Ljava/io/FileDescriptor;");
+ CHECK_NULL(pdsi_fdID);
+ IO_fd_fdID = NET_GetFileDescriptorID(env);
+ CHECK_NULL(IO_fd_fdID);
+ JNU_CHECK_EXCEPTION(env);
+}
+
/*
* Class: java_net_DualStackPlainDatagramSocketImpl
* Method: socketCreate
@@ -498,3 +517,32 @@ JNIEXPORT jint JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketGetI
return result;
}
+
+/*
+ * Class: java_net_DualStackPlainDatagramSocketImpl
+ * Method: dataAvailable
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_dataAvailable
+(JNIEnv *env, jobject this) {
+ SOCKET fd;
+ int rv = -1;
+ jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
+
+ if (!IS_NULL(fdObj)) {
+ int retval = 0;
+ fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID);
+ rv = ioctlsocket(fd, FIONREAD, &retval);
+ if (retval > 0) {
+ return retval;
+ }
+ }
+
+ if (rv < 0) {
+ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
+ "Socket closed");
+ return -1;
+ }
+
+ return 0;
+}