src/solaris/native/sun/nio/ch/Net.c

Print this page
rev 8975 : 8031581: PPC64: Addons and fixes for AIX to pass the jdk regression tests


  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: