jdk/src/solaris/native/sun/nio/ch/DatagramChannelImpl.c
changeset 22631 ac85b05a53f4
parent 22605 dba3d6b22818
equal deleted inserted replaced
22630:ca4dc1b04ef3 22631:ac85b05a53f4
    54 
    54 
    55 JNIEXPORT void JNICALL
    55 JNIEXPORT void JNICALL
    56 Java_sun_nio_ch_DatagramChannelImpl_initIDs(JNIEnv *env, jclass clazz)
    56 Java_sun_nio_ch_DatagramChannelImpl_initIDs(JNIEnv *env, jclass clazz)
    57 {
    57 {
    58     clazz = (*env)->FindClass(env, "java/net/InetSocketAddress");
    58     clazz = (*env)->FindClass(env, "java/net/InetSocketAddress");
       
    59     CHECK_NULL(clazz);
    59     isa_class = (*env)->NewGlobalRef(env, clazz);
    60     isa_class = (*env)->NewGlobalRef(env, clazz);
       
    61     if (isa_class == NULL) {
       
    62         JNU_ThrowOutOfMemoryError(env, NULL);
       
    63         return;
       
    64     }
    60     isa_ctorID = (*env)->GetMethodID(env, clazz, "<init>",
    65     isa_ctorID = (*env)->GetMethodID(env, clazz, "<init>",
    61                                      "(Ljava/net/InetAddress;I)V");
    66                                      "(Ljava/net/InetAddress;I)V");
       
    67     CHECK_NULL(isa_ctorID);
    62 
    68 
    63     clazz = (*env)->FindClass(env, "sun/nio/ch/DatagramChannelImpl");
    69     clazz = (*env)->FindClass(env, "sun/nio/ch/DatagramChannelImpl");
       
    70     CHECK_NULL(clazz);
    64     dci_senderID = (*env)->GetFieldID(env, clazz, "sender",
    71     dci_senderID = (*env)->GetFieldID(env, clazz, "sender",
    65                                       "Ljava/net/SocketAddress;");
    72                                       "Ljava/net/SocketAddress;");
       
    73     CHECK_NULL(dci_senderID);
    66     dci_senderAddrID = (*env)->GetFieldID(env, clazz,
    74     dci_senderAddrID = (*env)->GetFieldID(env, clazz,
    67                                           "cachedSenderInetAddress",
    75                                           "cachedSenderInetAddress",
    68                                           "Ljava/net/InetAddress;");
    76                                           "Ljava/net/InetAddress;");
       
    77     CHECK_NULL(dci_senderAddrID);
    69     dci_senderPortID = (*env)->GetFieldID(env, clazz,
    78     dci_senderPortID = (*env)->GetFieldID(env, clazz,
    70                                           "cachedSenderPort", "I");
    79                                           "cachedSenderPort", "I");
       
    80     CHECK_NULL(dci_senderPortID);
    71 }
    81 }
    72 
    82 
    73 JNIEXPORT void JNICALL
    83 JNIEXPORT void JNICALL
    74 Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this,
    84 Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this,
    75                                                 jobject fdo, jboolean isIPv6)
    85                                                 jobject fdo, jboolean isIPv6)
   119         /* See W. Richard Stevens, "UNIX Network Programming, Volume 1", p. 254:
   129         /* See W. Richard Stevens, "UNIX Network Programming, Volume 1", p. 254:
   120          * 'Setting the address family to AF_UNSPEC might return EAFNOSUPPORT
   130          * 'Setting the address family to AF_UNSPEC might return EAFNOSUPPORT
   121          * but that is acceptable.
   131          * but that is acceptable.
   122          */
   132          */
   123         if (rv < 0 && errno == EAFNOSUPPORT)
   133         if (rv < 0 && errno == EAFNOSUPPORT)
   124                 rv = errno = 0;
   134             rv = errno = 0;
   125 #endif
   135 #endif
   126     }
   136     }
   127 #endif
   137 #endif
   128 
   138 
   129     if (rv < 0)
   139     if (rv < 0)
   190         }
   200         }
   191     }
   201     }
   192     if (senderAddr == NULL) {
   202     if (senderAddr == NULL) {
   193         jobject isa = NULL;
   203         jobject isa = NULL;
   194         int port;
   204         int port;
   195         jobject ia = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa,
   205         jobject ia = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port);
   196                                                &port);
       
   197 
       
   198         if (ia != NULL) {
   206         if (ia != NULL) {
   199             isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
   207             isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
   200         }
   208         }
   201 
   209         CHECK_NULL_RETURN(isa, IOS_THROWN);
   202         if (isa == NULL) {
       
   203             JNU_ThrowOutOfMemoryError(env, "heap allocation failed");
       
   204             return IOS_THROWN;
       
   205         }
       
   206 
   210 
   207         (*env)->SetObjectField(env, this, dci_senderAddrID, ia);
   211         (*env)->SetObjectField(env, this, dci_senderAddrID, ia);
   208         (*env)->SetIntField(env, this, dci_senderPortID,
   212         (*env)->SetIntField(env, this, dci_senderPortID,
   209                             NET_GetPortFromSockaddr((struct sockaddr *)&sa));
   213                             NET_GetPortFromSockaddr((struct sockaddr *)&sa));
   210         (*env)->SetObjectField(env, this, dci_senderID, isa);
   214         (*env)->SetObjectField(env, this, dci_senderID, isa);