src/java.base/unix/native/libnio/ch/Net.c
branchunixdomainchannels
changeset 59082 5e250ee9259e
parent 59076 998df1368cca
child 59090 fb91b01624be
equal deleted inserted replaced
59079:7893d1012580 59082:5e250ee9259e
    49 
    49 
    50 extern jclass udsa_class;
    50 extern jclass udsa_class;
    51 extern jmethodID udsa_ctorID;
    51 extern jmethodID udsa_ctorID;
    52 extern jfieldID udsa_pathID;
    52 extern jfieldID udsa_pathID;
    53 
    53 
       
    54 #define PATHLEN(len) (len - offsetof(struct sockaddr_un, sun_path))
       
    55 
    54 JNIEXPORT jobject JNICALL
    56 JNIEXPORT jobject JNICALL
    55 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa) {
    57 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa, socklen_t len) {
    56 
    58 
    57     if (sa->sun_family == AF_UNIX) {
    59     if (sa->sun_family == AF_UNIX) {
    58         char *name = sa->sun_path;
    60         char *name;
    59 
    61 
       
    62         if (PATHLEN(len) == 0) {
       
    63             name = "";
       
    64         } else {
       
    65             name = sa->sun_path;
       
    66         }
    60         jstring nstr = JNU_NewStringPlatform(env, name);
    67         jstring nstr = JNU_NewStringPlatform(env, name);
    61         return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr);
    68         return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr);
    62     }
    69     }
    63     return NULL;
    70     return NULL;
    64 }
    71 }
   108 {
   115 {
   109     struct sockaddr_un sa;
   116     struct sockaddr_un sa;
   110     int sa_len = 0;
   117     int sa_len = 0;
   111     int rv = 0;
   118     int rv = 0;
   112 
   119 
   113     if (uaddr == NULL) 
   120     if (uaddr == NULL)
   114 	return; /* Rely on implicit bind */
   121         return; /* Rely on implicit bind */
   115 
   122 
   116     if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0)
   123     if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0)
   117         return;
   124         return;
   118 
   125 
   119     int fd = fdval(env, fdo);
   126     int fd = fdval(env, fdo);
   178         return IOS_THROWN;
   185         return IOS_THROWN;
   179     }
   186     }
   180 
   187 
   181     setfdval(env, newfdo, newfd);
   188     setfdval(env, newfdo, newfd);
   182 
   189 
   183     usa = NET_SockaddrToUnixAddress(env, &sa);
   190     usa = NET_SockaddrToUnixAddress(env, &sa, sa_len);
   184     CHECK_NULL_RETURN(usa, IOS_THROWN);
   191     CHECK_NULL_RETURN(usa, IOS_THROWN);
   185 
   192 
   186     (*env)->SetObjectArrayElement(env, usaa, 0, usa);
   193     (*env)->SetObjectArrayElement(env, usaa, 0, usa);
   187 
   194 
   188     return 1;
   195     return 1;
   196     int port;
   203     int port;
   197     if (getsockname(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) {
   204     if (getsockname(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) {
   198         handleSocketError(env, errno);
   205         handleSocketError(env, errno);
   199         return NULL;
   206         return NULL;
   200     }
   207     }
   201     return NET_SockaddrToUnixAddress(env, &sa);
   208     return NET_SockaddrToUnixAddress(env, &sa, sa_len);
   202 }
   209 }
   203 
   210 
   204 /**
   211 /**
   205  * IP_MULTICAST_ALL supported since 2.6.31 but may not be available at
   212  * IP_MULTICAST_ALL supported since 2.6.31 but may not be available at
   206  * build time.
   213  * build time.