75 DWORD bytesReturned = 0; |
75 DWORD bytesReturned = 0; |
76 WSAIoctl(s, SIO_UDP_CONNRESET, &enable, sizeof(enable), |
76 WSAIoctl(s, SIO_UDP_CONNRESET, &enable, sizeof(enable), |
77 NULL, 0, &bytesReturned, NULL, NULL); |
77 NULL, 0, &bytesReturned, NULL, NULL); |
78 } |
78 } |
79 |
79 |
80 JNIEXPORT jint JNICALL |
80 jint handleSocketError(JNIEnv *env, int errorValue) |
81 handleSocketError(JNIEnv *env, int errorValue) |
|
82 { |
81 { |
83 NET_ThrowNew(env, errorValue, NULL); |
82 NET_ThrowNew(env, errorValue, NULL); |
84 return IOS_THROWN; |
83 return IOS_THROWN; |
85 } |
84 } |
86 |
85 |
88 static jmethodID isa_ctorID; /* InetSocketAddress(InetAddress, int) */ |
87 static jmethodID isa_ctorID; /* InetSocketAddress(InetAddress, int) */ |
89 |
88 |
90 extern jclass udsa_class; |
89 extern jclass udsa_class; |
91 extern jmethodID udsa_ctorID; |
90 extern jmethodID udsa_ctorID; |
92 extern jfieldID udsa_pathID; |
91 extern jfieldID udsa_pathID; |
93 extern jfieldID udsa_isAbstractID; |
|
94 |
92 |
95 JNIEXPORT jobject JNICALL |
93 JNIEXPORT jobject JNICALL |
96 NET_SockaddrToUnixAddress(JNIEnv *env, SOCKETADDRESS *sa) { |
94 NET_SockaddrToUnixAddress(JNIEnv *env, SOCKETADDRESS *sa) { |
97 jboolean isAbstract; |
|
98 |
95 |
99 if (sa->sa.sa_family == AF_UNIX) { |
96 if (sa->sa.sa_family == AF_UNIX) { |
100 char *name = sa->saun.sun_path; |
97 char *name = sa->saun.sun_path; |
101 |
98 |
102 #ifdef NOTDEF |
|
103 /* check for abstract name */ |
|
104 if (name[0] == 0) { |
|
105 isAbstract = 1; |
|
106 name++; // skip the zero byte |
|
107 } else |
|
108 #endif |
|
109 isAbstract = 0; |
|
110 jstring nstr = JNU_NewStringPlatform(env, name); |
99 jstring nstr = JNU_NewStringPlatform(env, name); |
111 return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr); |
100 return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr); |
112 } |
101 } |
113 return NULL; |
102 return NULL; |
114 } |
103 } |
116 JNIEXPORT jint JNICALL |
105 JNIEXPORT jint JNICALL |
117 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, SOCKETADDRESS *sa, int *len) |
106 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, SOCKETADDRESS *sa, int *len) |
118 { |
107 { |
119 jstring path = (*env)->GetObjectField(env, uaddr, udsa_pathID); |
108 jstring path = (*env)->GetObjectField(env, uaddr, udsa_pathID); |
120 jboolean isCopy; |
109 jboolean isCopy; |
121 //jboolean isAbstract = (*env)->GetBooleanField(env, uaddr, udsa_isAbstractID); |
|
122 int ret; |
110 int ret; |
123 const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy); |
111 const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy); |
124 memset(sa, 0, sizeof(SOCKETADDRESS)); |
112 memset(sa, 0, sizeof(SOCKETADDRESS)); |
125 sa->saun.sun_family = AF_UNIX; |
113 sa->saun.sun_family = AF_UNIX; |
126 size_t name_len = strlen(pname)+1; |
114 size_t name_len = strlen(pname)+1; |
127 if (name_len > MAX_UNIX_DOMAIN_PATH_LEN) { |
115 if (name_len > MAX_UNIX_DOMAIN_PATH_LEN) { |
128 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "unix domain path too long"); |
116 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "unix domain path too long"); |
129 ret = 1; |
117 ret = 1; |
130 goto finish; |
118 goto finish; |
131 } |
119 } |
132 #ifdef NOTDEF |
120 strncpy(sa->saun.sun_path, pname, name_len); |
133 if (isAbstract) { |
|
134 strncpy(&sa->saun.sun_path[1], pname, name_len); |
|
135 sa->saun.sun_path[0] = 0; |
|
136 name_len++; |
|
137 } else |
|
138 #endif |
|
139 { |
|
140 strncpy(sa->saun.sun_path, pname, name_len); |
|
141 } |
|
142 *len = (int)(offsetof(struct sockaddr_un, sun_path) + name_len); |
121 *len = (int)(offsetof(struct sockaddr_un, sun_path) + name_len); |
143 ret = 0; |
122 ret = 0; |
144 finish: |
123 finish: |
145 if (isCopy) |
124 if (isCopy) |
146 JNU_ReleaseStringPlatformChars(env, path, pname); |
125 JNU_ReleaseStringPlatformChars(env, path, pname); |