src/java.base/unix/native/libnio/ch/Net.c
branchunixdomainchannels
changeset 58847 692de65ab293
parent 58801 119ac9128c1b
child 58856 b2f0339a4cad
equal deleted inserted replaced
58832:203fceb089fc 58847:692de65ab293
    48 
    48 
    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 extern jfieldID udsa_isAbstractID;
       
    54 
    53 
    55 JNIEXPORT jobject JNICALL
    54 JNIEXPORT jobject JNICALL
    56 NET_SockaddrToUnixAddress(JNIEnv *env, SOCKETADDRESS *sa) {
    55 NET_SockaddrToUnixAddress(JNIEnv *env, SOCKETADDRESS *sa) {
    57     jboolean isAbstract = 0;
    56     jboolean isAbstract = 0;
    58 
    57 
    59     if (sa->sa.sa_family == AF_UNIX) {
    58     if (sa->sa.sa_family == AF_UNIX) {
    60         char *name = sa->saun.sun_path;
    59         char *name = sa->saun.sun_path;
    61 
    60 
    62 #ifdef NOTDEF
       
    63         /* check for abstract name */
       
    64         if (name[0] == 0) {
       
    65             isAbstract = 1;
       
    66             name++; // skip the zero byte
       
    67         } else
       
    68             isAbstract = 0;
       
    69 #endif
       
    70         jstring nstr = JNU_NewStringPlatform(env, name);
    61         jstring nstr = JNU_NewStringPlatform(env, name);
    71         return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr);
    62         return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr);
    72     }
    63     }
    73     return NULL;
    64     return NULL;
    74 }
    65 }
    75 
    66 
    76 JNIEXPORT jint JNICALL
    67 JNIEXPORT jint JNICALL
    77 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, SOCKETADDRESS *sa, int *len)
    68 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, SOCKETADDRESS *sa, int *len)
    78 {
    69 {
    79     jstring path = (*env)->GetObjectField(env, uaddr, udsa_pathID);
    70     jstring path = (*env)->GetObjectField(env, uaddr, udsa_pathID);
    80     //jboolean isAbstract = (*env)->GetBooleanField(env, uaddr, udsa_isAbstractID);
       
    81     jboolean isCopy;
    71     jboolean isCopy;
    82     int ret;
    72     int ret;
    83     const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy);
    73     const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy);
    84     memset(sa, 0, sizeof(SOCKETADDRESS));
    74     memset(sa, 0, sizeof(SOCKETADDRESS));
    85     sa->saun.sun_family = AF_UNIX;
    75     sa->saun.sun_family = AF_UNIX;
    87     if (name_len > MAX_UNIX_DOMAIN_PATH_LEN) {
    77     if (name_len > MAX_UNIX_DOMAIN_PATH_LEN) {
    88         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "unix domain path too long");
    78         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "unix domain path too long");
    89         ret = 1;
    79         ret = 1;
    90         goto finish;
    80         goto finish;
    91     }
    81     }
    92 #ifdef NOTDEF
    82     strncpy(&sa->saun.sun_path[0], pname, name_len);
    93     if (isAbstract) {
       
    94         strncpy(&sa->saun.sun_path[1], pname, name_len);
       
    95         sa->saun.sun_path[0] = 0;
       
    96         name_len++;
       
    97     } else
       
    98 #endif
       
    99     {
       
   100         strncpy(&sa->saun.sun_path[0], pname, name_len);
       
   101     }
       
   102     *len = offsetof(struct sockaddr_un, sun_path) + name_len;
    83     *len = offsetof(struct sockaddr_un, sun_path) + name_len;
   103     ret = 0;
    84     ret = 0;
   104   finish:
    85   finish:
   105     if (isCopy)
    86     if (isCopy)
   106         JNU_ReleaseStringPlatformChars(env, path, pname);
    87         JNU_ReleaseStringPlatformChars(env, path, pname);
   107     return ret;
    88     return ret;
   108 }
    89 }
   109 
    90 
       
    91 JNIEXPORT jboolean JNICALL
       
    92 Java_sun_nio_ch_Net_unixDomainSocketSupported(JNIEnv *env, jclass cl)
       
    93 {
       
    94     return JNI_TRUE;
       
    95 }
       
    96 
   110 JNIEXPORT jint JNICALL
    97 JNIEXPORT jint JNICALL
   111 Java_sun_nio_ch_Net_unixDomainSocket0(JNIEnv *env, jclass cl)
    98 Java_sun_nio_ch_Net_unixDomainSocket0(JNIEnv *env, jclass cl)
   112 {
    99 {
   113     int fd = socket(PF_UNIX, SOCK_STREAM, 0);
   100     int fd = socket(PF_UNIX, SOCK_STREAM, 0);
   114     if (fd < 0) {
   101     if (fd < 0) {
   115         return handleSocketError(env, errno);
   102         return handleSocketError(env, errno);
   116     }
   103     }
   117     return fd;
   104     return fd;
   118 }
       
   119 
       
   120 JNIEXPORT jboolean JNICALL
       
   121 Java_sun_nio_ch_Net_unixDomainSocketSupported(JNIEnv *env, jclass cl)
       
   122 {
       
   123     int fd = socket(PF_UNIX, SOCK_STREAM, 0);
       
   124     if (fd < 0) {
       
   125         return JNI_FALSE;
       
   126     }
       
   127     close(fd);
       
   128     return JNI_TRUE;
       
   129 }
   105 }
   130 
   106 
   131 JNIEXPORT void JNICALL
   107 JNIEXPORT void JNICALL
   132 Java_sun_nio_ch_Net_unixDomainBind(JNIEnv *env, jclass clazz, jobject fdo, jobject uaddr)
   108 Java_sun_nio_ch_Net_unixDomainBind(JNIEnv *env, jclass clazz, jobject fdo, jobject uaddr)
   133 {
   109 {
   220         handleSocketError(env, errno);
   196         handleSocketError(env, errno);
   221         return NULL;
   197         return NULL;
   222     }
   198     }
   223     return NET_SockaddrToUnixAddress(env, &sa);
   199     return NET_SockaddrToUnixAddress(env, &sa);
   224 }
   200 }
       
   201 
   225 /**
   202 /**
   226  * IP_MULTICAST_ALL supported since 2.6.31 but may not be available at
   203  * IP_MULTICAST_ALL supported since 2.6.31 but may not be available at
   227  * build time.
   204  * build time.
   228  */
   205  */
   229 #ifdef __linux__
   206 #ifdef __linux__
  1041     return convertReturnVal(env, n, JNI_FALSE);
  1018     return convertReturnVal(env, n, JNI_FALSE);
  1042 }
  1019 }
  1043 
  1020 
  1044 /* Declared in nio_util.h */
  1021 /* Declared in nio_util.h */
  1045 
  1022 
  1046 JNIEXPORT jint JNICALL
  1023 jint handleSocketError(JNIEnv *env, jint errorValue)
  1047 handleSocketError(JNIEnv *env, jint errorValue)
       
  1048 {
  1024 {
  1049     char *xn;
  1025     char *xn;
  1050     switch (errorValue) {
  1026     switch (errorValue) {
  1051         case EINPROGRESS:       /* Non-blocking connect */
  1027         case EINPROGRESS:       /* Non-blocking connect */
  1052             return 0;
  1028             return 0;