29 #include "jlong.h"
30
31 #include <netdb.h>
32 #include <sys/types.h>
33 #include <sys/socket.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <errno.h>
37
38 #if defined(__linux__) || defined(_ALLBSD_SOURCE)
39 #include <netinet/in.h>
40 #endif
41
42 #include "net_util.h"
43 #include "net_util_md.h"
44 #include "nio.h"
45 #include "nio_util.h"
46
47 #include "sun_nio_ch_DatagramChannelImpl.h"
48
49 static jfieldID isa_addrID; /* address in java.net.InetSocketAddress */
50 static jfieldID isa_portID; /* port in java.net.InetSocketAddress */
51 static jfieldID dci_senderID; /* sender in sun.nio.ch.DatagramChannelImpl */
52 static jfieldID dci_senderAddrID; /* sender InetAddress in sun.nio.ch.DatagramChannelImpl */
53 static jfieldID dci_senderPortID; /* sender port in sun.nio.ch.DatagramChannelImpl */
54 static jclass isa_class; /* java.net.InetSocketAddress */
55 static jmethodID isa_ctorID; /* .InetSocketAddress(InetAddress, int) */
56
57 JNIEXPORT void JNICALL
58 Java_sun_nio_ch_DatagramChannelImpl_initIDs(JNIEnv *env, jclass clazz)
59 {
60 clazz = (*env)->FindClass(env, "java/net/InetSocketAddress");
61 isa_class = (*env)->NewGlobalRef(env, clazz);
62 isa_ctorID = (*env)->GetMethodID(env, clazz, "<init>",
63 "(Ljava/net/InetAddress;I)V");
64 isa_addrID = (*env)->GetFieldID(env, clazz, "addr",
65 "Ljava/net/InetAddress;");
66 isa_portID = (*env)->GetFieldID(env, clazz, "port", "I");
67
68 clazz = (*env)->FindClass(env, "sun/nio/ch/DatagramChannelImpl");
69 dci_senderID = (*env)->GetFieldID(env, clazz, "sender",
70 "Ljava/net/SocketAddress;");
71 dci_senderAddrID = (*env)->GetFieldID(env, clazz,
72 "cachedSenderInetAddress",
73 "Ljava/net/InetAddress;");
74 dci_senderPortID = (*env)->GetFieldID(env, clazz,
75 "cachedSenderPort", "I");
76 }
77
78 JNIEXPORT void JNICALL
79 Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this,
80 jobject fdo, jboolean isIPv6)
81 {
82 jint fd = fdval(env, fdo);
83 int rv;
84
85 #ifdef __solaris__
86 rv = connect(fd, 0, 0);
195 if (ia != NULL) {
196 isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
197 }
198
199 if (isa == NULL) {
200 JNU_ThrowOutOfMemoryError(env, "heap allocation failed");
201 return IOS_THROWN;
202 }
203
204 (*env)->SetObjectField(env, this, dci_senderAddrID, ia);
205 (*env)->SetIntField(env, this, dci_senderPortID,
206 NET_GetPortFromSockaddr((struct sockaddr *)&sa));
207 (*env)->SetObjectField(env, this, dci_senderID, isa);
208 }
209 return n;
210 }
211
212 JNIEXPORT jint JNICALL
213 Java_sun_nio_ch_DatagramChannelImpl_send0(JNIEnv *env, jobject this,
214 jboolean preferIPv6, jobject fdo, jlong address,
215 jint len, jobject dest)
216 {
217 jint fd = fdval(env, fdo);
218 void *buf = (void *)jlong_to_ptr(address);
219 SOCKADDR sa;
220 int sa_len = SOCKADDR_LEN;
221 jint n = 0;
222 jobject destAddress = (*env)->GetObjectField(env, dest, isa_addrID);
223 jint destPort = (*env)->GetIntField(env, dest, isa_portID);
224
225 if (len > MAX_PACKET_LEN) {
226 len = MAX_PACKET_LEN;
227 }
228
229 if (NET_InetAddressToSockaddr(env, destAddress, destPort,
230 (struct sockaddr *)&sa,
231 &sa_len, preferIPv6) != 0) {
232 return IOS_THROWN;
233 }
234
235 n = sendto(fd, buf, len, 0, (struct sockaddr *)&sa, sa_len);
236 if (n < 0) {
237 if (errno == EAGAIN) {
238 return IOS_UNAVAILABLE;
239 }
240 if (errno == EINTR) {
241 return IOS_INTERRUPTED;
242 }
243 if (errno == ECONNREFUSED) {
|
29 #include "jlong.h"
30
31 #include <netdb.h>
32 #include <sys/types.h>
33 #include <sys/socket.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <errno.h>
37
38 #if defined(__linux__) || defined(_ALLBSD_SOURCE)
39 #include <netinet/in.h>
40 #endif
41
42 #include "net_util.h"
43 #include "net_util_md.h"
44 #include "nio.h"
45 #include "nio_util.h"
46
47 #include "sun_nio_ch_DatagramChannelImpl.h"
48
49 static jfieldID dci_senderID; /* sender in sun.nio.ch.DatagramChannelImpl */
50 static jfieldID dci_senderAddrID; /* sender InetAddress in sun.nio.ch.DatagramChannelImpl */
51 static jfieldID dci_senderPortID; /* sender port in sun.nio.ch.DatagramChannelImpl */
52 static jclass isa_class; /* java.net.InetSocketAddress */
53 static jmethodID isa_ctorID; /* .InetSocketAddress(InetAddress, int) */
54
55 JNIEXPORT void JNICALL
56 Java_sun_nio_ch_DatagramChannelImpl_initIDs(JNIEnv *env, jclass clazz)
57 {
58 clazz = (*env)->FindClass(env, "java/net/InetSocketAddress");
59 isa_class = (*env)->NewGlobalRef(env, clazz);
60 isa_ctorID = (*env)->GetMethodID(env, clazz, "<init>",
61 "(Ljava/net/InetAddress;I)V");
62
63 clazz = (*env)->FindClass(env, "sun/nio/ch/DatagramChannelImpl");
64 dci_senderID = (*env)->GetFieldID(env, clazz, "sender",
65 "Ljava/net/SocketAddress;");
66 dci_senderAddrID = (*env)->GetFieldID(env, clazz,
67 "cachedSenderInetAddress",
68 "Ljava/net/InetAddress;");
69 dci_senderPortID = (*env)->GetFieldID(env, clazz,
70 "cachedSenderPort", "I");
71 }
72
73 JNIEXPORT void JNICALL
74 Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this,
75 jobject fdo, jboolean isIPv6)
76 {
77 jint fd = fdval(env, fdo);
78 int rv;
79
80 #ifdef __solaris__
81 rv = connect(fd, 0, 0);
190 if (ia != NULL) {
191 isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
192 }
193
194 if (isa == NULL) {
195 JNU_ThrowOutOfMemoryError(env, "heap allocation failed");
196 return IOS_THROWN;
197 }
198
199 (*env)->SetObjectField(env, this, dci_senderAddrID, ia);
200 (*env)->SetIntField(env, this, dci_senderPortID,
201 NET_GetPortFromSockaddr((struct sockaddr *)&sa));
202 (*env)->SetObjectField(env, this, dci_senderID, isa);
203 }
204 return n;
205 }
206
207 JNIEXPORT jint JNICALL
208 Java_sun_nio_ch_DatagramChannelImpl_send0(JNIEnv *env, jobject this,
209 jboolean preferIPv6, jobject fdo, jlong address,
210 jint len, jobject destAddress, jint destPort)
211 {
212 jint fd = fdval(env, fdo);
213 void *buf = (void *)jlong_to_ptr(address);
214 SOCKADDR sa;
215 int sa_len = SOCKADDR_LEN;
216 jint n = 0;
217
218 if (len > MAX_PACKET_LEN) {
219 len = MAX_PACKET_LEN;
220 }
221
222 if (NET_InetAddressToSockaddr(env, destAddress, destPort,
223 (struct sockaddr *)&sa,
224 &sa_len, preferIPv6) != 0) {
225 return IOS_THROWN;
226 }
227
228 n = sendto(fd, buf, len, 0, (struct sockaddr *)&sa, sa_len);
229 if (n < 0) {
230 if (errno == EAGAIN) {
231 return IOS_UNAVAILABLE;
232 }
233 if (errno == EINTR) {
234 return IOS_INTERRUPTED;
235 }
236 if (errno == ECONNREFUSED) {
|