48 |
48 |
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 extern jfieldID udsa_isAbstractID; |
|
54 |
53 |
55 JNIEXPORT jobject JNICALL |
54 JNIEXPORT jobject JNICALL |
56 NET_SockaddrToUnixAddress(JNIEnv *env, SOCKETADDRESS *sa) { |
55 NET_SockaddrToUnixAddress(JNIEnv *env, SOCKETADDRESS *sa) { |
57 jboolean isAbstract = 0; |
56 jboolean isAbstract = 0; |
58 |
57 |
59 if (sa->sa.sa_family == AF_UNIX) { |
58 if (sa->sa.sa_family == AF_UNIX) { |
60 char *name = sa->saun.sun_path; |
59 char *name = sa->saun.sun_path; |
61 |
60 |
62 #ifdef NOTDEF |
|
63 /* check for abstract name */ |
|
64 if (name[0] == 0) { |
|
65 isAbstract = 1; |
|
66 name++; // skip the zero byte |
|
67 } else |
|
68 isAbstract = 0; |
|
69 #endif |
|
70 jstring nstr = JNU_NewStringPlatform(env, name); |
61 jstring nstr = JNU_NewStringPlatform(env, name); |
71 return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr); |
62 return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr); |
72 } |
63 } |
73 return NULL; |
64 return NULL; |
74 } |
65 } |
75 |
66 |
76 JNIEXPORT jint JNICALL |
67 JNIEXPORT jint JNICALL |
77 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, SOCKETADDRESS *sa, int *len) |
68 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, SOCKETADDRESS *sa, int *len) |
78 { |
69 { |
79 jstring path = (*env)->GetObjectField(env, uaddr, udsa_pathID); |
70 jstring path = (*env)->GetObjectField(env, uaddr, udsa_pathID); |
80 //jboolean isAbstract = (*env)->GetBooleanField(env, uaddr, udsa_isAbstractID); |
|
81 jboolean isCopy; |
71 jboolean isCopy; |
82 int ret; |
72 int ret; |
83 const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy); |
73 const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy); |
84 memset(sa, 0, sizeof(SOCKETADDRESS)); |
74 memset(sa, 0, sizeof(SOCKETADDRESS)); |
85 sa->saun.sun_family = AF_UNIX; |
75 sa->saun.sun_family = AF_UNIX; |
87 if (name_len > MAX_UNIX_DOMAIN_PATH_LEN) { |
77 if (name_len > MAX_UNIX_DOMAIN_PATH_LEN) { |
88 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "unix domain path too long"); |
78 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "unix domain path too long"); |
89 ret = 1; |
79 ret = 1; |
90 goto finish; |
80 goto finish; |
91 } |
81 } |
92 #ifdef NOTDEF |
82 strncpy(&sa->saun.sun_path[0], pname, name_len); |
93 if (isAbstract) { |
|
94 strncpy(&sa->saun.sun_path[1], pname, name_len); |
|
95 sa->saun.sun_path[0] = 0; |
|
96 name_len++; |
|
97 } else |
|
98 #endif |
|
99 { |
|
100 strncpy(&sa->saun.sun_path[0], pname, name_len); |
|
101 } |
|
102 *len = offsetof(struct sockaddr_un, sun_path) + name_len; |
83 *len = offsetof(struct sockaddr_un, sun_path) + name_len; |
103 ret = 0; |
84 ret = 0; |
104 finish: |
85 finish: |
105 if (isCopy) |
86 if (isCopy) |
106 JNU_ReleaseStringPlatformChars(env, path, pname); |
87 JNU_ReleaseStringPlatformChars(env, path, pname); |
107 return ret; |
88 return ret; |
108 } |
89 } |
109 |
90 |
|
91 JNIEXPORT jboolean JNICALL |
|
92 Java_sun_nio_ch_Net_unixDomainSocketSupported(JNIEnv *env, jclass cl) |
|
93 { |
|
94 return JNI_TRUE; |
|
95 } |
|
96 |
110 JNIEXPORT jint JNICALL |
97 JNIEXPORT jint JNICALL |
111 Java_sun_nio_ch_Net_unixDomainSocket0(JNIEnv *env, jclass cl) |
98 Java_sun_nio_ch_Net_unixDomainSocket0(JNIEnv *env, jclass cl) |
112 { |
99 { |
113 int fd = socket(PF_UNIX, SOCK_STREAM, 0); |
100 int fd = socket(PF_UNIX, SOCK_STREAM, 0); |
114 if (fd < 0) { |
101 if (fd < 0) { |
115 return handleSocketError(env, errno); |
102 return handleSocketError(env, errno); |
116 } |
103 } |
117 return fd; |
104 return fd; |
118 } |
|
119 |
|
120 JNIEXPORT jboolean JNICALL |
|
121 Java_sun_nio_ch_Net_unixDomainSocketSupported(JNIEnv *env, jclass cl) |
|
122 { |
|
123 int fd = socket(PF_UNIX, SOCK_STREAM, 0); |
|
124 if (fd < 0) { |
|
125 return JNI_FALSE; |
|
126 } |
|
127 close(fd); |
|
128 return JNI_TRUE; |
|
129 } |
105 } |
130 |
106 |
131 JNIEXPORT void JNICALL |
107 JNIEXPORT void JNICALL |
132 Java_sun_nio_ch_Net_unixDomainBind(JNIEnv *env, jclass clazz, jobject fdo, jobject uaddr) |
108 Java_sun_nio_ch_Net_unixDomainBind(JNIEnv *env, jclass clazz, jobject fdo, jobject uaddr) |
133 { |
109 { |
1041 return convertReturnVal(env, n, JNI_FALSE); |
1018 return convertReturnVal(env, n, JNI_FALSE); |
1042 } |
1019 } |
1043 |
1020 |
1044 /* Declared in nio_util.h */ |
1021 /* Declared in nio_util.h */ |
1045 |
1022 |
1046 JNIEXPORT jint JNICALL |
1023 jint handleSocketError(JNIEnv *env, jint errorValue) |
1047 handleSocketError(JNIEnv *env, jint errorValue) |
|
1048 { |
1024 { |
1049 char *xn; |
1025 char *xn; |
1050 switch (errorValue) { |
1026 switch (errorValue) { |
1051 case EINPROGRESS: /* Non-blocking connect */ |
1027 case EINPROGRESS: /* Non-blocking connect */ |
1052 return 0; |
1028 return 0; |