equal
deleted
inserted
replaced
25 |
25 |
26 #include <poll.h> |
26 #include <poll.h> |
27 #include <sys/types.h> |
27 #include <sys/types.h> |
28 #include <sys/socket.h> |
28 #include <sys/socket.h> |
29 #include <string.h> |
29 #include <string.h> |
|
30 #include <stddef.h> |
30 #include <netinet/in.h> |
31 #include <netinet/in.h> |
31 #include <netinet/tcp.h> |
32 #include <netinet/tcp.h> |
32 #include <limits.h> |
33 #include <limits.h> |
33 |
34 |
34 #include "jni.h" |
35 #include "jni.h" |
49 |
50 |
50 extern jclass udsa_class; |
51 extern jclass udsa_class; |
51 extern jmethodID udsa_ctorID; |
52 extern jmethodID udsa_ctorID; |
52 extern jfieldID udsa_pathID; |
53 extern jfieldID udsa_pathID; |
53 |
54 |
54 #define PATHLEN(len) (len - offsetof(struct sockaddr_un, sun_path)) |
55 /* Subtle platform differences in how unnamed sockets (empty path) |
|
56 * are returned from getsockname() |
|
57 */ |
|
58 #if defined(__solaris__) |
|
59 #define ZERO_PATHLEN(len) (len == 0) |
|
60 #elif defined(MACOSX) |
|
61 #define ZERO_PATHLEN(len) (JNI_FALSE) |
|
62 #else |
|
63 #define ZERO_PATHLEN(len) (len == offsetof(struct sockaddr_un, sun_path)) |
|
64 #endif |
55 |
65 |
56 JNIEXPORT jobject JNICALL |
66 JNIEXPORT jobject JNICALL |
57 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa, socklen_t len) { |
67 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa, socklen_t len) { |
58 |
68 |
59 if (sa->sun_family == AF_UNIX) { |
69 if (sa->sun_family == AF_UNIX) { |
60 char *name; |
70 char *name; |
61 |
71 |
62 if (PATHLEN(len) == 0) { |
72 if (ZERO_PATHLEN(len)) { |
63 name = ""; |
73 name = ""; |
64 } else { |
74 } else { |
65 name = sa->sun_path; |
75 name = sa->sun_path; |
66 } |
76 } |
67 jstring nstr = JNU_NewStringPlatform(env, name); |
77 jstring nstr = JNU_NewStringPlatform(env, name); |
74 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, struct sockaddr_un *sa, int *len) |
84 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, struct sockaddr_un *sa, int *len) |
75 { |
85 { |
76 jstring path; |
86 jstring path; |
77 memset(sa, 0, sizeof(struct sockaddr_un)); |
87 memset(sa, 0, sizeof(struct sockaddr_un)); |
78 sa->sun_family = AF_UNIX; |
88 sa->sun_family = AF_UNIX; |
79 if (uaddr == NULL) { |
|
80 *len = (int)(offsetof(struct sockaddr_un, sun_path)); |
|
81 return 0; |
|
82 } |
|
83 path = (*env)->GetObjectField(env, uaddr, udsa_pathID); |
89 path = (*env)->GetObjectField(env, uaddr, udsa_pathID); |
84 jboolean isCopy; |
90 jboolean isCopy; |
85 int ret; |
91 int ret; |
86 const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy); |
92 const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy); |
87 size_t name_len = strlen(pname)+1; |
93 size_t name_len = strlen(pname)+1; |
121 struct sockaddr_un sa; |
127 struct sockaddr_un sa; |
122 int sa_len = 0; |
128 int sa_len = 0; |
123 int rv = 0; |
129 int rv = 0; |
124 |
130 |
125 if (uaddr == NULL) |
131 if (uaddr == NULL) |
126 return; /* Rely on implicit bind */ |
132 return; /* Rely on implicit bind: Unix */ |
127 |
133 |
128 if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0) |
134 if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0) |
129 return; |
135 return; |
130 |
136 |
131 int fd = fdval(env, fdo); |
137 int fd = fdval(env, fdo); |