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);
82 #endif
83
84 #if defined(__linux__) || defined(_ALLBSD_SOURCE)
85 {
86 int len;
87 SOCKADDR sa;
88
89 memset(&sa, 0, sizeof(sa));
90
91 #ifdef AF_INET6
92 if (isIPv6) {
93 struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)&sa;
94 #if defined(_ALLBSD_SOURCE)
95 him6->sin6_family = AF_INET6;
96 #else
97 him6->sin6_family = AF_UNSPEC;
98 #endif
99 len = sizeof(struct sockaddr_in6);
100 } else
101 #endif
102 {
103 struct sockaddr_in *him4 = (struct sockaddr_in*)&sa;
104 #if defined(_ALLBSD_SOURCE)
105 him4->sin_family = AF_INET;
106 #else
107 him4->sin_family = AF_UNSPEC;
108 #endif
109 len = sizeof(struct sockaddr_in);
110 }
111
112 rv = connect(fd, (struct sockaddr *)&sa, len);
113
114 #if defined(_ALLBSD_SOURCE)
115 if (rv < 0 && errno == EADDRNOTAVAIL)
116 rv = errno = 0;
117 #endif
118 }
119 #endif
120
121 if (rv < 0)
122 handleSocketError(env, errno);
123
124 }
125
126 JNIEXPORT jint JNICALL
127 Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jobject this,
128 jobject fdo, jlong address,
129 jint len, jboolean connected)
130 {
131 jint fd = fdval(env, fdo);
132 void *buf = (void *)jlong_to_ptr(address);
133 SOCKADDR sa;
134 socklen_t sa_len = SOCKADDR_LEN;
135 jboolean retry = JNI_FALSE;
|
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);
82 #endif
83
84 #if defined(__linux__) || defined(_ALLBSD_SOURCE) || defined(_AIX)
85 {
86 int len;
87 SOCKADDR sa;
88
89 memset(&sa, 0, sizeof(sa));
90
91 #ifdef AF_INET6
92 if (isIPv6) {
93 struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)&sa;
94 #if defined(_ALLBSD_SOURCE)
95 him6->sin6_family = AF_INET6;
96 #else
97 him6->sin6_family = AF_UNSPEC;
98 #endif
99 len = sizeof(struct sockaddr_in6);
100 } else
101 #endif
102 {
103 struct sockaddr_in *him4 = (struct sockaddr_in*)&sa;
104 #if defined(_ALLBSD_SOURCE)
105 him4->sin_family = AF_INET;
106 #else
107 him4->sin_family = AF_UNSPEC;
108 #endif
109 len = sizeof(struct sockaddr_in);
110 }
111
112 rv = connect(fd, (struct sockaddr *)&sa, len);
113
114 #if defined(_ALLBSD_SOURCE)
115 if (rv < 0 && errno == EADDRNOTAVAIL)
116 rv = errno = 0;
117 #endif
118 #if defined(_AIX)
119 /* See W. Richard Stevens, "UNIX Network Programming, Volume 1", p. 254:
120 * 'Setting the address family to AF_UNSPEC might return EAFNOSUPPORT
121 * but that is acceptable.
122 */
123 if (rv < 0 && errno == EAFNOSUPPORT)
124 rv = errno = 0;
125 #endif
126 }
127 #endif
128
129 if (rv < 0)
130 handleSocketError(env, errno);
131
132 }
133
134 JNIEXPORT jint JNICALL
135 Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jobject this,
136 jobject fdo, jlong address,
137 jint len, jboolean connected)
138 {
139 jint fd = fdval(env, fdo);
140 void *buf = (void *)jlong_to_ptr(address);
141 SOCKADDR sa;
142 socklen_t sa_len = SOCKADDR_LEN;
143 jboolean retry = JNI_FALSE;
|