equal
deleted
inserted
replaced
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 |
53 |
|
54 #define PATHLEN(len) (len - offsetof(struct sockaddr_un, sun_path)) |
|
55 |
54 JNIEXPORT jobject JNICALL |
56 JNIEXPORT jobject JNICALL |
55 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa) { |
57 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa, socklen_t len) { |
56 |
58 |
57 if (sa->sun_family == AF_UNIX) { |
59 if (sa->sun_family == AF_UNIX) { |
58 char *name = sa->sun_path; |
60 char *name; |
59 |
61 |
|
62 if (PATHLEN(len) == 0) { |
|
63 name = ""; |
|
64 } else { |
|
65 name = sa->sun_path; |
|
66 } |
60 jstring nstr = JNU_NewStringPlatform(env, name); |
67 jstring nstr = JNU_NewStringPlatform(env, name); |
61 return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr); |
68 return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr); |
62 } |
69 } |
63 return NULL; |
70 return NULL; |
64 } |
71 } |
108 { |
115 { |
109 struct sockaddr_un sa; |
116 struct sockaddr_un sa; |
110 int sa_len = 0; |
117 int sa_len = 0; |
111 int rv = 0; |
118 int rv = 0; |
112 |
119 |
113 if (uaddr == NULL) |
120 if (uaddr == NULL) |
114 return; /* Rely on implicit bind */ |
121 return; /* Rely on implicit bind */ |
115 |
122 |
116 if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0) |
123 if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0) |
117 return; |
124 return; |
118 |
125 |
119 int fd = fdval(env, fdo); |
126 int fd = fdval(env, fdo); |
178 return IOS_THROWN; |
185 return IOS_THROWN; |
179 } |
186 } |
180 |
187 |
181 setfdval(env, newfdo, newfd); |
188 setfdval(env, newfdo, newfd); |
182 |
189 |
183 usa = NET_SockaddrToUnixAddress(env, &sa); |
190 usa = NET_SockaddrToUnixAddress(env, &sa, sa_len); |
184 CHECK_NULL_RETURN(usa, IOS_THROWN); |
191 CHECK_NULL_RETURN(usa, IOS_THROWN); |
185 |
192 |
186 (*env)->SetObjectArrayElement(env, usaa, 0, usa); |
193 (*env)->SetObjectArrayElement(env, usaa, 0, usa); |
187 |
194 |
188 return 1; |
195 return 1; |
196 int port; |
203 int port; |
197 if (getsockname(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) { |
204 if (getsockname(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) { |
198 handleSocketError(env, errno); |
205 handleSocketError(env, errno); |
199 return NULL; |
206 return NULL; |
200 } |
207 } |
201 return NET_SockaddrToUnixAddress(env, &sa); |
208 return NET_SockaddrToUnixAddress(env, &sa, sa_len); |
202 } |
209 } |
203 |
210 |
204 /** |
211 /** |
205 * IP_MULTICAST_ALL supported since 2.6.31 but may not be available at |
212 * IP_MULTICAST_ALL supported since 2.6.31 but may not be available at |
206 * build time. |
213 * build time. |