equal
deleted
inserted
replaced
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); |