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 |