jdk/src/jdk.sctp/unix/native/libsctp/SctpNet.c
changeset 43100 a7e3457672c7
parent 41380 c27cf95dd7e6
equal deleted inserted replaced
43099:47f8baf1fcbd 43100:a7e3457672c7
   209  */
   209  */
   210 JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_bindx
   210 JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_bindx
   211   (JNIEnv *env, jclass klass, jint fd, jobjectArray addrs, jint port,
   211   (JNIEnv *env, jclass klass, jint fd, jobjectArray addrs, jint port,
   212    jint addrsLength, jboolean add, jboolean preferIPv6) {
   212    jint addrsLength, jboolean add, jboolean preferIPv6) {
   213     SOCKETADDRESS *sap, *tmpSap;
   213     SOCKETADDRESS *sap, *tmpSap;
   214     int i, sa_len = sizeof(SOCKETADDRESS);
   214     int i;
   215     jobject ia;
   215     jobject ia;
   216 
   216 
   217     if (addrsLength < 1)
   217     if (addrsLength < 1)
   218         return;
   218         return;
   219 
   219 
   220     if ((sap = calloc(addrsLength, sa_len)) == NULL) {
   220     if ((sap = calloc(addrsLength, sizeof(SOCKETADDRESS))) == NULL) {
   221           JNU_ThrowOutOfMemoryError(env, "heap allocation failure");
   221         JNU_ThrowOutOfMemoryError(env, "heap allocation failure");
   222         return;
   222         return;
   223     }
   223     }
   224 
   224 
   225     tmpSap = sap;
   225     tmpSap = sap;
   226     for (i = 0; i < addrsLength; i++) {
   226     for (i = 0; i < addrsLength; i++) {
   227         ia = (*env)->GetObjectArrayElement(env, addrs, i);
   227         ia = (*env)->GetObjectArrayElement(env, addrs, i);
   228         if (NET_InetAddressToSockaddr(env, ia, port, (struct sockaddr*)tmpSap,
   228         if (NET_InetAddressToSockaddr(env, ia, port, tmpSap, NULL,
   229                                       &sa_len, preferIPv6) != 0) {
   229                                       preferIPv6) != 0) {
   230             free(sap);
   230             free(sap);
   231             return;
   231             return;
   232         }
   232         }
   233         tmpSap++;
   233         tmpSap++;
   234     }
   234     }
   260  */
   260  */
   261 JNIEXPORT jint JNICALL
   261 JNIEXPORT jint JNICALL
   262 Java_sun_nio_ch_sctp_SctpNet_connect0
   262 Java_sun_nio_ch_sctp_SctpNet_connect0
   263   (JNIEnv *env, jclass clazz, int fd, jobject iao, jint port) {
   263   (JNIEnv *env, jclass clazz, int fd, jobject iao, jint port) {
   264     SOCKETADDRESS sa;
   264     SOCKETADDRESS sa;
   265     int sa_len = sizeof(SOCKETADDRESS);
   265     int sa_len = 0;
   266     int rv;
   266     int rv;
   267 
   267 
   268     if (NET_InetAddressToSockaddr(env, iao, port, &sa.sa,
   268     if (NET_InetAddressToSockaddr(env, iao, port, &sa, &sa_len,
   269                                   &sa_len, JNI_TRUE) != 0) {
   269                                   JNI_TRUE) != 0) {
   270         return IOS_THROWN;
   270         return IOS_THROWN;
   271     }
   271     }
   272 
   272 
   273     rv = connect(fd, &sa.sa, sa_len);
   273     rv = connect(fd, &sa.sa, sa_len);
   274     if (rv != 0) {
   274     if (rv != 0) {
   309         if (dup2(preCloseFD, fd) < 0)
   309         if (dup2(preCloseFD, fd) < 0)
   310             JNU_ThrowIOExceptionWithLastError(env, "dup2 failed");
   310             JNU_ThrowIOExceptionWithLastError(env, "dup2 failed");
   311     }
   311     }
   312 }
   312 }
   313 
   313 
   314 void initializeISA
   314 void initializeISA(JNIEnv* env) {
   315   (JNIEnv* env) {
       
   316     if (isaCls == 0) {
   315     if (isaCls == 0) {
   317         jclass c = (*env)->FindClass(env, "java/net/InetSocketAddress");
   316         jclass c = (*env)->FindClass(env, "java/net/InetSocketAddress");
   318         CHECK_NULL(c);
   317         CHECK_NULL(c);
   319         isaCtrID = (*env)->GetMethodID(env, c, "<init>",
   318         isaCtrID = (*env)->GetMethodID(env, c, "<init>",
   320                                      "(Ljava/net/InetAddress;I)V");
   319                                      "(Ljava/net/InetAddress;I)V");
   323         CHECK_NULL(isaCls);
   322         CHECK_NULL(isaCls);
   324         (*env)->DeleteLocalRef(env, c);
   323         (*env)->DeleteLocalRef(env, c);
   325     }
   324     }
   326 }
   325 }
   327 
   326 
   328 jobject SockAddrToInetSocketAddress
   327 jobject SockAddrToInetSocketAddress(JNIEnv *env, SOCKETADDRESS *sap) {
   329   (JNIEnv *env, struct sockaddr* sap) {
       
   330     int port = 0;
   328     int port = 0;
   331 
   329 
   332     jobject ia = NET_SockaddrToInetAddress(env, sap, &port);
   330     jobject ia = NET_SockaddrToInetAddress(env, sap, &port);
   333     if (ia == NULL)
   331     if (ia == NULL)
   334         return NULL;
   332         return NULL;
   345  * Class:     sun_nio_ch_sctp_SctpNet
   343  * Class:     sun_nio_ch_sctp_SctpNet
   346  * Method:    getLocalAddresses0
   344  * Method:    getLocalAddresses0
   347  * Signature: (I)[Ljava/net/SocketAddress;
   345  * Signature: (I)[Ljava/net/SocketAddress;
   348  */
   346  */
   349 JNIEXPORT jobjectArray JNICALL Java_sun_nio_ch_sctp_SctpNet_getLocalAddresses0
   347 JNIEXPORT jobjectArray JNICALL Java_sun_nio_ch_sctp_SctpNet_getLocalAddresses0
   350   (JNIEnv *env, jclass klass, jint fd) {
   348   (JNIEnv *env, jclass klass, jint fd)
       
   349 {
   351     void *addr_buf, *laddr;
   350     void *addr_buf, *laddr;
   352     struct sockaddr* sap;
       
   353     int i, addrCount;
   351     int i, addrCount;
   354     jobjectArray isaa;
   352     jobjectArray isaa;
   355 
   353 
   356 #ifdef __solaris__
   354 #ifdef __solaris__
   357     if ((addrCount = nio_sctp_getladdrs(fd, 0, (void **)&addr_buf)) == -1) {
   355     if ((addrCount = nio_sctp_getladdrs(fd, 0, (void **)&addr_buf)) == -1) {
   375         nio_sctp_freeladdrs(addr_buf);
   373         nio_sctp_freeladdrs(addr_buf);
   376         return NULL;
   374         return NULL;
   377     }
   375     }
   378 
   376 
   379     laddr = addr_buf;
   377     laddr = addr_buf;
   380     for (i=0; i<addrCount; i++) {
   378     for (i = 0; i < addrCount; i++) {
   381         int port = 0;
   379         int port = 0;
   382         jobject isa = NULL, ia;
   380         jobject ia, isa = NULL;
   383         sap = (struct sockaddr*)addr_buf;
   381         ia = NET_SockaddrToInetAddress(env, (SOCKETADDRESS *)addr_buf, &port);
   384         ia = NET_SockaddrToInetAddress(env, sap, &port);
       
   385         if (ia != NULL)
   382         if (ia != NULL)
   386             isa = (*env)->NewObject(env, isaCls, isaCtrID, ia, port);
   383             isa = (*env)->NewObject(env, isaCls, isaCtrID, ia, port);
   387         if (isa == NULL)
   384         if (isa == NULL)
   388             break;
   385             break;
   389         (*env)->SetObjectArrayElement(env, isaa, i, isa);
   386         (*env)->SetObjectArrayElement(env, isaa, i, isa);
   390 
   387 
   391         if (sap->sa_family == AF_INET)
   388         if (((struct sockaddr *)addr_buf)->sa_family == AF_INET)
   392             addr_buf = ((struct sockaddr_in*)addr_buf) + 1;
   389             addr_buf = ((struct sockaddr_in *)addr_buf) + 1;
   393         else
   390         else
   394             addr_buf = ((struct sockaddr_in6*)addr_buf) + 1;
   391             addr_buf = ((struct sockaddr_in6 *)addr_buf) + 1;
   395     }
   392     }
   396 
   393 
   397     nio_sctp_freeladdrs(laddr);
   394     nio_sctp_freeladdrs(laddr);
   398     return isaa;
   395     return isaa;
   399 }
   396 }
   400 
   397 
   401 jobjectArray getRemoteAddresses
   398 jobjectArray getRemoteAddresses(JNIEnv *env, jint fd, sctp_assoc_t id) {
   402   (JNIEnv *env, jint fd, sctp_assoc_t id) {
       
   403     void *addr_buf, *paddr;
   399     void *addr_buf, *paddr;
   404     struct sockaddr* sap;
       
   405     int i, addrCount;
   400     int i, addrCount;
   406     jobjectArray isaa;
   401     jobjectArray isaa;
   407 
   402 
   408 #if __solaris__
   403 #if __solaris__
   409     if ((addrCount = nio_sctp_getpaddrs(fd, id, (void **)&addr_buf)) == -1) {
   404     if ((addrCount = nio_sctp_getpaddrs(fd, id, (void **)&addr_buf)) == -1) {
   410 #else /* __linux__ */
   405 #else /* __linux__ */
   411     if ((addrCount = nio_sctp_getpaddrs(fd, id, (struct sockaddr**)&addr_buf)) == -1) {
   406     if ((addrCount = nio_sctp_getpaddrs(fd, id, (struct sockaddr **)&addr_buf)) == -1) {
   412 #endif
   407 #endif
   413         handleSocketError(env, errno);
   408         handleSocketError(env, errno);
   414         return NULL;
   409         return NULL;
   415     }
   410     }
   416 
   411 
   427         nio_sctp_freepaddrs(addr_buf);
   422         nio_sctp_freepaddrs(addr_buf);
   428         return NULL;
   423         return NULL;
   429     }
   424     }
   430 
   425 
   431     paddr = addr_buf;
   426     paddr = addr_buf;
   432     for (i=0; i<addrCount; i++) {
   427     for (i = 0; i < addrCount; i++) {
       
   428         int port = 0;
   433         jobject ia, isa = NULL;
   429         jobject ia, isa = NULL;
   434         int port = 0;
   430         ia = NET_SockaddrToInetAddress(env, (SOCKETADDRESS *)addr_buf, &port);
   435         sap = (struct sockaddr*)addr_buf;
       
   436         ia = NET_SockaddrToInetAddress(env, sap, &port);
       
   437         if (ia != NULL)
   431         if (ia != NULL)
   438             isa = (*env)->NewObject(env, isaCls, isaCtrID, ia, port);
   432             isa = (*env)->NewObject(env, isaCls, isaCtrID, ia, port);
   439         if (isa == NULL)
   433         if (isa == NULL)
   440             break;
   434             break;
   441         (*env)->SetObjectArrayElement(env, isaa, i, isa);
   435         (*env)->SetObjectArrayElement(env, isaa, i, isa);
   442 
   436 
   443         if (sap->sa_family == AF_INET)
   437         if (((struct sockaddr *)addr_buf)->sa_family == AF_INET)
   444             addr_buf = ((struct sockaddr_in*)addr_buf) + 1;
   438             addr_buf = ((struct sockaddr_in *)addr_buf) + 1;
   445         else
   439         else
   446             addr_buf = ((struct sockaddr_in6*)addr_buf) + 1;
   440             addr_buf = ((struct sockaddr_in6 *)addr_buf) + 1;
   447     }
   441     }
   448 
   442 
   449     nio_sctp_freepaddrs(paddr);
   443     nio_sctp_freepaddrs(paddr);
   450 
       
   451     return isaa;
   444     return isaa;
   452 }
   445 }
   453 
   446 
   454  /*
   447  /*
   455  * Class:     sun_nio_ch_sctp_SctpNet
   448  * Class:     sun_nio_ch_sctp_SctpNet
   577  */
   570  */
   578 JNIEXPORT jobject JNICALL Java_sun_nio_ch_sctp_SctpNet_getPrimAddrOption0
   571 JNIEXPORT jobject JNICALL Java_sun_nio_ch_sctp_SctpNet_getPrimAddrOption0
   579   (JNIEnv *env, jclass klass, jint fd, jint assocId) {
   572   (JNIEnv *env, jclass klass, jint fd, jint assocId) {
   580     struct sctp_setprim prim;
   573     struct sctp_setprim prim;
   581     unsigned int prim_len = sizeof(prim);
   574     unsigned int prim_len = sizeof(prim);
   582     struct sockaddr* sap = (struct sockaddr*)&prim.ssp_addr;
       
   583 
   575 
   584     prim.ssp_assoc_id = assocId;
   576     prim.ssp_assoc_id = assocId;
   585 
   577 
   586     if (getsockopt(fd, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, &prim, &prim_len) < 0) {
   578     if (getsockopt(fd, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, &prim, &prim_len) < 0) {
   587         JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
   579         JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
   588                                      "sun.nio.ch.SctpNet.getPrimAddrOption0");
   580                                      "sun.nio.ch.SctpNet.getPrimAddrOption0");
   589         return NULL;
   581         return NULL;
   590     }
   582     }
   591 
   583 
   592     return SockAddrToInetSocketAddress(env, sap);
   584     return SockAddrToInetSocketAddress(env, (SOCKETADDRESS *)&prim.ssp_addr);
   593 }
   585 }
   594 
   586 
   595 /*
   587 /*
   596  * Class:     sun_nio_ch_sctp_SctpNet
   588  * Class:     sun_nio_ch_sctp_SctpNet
   597  * Method:    setPrimAddrOption0
   589  * Method:    setPrimAddrOption0
   598  * Signature: (IILjava/net/InetAddress;I)V
   590  * Signature: (IILjava/net/InetAddress;I)V
   599  */
   591  */
   600 JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_setPrimAddrOption0
   592 JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_setPrimAddrOption0
   601   (JNIEnv *env, jclass klass, jint fd, jint assocId, jobject iaObj, jint port) {
   593   (JNIEnv *env, jclass klass, jint fd, jint assocId, jobject iaObj, jint port) {
   602     struct sctp_setprim prim;
   594     struct sctp_setprim prim;
   603     struct sockaddr* sap = (struct sockaddr*)&prim.ssp_addr;
   595 
   604     int sap_len = sizeof(sap);
   596     if (NET_InetAddressToSockaddr(env, iaObj, port,
   605 
   597                                   (SOCKETADDRESS *)&prim.ssp_addr,
   606     if (NET_InetAddressToSockaddr(env, iaObj, port, sap,
   598                                   NULL, JNI_TRUE) != 0) {
   607                                   &sap_len, JNI_TRUE) != 0) {
       
   608         return;
   599         return;
   609     }
   600     }
   610 
   601 
   611     prim.ssp_assoc_id = assocId;
   602     prim.ssp_assoc_id = assocId;
   612 
   603 
   623  */
   614  */
   624 JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_setPeerPrimAddrOption0
   615 JNIEXPORT void JNICALL Java_sun_nio_ch_sctp_SctpNet_setPeerPrimAddrOption0
   625   (JNIEnv *env, jclass klass, jint fd, jint assocId,
   616   (JNIEnv *env, jclass klass, jint fd, jint assocId,
   626    jobject iaObj, jint port, jboolean preferIPv6) {
   617    jobject iaObj, jint port, jboolean preferIPv6) {
   627     struct sctp_setpeerprim prim;
   618     struct sctp_setpeerprim prim;
   628     struct sockaddr* sap = (struct sockaddr*)&prim.sspp_addr;
   619 
   629     int sap_len = sizeof(sap);
   620     if (NET_InetAddressToSockaddr(env, iaObj, port,
   630 
   621                                   (SOCKETADDRESS *)&prim.sspp_addr,
   631     if (NET_InetAddressToSockaddr(env, iaObj, port, sap,
   622                                   NULL, preferIPv6) != 0) {
   632                                   &sap_len, preferIPv6) != 0) {
       
   633         return;
   623         return;
   634     }
   624     }
   635 
   625 
   636     prim.sspp_assoc_id = assocId;
   626     prim.sspp_assoc_id = assocId;
   637 
   627 
   638     if (setsockopt(fd, IPPROTO_SCTP, SCTP_SET_PEER_PRIMARY_ADDR, &prim,
   628     if (setsockopt(fd, IPPROTO_SCTP, SCTP_SET_PEER_PRIMARY_ADDR, &prim,
   639             sizeof(prim)) < 0) {
   629                    sizeof(prim)) < 0) {
   640         JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
   630         JNU_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
   641                                      "sun.nio.ch.SctpNet.setPeerPrimAddrOption0");
   631                                      "sun.nio.ch.SctpNet.setPeerPrimAddrOption0");
   642     }
   632     }
   643 }
   633 }
   644 
   634