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

@@ -101,16 +101,28 @@
 #define IPV6_ADD_MEMBERSHIP     IPV6_JOIN_GROUP
 #define IPV6_DROP_MEMBERSHIP    IPV6_LEAVE_GROUP
 
 #endif /* IPV6_ADD_MEMBERSHIP */
 
+#if defined(_AIX)
+
+struct my_ip_mreq_source {
+        struct in_addr  imr_multiaddr;
+        struct in_addr  imr_sourceaddr;
+        struct in_addr  imr_interface;
+};
+
+#else
+
 struct my_ip_mreq_source {
         struct in_addr  imr_multiaddr;
         struct in_addr  imr_interface;
         struct in_addr  imr_sourceaddr;
 };
 
+#endif /* _AIX */
+
 struct my_group_source_req {
         uint32_t                gsr_interface;  /* interface index */
         struct sockaddr_storage gsr_group;      /* group address */
         struct sockaddr_storage gsr_source;     /* source address */
 };

@@ -196,11 +208,11 @@
 }
 
 JNIEXPORT jboolean JNICALL
 Java_sun_nio_ch_Net_canIPv6SocketJoinIPv4Group0(JNIEnv* env, jclass cl)
 {
-#ifdef MACOSX
+#if defined(MACOSX) || defined(_AIX)
     /* for now IPv6 sockets cannot join IPv4 multicast groups */
     return JNI_FALSE;
 #else
     return JNI_TRUE;
 #endif

@@ -733,16 +745,25 @@
 JNIEXPORT jint JNICALL
 Java_sun_nio_ch_Net_poll(JNIEnv* env, jclass this, jobject fdo, jint events, jlong timeout)
 {
     struct pollfd pfd;
     int rv;
+#ifdef _AIX
+    /* The hard coded event constants from Java do not match system values on AIX. */
+    events = javaToNativeEvents(events);
+#endif
+
     pfd.fd = fdval(env, fdo);
     pfd.events = events;
     rv = poll(&pfd, 1, timeout);
 
     if (rv >= 0) {
+#ifdef _AIX
+        return nativeToJavaEvents(pfd.revents);
+#else
         return pfd.revents;
+#endif
     } else if (errno == EINTR) {
         return IOS_INTERRUPTED;
     } else {
         handleSocketError(env, errno);
         return IOS_THROWN;