src/java.base/windows/native/libnio/ch/Net.c
branchunixdomainchannels
changeset 59111 31b8ffbfe1b9
parent 59090 fb91b01624be
equal deleted inserted replaced
59090:fb91b01624be 59111:31b8ffbfe1b9
    88 
    88 
    89 extern jclass udsa_class;
    89 extern jclass udsa_class;
    90 extern jmethodID udsa_ctorID;
    90 extern jmethodID udsa_ctorID;
    91 extern jfieldID udsa_pathID;
    91 extern jfieldID udsa_pathID;
    92 
    92 
    93 #define PATHLEN_UN(len) (len - offsetof(struct sockaddr_un, sun_path))
       
    94 
    93 
    95 JNIEXPORT jobject JNICALL
    94 JNIEXPORT jobject JNICALL
    96 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa, socklen_t len) {
    95 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa, socklen_t len) {
    97 
    96 
    98     if (sa->sun_family == AF_UNIX) {
    97     if (sa->sun_family == AF_UNIX) {
    99         char *name;
    98         jstring nstr = JNU_NewStringPlatform(env, sa->sun_path);
   100 
       
   101         if (PATHLEN_UN(len) == 0) {
       
   102             name = "";
       
   103         } else {
       
   104             name = sa->sun_path;
       
   105         }
       
   106         jstring nstr = JNU_NewStringPlatform(env, name);
       
   107         return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr);
    99         return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr);
   108     }
   100     }
   109     return NULL;
   101     return NULL;
   110 }
   102 }
   111 
   103 
   114 {
   106 {
   115     jstring path;
   107     jstring path;
   116     memset(sa, 0, sizeof(struct sockaddr_un));
   108     memset(sa, 0, sizeof(struct sockaddr_un));
   117     sa->sun_family = AF_UNIX;
   109     sa->sun_family = AF_UNIX;
   118     if (uaddr == NULL) {
   110     if (uaddr == NULL) {
       
   111  	/* Do explicit bind on Windows */
   119         *len = (int)(offsetof(struct sockaddr_un, sun_path));
   112         *len = (int)(offsetof(struct sockaddr_un, sun_path));
   120         return 0;
   113         return 0;
   121     }
   114     }
   122     path = (*env)->GetObjectField(env, uaddr, udsa_pathID);
   115     path = (*env)->GetObjectField(env, uaddr, udsa_pathID);
   123     jboolean isCopy;
   116     jboolean isCopy;
   157         return handleSocketError(env, WSAGetLastError());
   150         return handleSocketError(env, WSAGetLastError());
   158     }
   151     }
   159     return (int)fd;
   152     return (int)fd;
   160 }
   153 }
   161 
   154 
       
   155 /**
       
   156  * Windows does not support auto bind. So, the windows version of NET_UnixSocketAddressToSockaddr
       
   157  * looks out for a null 'uaddr' and handles it specially
       
   158  */
   162 JNIEXPORT void JNICALL
   159 JNIEXPORT void JNICALL
   163 Java_sun_nio_ch_Net_unixDomainBind(JNIEnv *env, jclass clazz, jobject fdo, jobject uaddr)
   160 Java_sun_nio_ch_Net_unixDomainBind(JNIEnv *env, jclass clazz, jobject fdo, jobject uaddr)
   164 {
   161 {
   165     struct sockaddr_un sa;
   162     struct sockaddr_un sa;
   166     int sa_len = 0;
   163     int sa_len = 0;
   167     int rv = 0;
   164     int rv = 0;
   168 
       
   169 /*
       
   170     if (uaddr == NULL)
       
   171         return;
       
   172 */
       
   173 
   165 
   174     if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0)
   166     if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0)
   175         return;
   167         return;
   176 
   168 
   177     int fd = fdval(env, fdo);
   169     int fd = fdval(env, fdo);