86 #define MCAST_LEAVE_SOURCE_GROUP 67
87
88 #else
89
90 #define MCAST_JOIN_SOURCE_GROUP 82 /* join a source-specific group */
91 #define MCAST_LEAVE_SOURCE_GROUP 83 /* leave a single source */
92 #define MCAST_BLOCK_SOURCE 84 /* block a source */
93 #define MCAST_UNBLOCK_SOURCE 85 /* unblock a source */
94
95 #endif /* _AIX */
96
97 #endif /* MCAST_BLOCK_SOURCE */
98
99 #ifndef IPV6_ADD_MEMBERSHIP
100
101 #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
102 #define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
103
104 #endif /* IPV6_ADD_MEMBERSHIP */
105
106 struct my_ip_mreq_source {
107 struct in_addr imr_multiaddr;
108 struct in_addr imr_interface;
109 struct in_addr imr_sourceaddr;
110 };
111
112 struct my_group_source_req {
113 uint32_t gsr_interface; /* interface index */
114 struct sockaddr_storage gsr_group; /* group address */
115 struct sockaddr_storage gsr_source; /* source address */
116 };
117
118 #else /* _ALLBSD_SOURCE */
119
120 #define my_ip_mreq_source ip_mreq_source
121 #define my_group_source_req group_source_req
122
123 #endif
124
125
126 #define COPY_INET6_ADDRESS(env, source, target) \
127 (*env)->GetByteArrayRegion(env, source, 0, 16, target)
128
129 /*
130 * Copy IPv6 group, interface index, and IPv6 source address
131 * into group_source_req structure.
181 JNIEXPORT void JNICALL
182 Java_sun_nio_ch_Net_initIDs(JNIEnv *env, jclass clazz)
183 {
184 /* Here because Windows native code does need to init IDs */
185 }
186
187 JNIEXPORT jboolean JNICALL
188 Java_sun_nio_ch_Net_isIPv6Available0(JNIEnv* env, jclass cl)
189 {
190 return (ipv6_available()) ? JNI_TRUE : JNI_FALSE;
191 }
192
193 JNIEXPORT jint JNICALL
194 Java_sun_nio_ch_Net_isExclusiveBindAvailable(JNIEnv *env, jclass clazz) {
195 return -1;
196 }
197
198 JNIEXPORT jboolean JNICALL
199 Java_sun_nio_ch_Net_canIPv6SocketJoinIPv4Group0(JNIEnv* env, jclass cl)
200 {
201 #ifdef MACOSX
202 /* for now IPv6 sockets cannot join IPv4 multicast groups */
203 return JNI_FALSE;
204 #else
205 return JNI_TRUE;
206 #endif
207 }
208
209 JNIEXPORT jboolean JNICALL
210 Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl)
211 {
212 #ifdef __solaris__
213 return JNI_TRUE;
214 #else
215 return JNI_FALSE;
216 #endif
217 }
218
219 JNIEXPORT int JNICALL
220 Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6,
221 jboolean stream, jboolean reuse)
718 handleSocketError(env, errno);
719 return -1;
720 }
721 return (jint)index;
722 }
723
724 JNIEXPORT void JNICALL
725 Java_sun_nio_ch_Net_shutdown(JNIEnv *env, jclass cl, jobject fdo, jint jhow)
726 {
727 int how = (jhow == sun_nio_ch_Net_SHUT_RD) ? SHUT_RD :
728 (jhow == sun_nio_ch_Net_SHUT_WR) ? SHUT_WR : SHUT_RDWR;
729 if ((shutdown(fdval(env, fdo), how) < 0) && (errno != ENOTCONN))
730 handleSocketError(env, errno);
731 }
732
733 JNIEXPORT jint JNICALL
734 Java_sun_nio_ch_Net_poll(JNIEnv* env, jclass this, jobject fdo, jint events, jlong timeout)
735 {
736 struct pollfd pfd;
737 int rv;
738 pfd.fd = fdval(env, fdo);
739 pfd.events = events;
740 rv = poll(&pfd, 1, timeout);
741
742 if (rv >= 0) {
743 return pfd.revents;
744 } else if (errno == EINTR) {
745 return IOS_INTERRUPTED;
746 } else {
747 handleSocketError(env, errno);
748 return IOS_THROWN;
749 }
750 }
751
752
753 /* Declared in nio_util.h */
754
755 jint
756 handleSocketError(JNIEnv *env, jint errorValue)
757 {
758 char *xn;
759 switch (errorValue) {
760 case EINPROGRESS: /* Non-blocking connect */
761 return 0;
762 #ifdef EPROTO
763 case EPROTO:
|
86 #define MCAST_LEAVE_SOURCE_GROUP 67
87
88 #else
89
90 #define MCAST_JOIN_SOURCE_GROUP 82 /* join a source-specific group */
91 #define MCAST_LEAVE_SOURCE_GROUP 83 /* leave a single source */
92 #define MCAST_BLOCK_SOURCE 84 /* block a source */
93 #define MCAST_UNBLOCK_SOURCE 85 /* unblock a source */
94
95 #endif /* _AIX */
96
97 #endif /* MCAST_BLOCK_SOURCE */
98
99 #ifndef IPV6_ADD_MEMBERSHIP
100
101 #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
102 #define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
103
104 #endif /* IPV6_ADD_MEMBERSHIP */
105
106 #if defined(_AIX)
107
108 struct my_ip_mreq_source {
109 struct in_addr imr_multiaddr;
110 struct in_addr imr_sourceaddr;
111 struct in_addr imr_interface;
112 };
113
114 #else
115
116 struct my_ip_mreq_source {
117 struct in_addr imr_multiaddr;
118 struct in_addr imr_interface;
119 struct in_addr imr_sourceaddr;
120 };
121
122 #endif /* _AIX */
123
124 struct my_group_source_req {
125 uint32_t gsr_interface; /* interface index */
126 struct sockaddr_storage gsr_group; /* group address */
127 struct sockaddr_storage gsr_source; /* source address */
128 };
129
130 #else /* _ALLBSD_SOURCE */
131
132 #define my_ip_mreq_source ip_mreq_source
133 #define my_group_source_req group_source_req
134
135 #endif
136
137
138 #define COPY_INET6_ADDRESS(env, source, target) \
139 (*env)->GetByteArrayRegion(env, source, 0, 16, target)
140
141 /*
142 * Copy IPv6 group, interface index, and IPv6 source address
143 * into group_source_req structure.
193 JNIEXPORT void JNICALL
194 Java_sun_nio_ch_Net_initIDs(JNIEnv *env, jclass clazz)
195 {
196 /* Here because Windows native code does need to init IDs */
197 }
198
199 JNIEXPORT jboolean JNICALL
200 Java_sun_nio_ch_Net_isIPv6Available0(JNIEnv* env, jclass cl)
201 {
202 return (ipv6_available()) ? JNI_TRUE : JNI_FALSE;
203 }
204
205 JNIEXPORT jint JNICALL
206 Java_sun_nio_ch_Net_isExclusiveBindAvailable(JNIEnv *env, jclass clazz) {
207 return -1;
208 }
209
210 JNIEXPORT jboolean JNICALL
211 Java_sun_nio_ch_Net_canIPv6SocketJoinIPv4Group0(JNIEnv* env, jclass cl)
212 {
213 #if defined(MACOSX) || defined(_AIX)
214 /* for now IPv6 sockets cannot join IPv4 multicast groups */
215 return JNI_FALSE;
216 #else
217 return JNI_TRUE;
218 #endif
219 }
220
221 JNIEXPORT jboolean JNICALL
222 Java_sun_nio_ch_Net_canJoin6WithIPv4Group0(JNIEnv* env, jclass cl)
223 {
224 #ifdef __solaris__
225 return JNI_TRUE;
226 #else
227 return JNI_FALSE;
228 #endif
229 }
230
231 JNIEXPORT int JNICALL
232 Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6,
233 jboolean stream, jboolean reuse)
730 handleSocketError(env, errno);
731 return -1;
732 }
733 return (jint)index;
734 }
735
736 JNIEXPORT void JNICALL
737 Java_sun_nio_ch_Net_shutdown(JNIEnv *env, jclass cl, jobject fdo, jint jhow)
738 {
739 int how = (jhow == sun_nio_ch_Net_SHUT_RD) ? SHUT_RD :
740 (jhow == sun_nio_ch_Net_SHUT_WR) ? SHUT_WR : SHUT_RDWR;
741 if ((shutdown(fdval(env, fdo), how) < 0) && (errno != ENOTCONN))
742 handleSocketError(env, errno);
743 }
744
745 JNIEXPORT jint JNICALL
746 Java_sun_nio_ch_Net_poll(JNIEnv* env, jclass this, jobject fdo, jint events, jlong timeout)
747 {
748 struct pollfd pfd;
749 int rv;
750 #ifdef _AIX
751 /* The hard coded event constants from Java do not match system values on AIX. */
752 events = javaToNativeEvents(events);
753 #endif
754
755 pfd.fd = fdval(env, fdo);
756 pfd.events = events;
757 rv = poll(&pfd, 1, timeout);
758
759 if (rv >= 0) {
760 #ifdef _AIX
761 return nativeToJavaEvents(pfd.revents);
762 #else
763 return pfd.revents;
764 #endif
765 } else if (errno == EINTR) {
766 return IOS_INTERRUPTED;
767 } else {
768 handleSocketError(env, errno);
769 return IOS_THROWN;
770 }
771 }
772
773
774 /* Declared in nio_util.h */
775
776 jint
777 handleSocketError(JNIEnv *env, jint errorValue)
778 {
779 char *xn;
780 switch (errorValue) {
781 case EINPROGRESS: /* Non-blocking connect */
782 return 0;
783 #ifdef EPROTO
784 case EPROTO:
|