src/java.base/windows/native/libnio/ch/Net.c
branchunixdomainchannels
changeset 59090 fb91b01624be
parent 59082 5e250ee9259e
child 59111 31b8ffbfe1b9
equal deleted inserted replaced
59082:5e250ee9259e 59090:fb91b01624be
    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(len) (len - offsetof(struct sockaddr_un, sun_path))
    93 #define PATHLEN_UN(len) (len - offsetof(struct sockaddr_un, sun_path))
    94 
    94 
    95 JNIEXPORT jobject JNICALL
    95 JNIEXPORT jobject JNICALL
    96 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa, socklen_t len) {
    96 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa, socklen_t len) {
    97 
    97 
    98     if (sa->sun_family == AF_UNIX) {
    98     if (sa->sun_family == AF_UNIX) {
    99         char *name;
    99         char *name;
   100 
   100 
   101         if (PATHLEN(len) == 0) {
   101         if (PATHLEN_UN(len) == 0) {
   102             name = "";
   102             name = "";
   103         } else {
   103         } else {
   104             name = sa->sun_path;
   104             name = sa->sun_path;
   105         }
   105         }
   106         jstring nstr = JNU_NewStringPlatform(env, name);
   106         jstring nstr = JNU_NewStringPlatform(env, name);
   110 }
   110 }
   111 
   111 
   112 JNIEXPORT jint JNICALL
   112 JNIEXPORT jint JNICALL
   113 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, struct sockaddr_un *sa, int *len)
   113 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, struct sockaddr_un *sa, int *len)
   114 {
   114 {
   115     jstring path = (*env)->GetObjectField(env, uaddr, udsa_pathID);
   115     jstring path;
       
   116     memset(sa, 0, sizeof(struct sockaddr_un));
       
   117     sa->sun_family = AF_UNIX;
       
   118     if (uaddr == NULL) {
       
   119         *len = (int)(offsetof(struct sockaddr_un, sun_path));
       
   120         return 0;
       
   121     }
       
   122     path = (*env)->GetObjectField(env, uaddr, udsa_pathID);
   116     jboolean isCopy;
   123     jboolean isCopy;
   117     int ret;
   124     int ret;
   118     const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy);
   125     const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy);
   119     memset(sa, 0, sizeof(struct sockaddr_un));
       
   120     sa->sun_family = AF_UNIX;
       
   121     size_t name_len = strlen(pname)+1;
   126     size_t name_len = strlen(pname)+1;
   122     if (name_len > MAX_UNIX_DOMAIN_PATH_LEN) {
   127     if (name_len > MAX_UNIX_DOMAIN_PATH_LEN) {
   123         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "unix domain path too long");
   128         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "unix domain path too long");
   124         ret = 1;
   129         ret = 1;
   125         goto finish;
   130         goto finish;
   147 JNIEXPORT jint JNICALL
   152 JNIEXPORT jint JNICALL
   148 Java_sun_nio_ch_Net_unixDomainSocket0(JNIEnv *env, jclass cl)
   153 Java_sun_nio_ch_Net_unixDomainSocket0(JNIEnv *env, jclass cl)
   149 {
   154 {
   150     SOCKET fd = socket(PF_UNIX, SOCK_STREAM, 0);
   155     SOCKET fd = socket(PF_UNIX, SOCK_STREAM, 0);
   151     if (fd == INVALID_SOCKET) {
   156     if (fd == INVALID_SOCKET) {
   152         return handleSocketError(env, errno);
   157         return handleSocketError(env, WSAGetLastError());
   153     }
   158     }
   154     return (int)fd;
   159     return (int)fd;
   155 }
   160 }
   156 
   161 
   157 JNIEXPORT void JNICALL
   162 JNIEXPORT void JNICALL
   158 Java_sun_nio_ch_Net_unixDomainBind(JNIEnv *env, jclass clazz, jobject fdo, jobject uaddr)
   163 Java_sun_nio_ch_Net_unixDomainBind(JNIEnv *env, jclass clazz, jobject fdo, jobject uaddr)
   159 {
   164 {
   160     struct sockaddr_un sa;
   165     struct sockaddr_un sa;
   161     int sa_len = 0;
   166     int sa_len = 0;
   162     int rv = 0;
   167     int rv = 0;
       
   168 
       
   169 /*
       
   170     if (uaddr == NULL)
       
   171         return;
       
   172 */
   163 
   173 
   164     if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0)
   174     if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0)
   165         return;
   175         return;
   166 
   176 
   167     int fd = fdval(env, fdo);
   177     int fd = fdval(env, fdo);
   241 Java_sun_nio_ch_Net_localUnixAddress(JNIEnv *env, jclass clazz, jobject fdo)
   251 Java_sun_nio_ch_Net_localUnixAddress(JNIEnv *env, jclass clazz, jobject fdo)
   242 {
   252 {
   243     struct sockaddr_un sa;
   253     struct sockaddr_un sa;
   244     socklen_t sa_len = sizeof(sa);
   254     socklen_t sa_len = sizeof(sa);
   245     if (getsockname(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) {
   255     if (getsockname(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) {
   246         handleSocketError(env, errno);
   256         handleSocketError(env, WSAGetLastError());
   247         return NULL;
   257         return NULL;
   248     }
   258     }
   249     return NET_SockaddrToUnixAddress(env, &sa, sa_len);
   259     return NET_SockaddrToUnixAddress(env, &sa, sa_len);
   250 }
   260 }
   251 
   261