50 |
|
|
51 |
#include "target_native.h" |
#include "target_native.h" |
52 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
53 |
#include "target_native_network.h" |
#include "target_native_network.h" |
54 |
#endif /* WITHOUT_NETWORK */ |
#endif /* WITHOUT_NETWORK */ |
55 |
|
|
56 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
71 |
* Sets an integer field in the specified object. |
* Sets an integer field in the specified object. |
72 |
*/ |
*/ |
73 |
static void |
static void |
74 |
_javanet_set_int_field(JNIEnv *env, jobject obj, |
_javanet_set_int_field (JNIEnv * env, jobject obj, |
75 |
const char *class, const char *field, |
const char *class, const char *field, int val) |
|
int val) |
|
76 |
{ |
{ |
77 |
jclass cls; |
jclass cls; |
78 |
jfieldID fid; |
jfieldID fid; |
79 |
|
|
80 |
assert(env!=NULL); |
assert (env != NULL); |
81 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
82 |
|
|
83 |
cls = (*env)->FindClass(env, class); |
cls = (*env)->FindClass (env, class); |
84 |
if (cls == NULL) |
if (cls == NULL) |
85 |
return; |
return; |
86 |
|
|
87 |
fid = (*env)->GetFieldID(env, cls, field, "I"); |
fid = (*env)->GetFieldID (env, cls, field, "I"); |
88 |
if (fid == NULL) |
if (fid == NULL) |
89 |
return; |
return; |
90 |
|
|
91 |
(*env)->SetIntField(env, obj, fid, val); |
(*env)->SetIntField (env, obj, fid, val); |
92 |
|
|
93 |
return; |
return; |
94 |
} |
} |
100 |
* -1 if an error occurs. |
* -1 if an error occurs. |
101 |
*/ |
*/ |
102 |
int |
int |
103 |
_javanet_get_int_field(JNIEnv *env, jobject obj, const char *field) |
_javanet_get_int_field (JNIEnv * env, jobject obj, const char *field) |
104 |
{ |
{ |
105 |
jclass cls = 0; |
jclass cls = 0; |
106 |
jfieldID fid; |
jfieldID fid; |
107 |
int fd; |
int fd; |
108 |
|
|
109 |
assert(env!=NULL); |
assert (env != NULL); |
110 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
111 |
|
|
112 |
DBG("_javanet_get_int_field(): Entered _javanet_get_int_field\n"); |
DBG ("_javanet_get_int_field(): Entered _javanet_get_int_field\n"); |
113 |
|
|
114 |
cls = (*env)->GetObjectClass(env, obj); |
cls = (*env)->GetObjectClass (env, obj); |
115 |
if (cls == NULL) |
if (cls == NULL) |
116 |
return -1; |
return -1; |
117 |
|
|
118 |
fid = (*env)->GetFieldID(env, cls, field, "I"); |
fid = (*env)->GetFieldID (env, cls, field, "I"); |
119 |
if (fid == NULL) |
if (fid == NULL) |
120 |
return -1; |
return -1; |
121 |
DBG("_javanet_get_int_field(): Found field id\n"); |
DBG ("_javanet_get_int_field(): Found field id\n"); |
122 |
|
|
123 |
fd = (*env)->GetIntField(env, obj, fid); |
fd = (*env)->GetIntField (env, obj, fid); |
124 |
|
|
125 |
return fd; |
return fd; |
126 |
} |
} |
133 |
* need to include it. |
* need to include it. |
134 |
*/ |
*/ |
135 |
static void |
static void |
136 |
_javanet_create_localfd(JNIEnv *env, jobject this) |
_javanet_create_localfd (JNIEnv * env, jobject this) |
137 |
{ |
{ |
138 |
jclass this_cls, fd_cls; |
jclass this_cls, fd_cls; |
139 |
jfieldID fid; |
jfieldID fid; |
140 |
jmethodID mid; |
jmethodID mid; |
141 |
jobject fd_obj; |
jobject fd_obj; |
142 |
|
|
143 |
assert(env!=NULL); |
assert (env != NULL); |
144 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
145 |
|
|
146 |
DBG("_javanet_create_localfd(): Entered _javanet_create_localfd\n"); |
DBG ("_javanet_create_localfd(): Entered _javanet_create_localfd\n"); |
147 |
|
|
148 |
/* Look up the fd field */ |
/* Look up the fd field */ |
149 |
this_cls = (*env)->FindClass(env, "java/net/SocketImpl"); |
this_cls = (*env)->FindClass (env, "java/net/SocketImpl"); |
150 |
if (this_cls == NULL) |
if (this_cls == NULL) |
151 |
return; |
return; |
152 |
|
|
153 |
fid = (*env)->GetFieldID(env, this_cls, "fd", "Ljava/io/FileDescriptor;"); |
fid = (*env)->GetFieldID (env, this_cls, "fd", "Ljava/io/FileDescriptor;"); |
154 |
if (fid == NULL) |
if (fid == NULL) |
155 |
return; |
return; |
156 |
|
|
157 |
DBG("_javanet_create_localfd(): Found fd variable\n"); |
DBG ("_javanet_create_localfd(): Found fd variable\n"); |
158 |
|
|
159 |
/* Create a FileDescriptor */ |
/* Create a FileDescriptor */ |
160 |
fd_cls = (*env)->FindClass(env, "java/io/FileDescriptor"); |
fd_cls = (*env)->FindClass (env, "java/io/FileDescriptor"); |
161 |
if (fd_cls == NULL) |
if (fd_cls == NULL) |
162 |
return; |
return; |
163 |
|
|
164 |
DBG("_javanet_create_localfd(): Found FileDescriptor class\n"); |
DBG ("_javanet_create_localfd(): Found FileDescriptor class\n"); |
165 |
|
|
166 |
mid = (*env)->GetMethodID(env, fd_cls, "<init>", "()V"); |
mid = (*env)->GetMethodID (env, fd_cls, "<init>", "()V"); |
167 |
if (mid == NULL) |
if (mid == NULL) |
168 |
return; |
return; |
169 |
|
|
170 |
DBG("_javanet_create_localfd(): Found FileDescriptor constructor\n"); |
DBG ("_javanet_create_localfd(): Found FileDescriptor constructor\n"); |
171 |
|
|
172 |
fd_obj = (*env)->NewObject(env, fd_cls, mid); |
fd_obj = (*env)->NewObject (env, fd_cls, mid); |
173 |
if (fd_obj == NULL) |
if (fd_obj == NULL) |
174 |
return; |
return; |
175 |
|
|
176 |
DBG("_javanet_create_localfd(): Created FileDescriptor\n"); |
DBG ("_javanet_create_localfd(): Created FileDescriptor\n"); |
177 |
|
|
178 |
/* Now set the pointer to the new FileDescriptor */ |
/* Now set the pointer to the new FileDescriptor */ |
179 |
(*env)->SetObjectField(env, this, fid, fd_obj); |
(*env)->SetObjectField (env, this, fid, fd_obj); |
180 |
DBG("_javanet_create_localfd(): Set fd field\n"); |
DBG ("_javanet_create_localfd(): Set fd field\n"); |
181 |
|
|
182 |
return; |
return; |
183 |
} |
} |
188 |
* Returns a Boolean object with the specfied value |
* Returns a Boolean object with the specfied value |
189 |
*/ |
*/ |
190 |
static jobject |
static jobject |
191 |
_javanet_create_boolean(JNIEnv *env, jboolean val) |
_javanet_create_boolean (JNIEnv * env, jboolean val) |
192 |
{ |
{ |
193 |
jclass cls; |
jclass cls; |
194 |
jmethodID mid; |
jmethodID mid; |
195 |
jobject obj; |
jobject obj; |
196 |
|
|
197 |
assert(env!=NULL); |
assert (env != NULL); |
198 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
199 |
|
|
200 |
cls = (*env)->FindClass(env, "java/lang/Boolean"); |
cls = (*env)->FindClass (env, "java/lang/Boolean"); |
201 |
if (cls == NULL) |
if (cls == NULL) |
202 |
return NULL; |
return NULL; |
203 |
|
|
204 |
mid = (*env)->GetMethodID(env, cls, "<init>", "(Z)V"); |
mid = (*env)->GetMethodID (env, cls, "<init>", "(Z)V"); |
205 |
if (mid == NULL) |
if (mid == NULL) |
206 |
return NULL; |
return NULL; |
207 |
|
|
208 |
obj = (*env)->NewObject(env, cls, mid, val); |
obj = (*env)->NewObject (env, cls, mid, val); |
209 |
if (obj == NULL) |
if (obj == NULL) |
210 |
return NULL; |
return NULL; |
211 |
|
|
218 |
* Returns an Integer object with the specfied value |
* Returns an Integer object with the specfied value |
219 |
*/ |
*/ |
220 |
static jobject |
static jobject |
221 |
_javanet_create_integer(JNIEnv *env, jint val) |
_javanet_create_integer (JNIEnv * env, jint val) |
222 |
{ |
{ |
223 |
jclass cls; |
jclass cls; |
224 |
jmethodID mid; |
jmethodID mid; |
225 |
jobject obj; |
jobject obj; |
226 |
|
|
227 |
assert(env!=NULL); |
assert (env != NULL); |
228 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
229 |
|
|
230 |
cls = (*env)->FindClass(env, "java/lang/Integer"); |
cls = (*env)->FindClass (env, "java/lang/Integer"); |
231 |
if (cls == NULL) |
if (cls == NULL) |
232 |
return NULL; |
return NULL; |
233 |
|
|
234 |
mid = (*env)->GetMethodID(env, cls, "<init>", "(I)V"); |
mid = (*env)->GetMethodID (env, cls, "<init>", "(I)V"); |
235 |
if (mid == NULL) |
if (mid == NULL) |
236 |
return NULL; |
return NULL; |
237 |
|
|
238 |
obj = (*env)->NewObject(env, cls, mid, val); |
obj = (*env)->NewObject (env, cls, mid, val); |
239 |
if (obj == NULL) |
if (obj == NULL) |
240 |
return NULL; |
return NULL; |
241 |
|
|
248 |
* Builds an InetAddress object from a 32 bit address in host byte order |
* Builds an InetAddress object from a 32 bit address in host byte order |
249 |
*/ |
*/ |
250 |
static jobject |
static jobject |
251 |
_javanet_create_inetaddress(JNIEnv *env, int netaddr) |
_javanet_create_inetaddress (JNIEnv * env, int netaddr) |
252 |
{ |
{ |
253 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
254 |
unsigned char octets[4]; |
unsigned char octets[4]; |
255 |
char buf[16]; |
char buf[16]; |
256 |
jclass ia_cls; |
jclass ia_cls; |
257 |
jmethodID mid; |
jmethodID mid; |
258 |
jstring ip_str; |
jstring ip_str; |
259 |
jobject ia; |
jobject ia; |
260 |
|
|
261 |
assert(env!=NULL); |
assert (env != NULL); |
262 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
263 |
|
|
264 |
/* Build a string IP address */ |
/* Build a string IP address */ |
265 |
TARGET_NATIVE_NETWORK_INT_TO_IPADDRESS_BYTES(netaddr, |
TARGET_NATIVE_NETWORK_INT_TO_IPADDRESS_BYTES (netaddr, |
266 |
octets[0], |
octets[0], |
267 |
octets[1], |
octets[1], |
268 |
octets[2], |
octets[2], octets[3]); |
269 |
octets[3] |
sprintf (buf, "%d.%d.%d.%d", octets[0], octets[1], octets[2], octets[3]); |
270 |
); |
DBG ("_javanet_create_inetaddress(): Created ip addr string\n"); |
|
sprintf(buf, "%d.%d.%d.%d", |
|
|
octets[0], |
|
|
octets[1], |
|
|
octets[2], |
|
|
octets[3] |
|
|
); |
|
|
DBG("_javanet_create_inetaddress(): Created ip addr string\n"); |
|
271 |
|
|
272 |
/* Get an InetAddress object for this IP */ |
/* Get an InetAddress object for this IP */ |
273 |
ia_cls = (*env)->FindClass(env, "java/net/InetAddress"); |
ia_cls = (*env)->FindClass (env, "java/net/InetAddress"); |
274 |
if (ia_cls == NULL) |
if (ia_cls == NULL) |
275 |
{ |
{ |
276 |
return NULL; |
return NULL; |
277 |
} |
} |
278 |
|
|
279 |
DBG("_javanet_create_inetaddress(): Found InetAddress class\n"); |
DBG ("_javanet_create_inetaddress(): Found InetAddress class\n"); |
280 |
|
|
281 |
mid = (*env)->GetStaticMethodID(env, ia_cls, "getByName", |
mid = (*env)->GetStaticMethodID (env, ia_cls, "getByName", |
282 |
"(Ljava/lang/String;)Ljava/net/InetAddress;"); |
"(Ljava/lang/String;)Ljava/net/InetAddress;"); |
283 |
if (mid == NULL) |
if (mid == NULL) |
284 |
{ |
{ |
285 |
return NULL; |
return NULL; |
286 |
} |
} |
287 |
|
|
288 |
DBG("_javanet_create_inetaddress(): Found getByName method\n"); |
DBG ("_javanet_create_inetaddress(): Found getByName method\n"); |
289 |
|
|
290 |
ip_str = (*env)->NewStringUTF(env, buf); |
ip_str = (*env)->NewStringUTF (env, buf); |
291 |
if (ip_str == NULL) |
if (ip_str == NULL) |
292 |
{ |
{ |
293 |
return NULL; |
return NULL; |
294 |
} |
} |
295 |
|
|
296 |
ia = (*env)->CallStaticObjectMethod(env, ia_cls, mid, ip_str); |
ia = (*env)->CallStaticObjectMethod (env, ia_cls, mid, ip_str); |
297 |
if (ia == NULL) |
if (ia == NULL) |
298 |
{ |
{ |
299 |
return NULL; |
return NULL; |
300 |
} |
} |
301 |
|
|
302 |
DBG("_javanet_create_inetaddress(): Called getByName method\n"); |
DBG ("_javanet_create_inetaddress(): Called getByName method\n"); |
303 |
|
|
304 |
return ia; |
return ia; |
305 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
310 |
/*************************************************************************/ |
/*************************************************************************/ |
311 |
|
|
312 |
static void |
static void |
313 |
_javanet_set_remhost_addr(JNIEnv *env, jobject this, jobject ia) |
_javanet_set_remhost_addr (JNIEnv * env, jobject this, jobject ia) |
314 |
{ |
{ |
315 |
jclass this_cls; |
jclass this_cls; |
316 |
jfieldID fid; |
jfieldID fid; |
317 |
|
|
318 |
assert(env!=NULL); |
assert (env != NULL); |
319 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
320 |
|
|
321 |
/* Set the variable in the object */ |
/* Set the variable in the object */ |
322 |
this_cls = (*env)->FindClass(env, "java/net/SocketImpl"); |
this_cls = (*env)->FindClass (env, "java/net/SocketImpl"); |
323 |
if (this_cls == NULL) |
if (this_cls == NULL) |
324 |
return; |
return; |
325 |
|
|
326 |
fid = (*env)->GetFieldID(env, this_cls, "address", "Ljava/net/InetAddress;"); |
fid = |
327 |
|
(*env)->GetFieldID (env, this_cls, "address", "Ljava/net/InetAddress;"); |
328 |
if (fid == NULL) |
if (fid == NULL) |
329 |
return; |
return; |
330 |
|
|
331 |
DBG("_javanet_set_remhost_addr(): Found address field\n"); |
DBG ("_javanet_set_remhost_addr(): Found address field\n"); |
332 |
|
|
333 |
(*env)->SetObjectField(env, this, fid, ia); |
(*env)->SetObjectField (env, this, fid, ia); |
334 |
DBG("_javanet_set_remhost_addr(): Set field\n"); |
DBG ("_javanet_set_remhost_addr(): Set field\n"); |
335 |
} |
} |
336 |
|
|
337 |
/* |
/* |
339 |
* InetAddress for the specified addr |
* InetAddress for the specified addr |
340 |
*/ |
*/ |
341 |
static void |
static void |
342 |
_javanet_set_remhost(JNIEnv *env, jobject this, int netaddr) |
_javanet_set_remhost (JNIEnv * env, jobject this, int netaddr) |
343 |
{ |
{ |
344 |
jobject ia; |
jobject ia; |
345 |
|
|
346 |
assert(env!=NULL); |
assert (env != NULL); |
347 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
348 |
|
|
349 |
DBG("_javanet_set_remhost(): Entered _javanet_set_remhost\n"); |
DBG ("_javanet_set_remhost(): Entered _javanet_set_remhost\n"); |
350 |
|
|
351 |
/* Get an InetAddress object */ |
/* Get an InetAddress object */ |
352 |
ia = _javanet_create_inetaddress(env, netaddr); |
ia = _javanet_create_inetaddress (env, netaddr); |
353 |
if (ia == NULL) |
if (ia == NULL) |
354 |
return; |
return; |
355 |
|
|
356 |
_javanet_set_remhost_addr(env, this, ia); |
_javanet_set_remhost_addr (env, this, ia); |
357 |
} |
} |
358 |
|
|
359 |
|
|
363 |
* Returns a 32 bit Internet address for the passed in InetAddress object |
* Returns a 32 bit Internet address for the passed in InetAddress object |
364 |
*/ |
*/ |
365 |
int |
int |
366 |
_javanet_get_netaddr(JNIEnv *env, jobject addr) |
_javanet_get_netaddr (JNIEnv * env, jobject addr) |
367 |
{ |
{ |
368 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
369 |
jclass cls = 0; |
jclass cls = 0; |
370 |
jmethodID mid; |
jmethodID mid; |
371 |
jarray arr = 0; |
jarray arr = 0; |
372 |
jbyte *octets; |
jbyte *octets; |
373 |
int netaddr, len; |
int netaddr, len; |
374 |
|
|
375 |
assert(env!=NULL); |
assert (env != NULL); |
376 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
377 |
|
|
378 |
DBG("_javanet_get_netaddr(): Entered _javanet_get_netaddr\n"); |
DBG ("_javanet_get_netaddr(): Entered _javanet_get_netaddr\n"); |
379 |
|
|
380 |
/* Call the getAddress method on the object to retrieve the IP address */ |
/* Call the getAddress method on the object to retrieve the IP address */ |
381 |
cls = (*env)->GetObjectClass(env, addr); |
cls = (*env)->GetObjectClass (env, addr); |
382 |
if (cls == NULL) |
if (cls == NULL) |
383 |
return 0; |
return 0; |
384 |
|
|
385 |
mid = (*env)->GetMethodID(env, cls, "getAddress", "()[B"); |
mid = (*env)->GetMethodID (env, cls, "getAddress", "()[B"); |
386 |
if (mid == NULL) |
if (mid == NULL) |
387 |
return 0; |
return 0; |
388 |
|
|
389 |
DBG("_javanet_get_netaddr(): Got getAddress method\n"); |
DBG ("_javanet_get_netaddr(): Got getAddress method\n"); |
390 |
|
|
391 |
arr = (*env)->CallObjectMethod(env, addr, mid); |
arr = (*env)->CallObjectMethod (env, addr, mid); |
392 |
if (arr == NULL) |
if (arr == NULL) |
393 |
return 0; |
return 0; |
394 |
|
|
395 |
DBG("_javanet_get_netaddr(): Got the address\n"); |
DBG ("_javanet_get_netaddr(): Got the address\n"); |
396 |
|
|
397 |
/* Turn the IP address into a 32 bit Internet address in network byte order */ |
/* Turn the IP address into a 32 bit Internet address in network byte order */ |
398 |
len = (*env)->GetArrayLength(env, arr); |
len = (*env)->GetArrayLength (env, arr); |
399 |
if (len != 4) |
if (len != 4) |
400 |
{ |
{ |
401 |
JCL_ThrowException(env, IO_EXCEPTION, "Internal Error"); |
JCL_ThrowException (env, IO_EXCEPTION, "Internal Error"); |
402 |
return 0; |
return 0; |
403 |
} |
} |
404 |
DBG("_javanet_get_netaddr(): Length ok\n"); |
DBG ("_javanet_get_netaddr(): Length ok\n"); |
405 |
|
|
406 |
octets = (*env)->GetByteArrayElements(env, arr, 0); |
octets = (*env)->GetByteArrayElements (env, arr, 0); |
407 |
if (octets == NULL) |
if (octets == NULL) |
408 |
return 0; |
return 0; |
409 |
|
|
410 |
DBG("_javanet_get_netaddr(): Grabbed bytes\n"); |
DBG ("_javanet_get_netaddr(): Grabbed bytes\n"); |
411 |
|
|
412 |
TARGET_NATIVE_NETWORK_IPADDRESS_BYTES_TO_INT(octets[0], |
TARGET_NATIVE_NETWORK_IPADDRESS_BYTES_TO_INT (octets[0], |
413 |
octets[1], |
octets[1], |
414 |
octets[2], |
octets[2], |
415 |
octets[3], |
octets[3], netaddr); |
|
netaddr |
|
|
); |
|
416 |
|
|
417 |
(*env)->ReleaseByteArrayElements(env, arr, octets, 0); |
(*env)->ReleaseByteArrayElements (env, arr, octets, 0); |
418 |
DBG("_javanet_get_netaddr(): Done getting addr\n"); |
DBG ("_javanet_get_netaddr(): Done getting addr\n"); |
419 |
|
|
420 |
return netaddr; |
return netaddr; |
421 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
422 |
#endif /* not WITHOUT_NETWORK */ |
#endif /* not WITHOUT_NETWORK */ |
423 |
} |
} |
428 |
* Creates a new stream or datagram socket |
* Creates a new stream or datagram socket |
429 |
*/ |
*/ |
430 |
void |
void |
431 |
_javanet_create(JNIEnv *env, jobject this, jboolean stream) |
_javanet_create (JNIEnv * env, jobject this, jboolean stream) |
432 |
{ |
{ |
433 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
434 |
int fd; |
int fd; |
435 |
int result; |
int result; |
436 |
|
|
437 |
assert(env!=NULL); |
assert (env != NULL); |
438 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
439 |
|
|
440 |
if (stream) |
if (stream) |
441 |
{ |
{ |
442 |
/* create a stream socket */ |
/* create a stream socket */ |
443 |
TARGET_NATIVE_NETWORK_SOCKET_OPEN_STREAM(fd,result); |
TARGET_NATIVE_NETWORK_SOCKET_OPEN_STREAM (fd, result); |
444 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
445 |
{ |
{ |
446 |
JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, IO_EXCEPTION, |
447 |
return; |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
448 |
} |
return; |
449 |
|
} |
450 |
} |
} |
451 |
else |
else |
452 |
{ |
{ |
453 |
/* create a datagram socket, set broadcast option */ |
/* create a datagram socket, set broadcast option */ |
454 |
TARGET_NATIVE_NETWORK_SOCKET_OPEN_DATAGRAM(fd,result); |
TARGET_NATIVE_NETWORK_SOCKET_OPEN_DATAGRAM (fd, result); |
455 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
456 |
{ |
{ |
457 |
JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, IO_EXCEPTION, |
458 |
return; |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
459 |
} |
return; |
460 |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_BROADCAST(fd,1,result); |
} |
461 |
|
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_BROADCAST (fd, 1, result); |
462 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
463 |
{ |
{ |
464 |
JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, IO_EXCEPTION, |
465 |
return; |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
466 |
} |
return; |
467 |
|
} |
468 |
} |
} |
469 |
|
|
470 |
if (stream) |
if (stream) |
471 |
_javanet_set_int_field(env, this, "gnu/java/net/PlainSocketImpl", |
_javanet_set_int_field (env, this, "gnu/java/net/PlainSocketImpl", |
472 |
"native_fd", fd); |
"native_fd", fd); |
473 |
else |
else |
474 |
_javanet_set_int_field(env, this, "gnu/java/net/PlainDatagramSocketImpl", |
_javanet_set_int_field (env, this, "gnu/java/net/PlainDatagramSocketImpl", |
475 |
"native_fd", fd); |
"native_fd", fd); |
476 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
477 |
#endif /* not WITHOUT_NETWORK */ |
#endif /* not WITHOUT_NETWORK */ |
478 |
} |
} |
484 |
* action as well. |
* action as well. |
485 |
*/ |
*/ |
486 |
void |
void |
487 |
_javanet_close(JNIEnv *env, jobject this, int stream) |
_javanet_close (JNIEnv * env, jobject this, int stream) |
488 |
{ |
{ |
489 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
490 |
int fd; |
int fd; |
491 |
int result; |
int result; |
492 |
|
|
493 |
assert(env!=NULL); |
assert (env != NULL); |
494 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
495 |
|
|
496 |
fd = _javanet_get_int_field(env, this, "native_fd"); |
fd = _javanet_get_int_field (env, this, "native_fd"); |
497 |
if (fd == -1) |
if (fd == -1) |
498 |
return; |
return; |
499 |
|
|
500 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
501 |
|
|
502 |
if (stream) |
if (stream) |
503 |
_javanet_set_int_field(env, this, "gnu/java/net/PlainSocketImpl", |
_javanet_set_int_field (env, this, "gnu/java/net/PlainSocketImpl", |
504 |
"native_fd", -1); |
"native_fd", -1); |
505 |
else |
else |
506 |
_javanet_set_int_field(env, this, "gnu/java/net/PlainDatagramSocketImpl", |
_javanet_set_int_field (env, this, "gnu/java/net/PlainDatagramSocketImpl", |
507 |
"native_fd", -1); |
"native_fd", -1); |
508 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
509 |
#endif /* not WITHOUT_NETWORK */ |
#endif /* not WITHOUT_NETWORK */ |
510 |
} |
} |
514 |
/* |
/* |
515 |
* Connects to the specified destination. |
* Connects to the specified destination. |
516 |
*/ |
*/ |
517 |
void |
void |
518 |
_javanet_connect(JNIEnv *env, jobject this, jobject addr, jint port) |
_javanet_connect (JNIEnv * env, jobject this, jobject addr, jint port) |
519 |
{ |
{ |
520 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
521 |
int netaddr, fd; |
int netaddr, fd; |
522 |
int result; |
int result; |
523 |
int local_address,local_port; |
int local_address, local_port; |
524 |
int remote_address,remote_port; |
int remote_address, remote_port; |
525 |
|
|
526 |
assert(env!=NULL); |
assert (env != NULL); |
527 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
528 |
|
|
529 |
DBG("_javanet_connect(): Entered _javanet_connect\n"); |
DBG ("_javanet_connect(): Entered _javanet_connect\n"); |
530 |
|
|
531 |
/* Pre-process input variables */ |
/* Pre-process input variables */ |
532 |
netaddr = _javanet_get_netaddr(env, addr); |
netaddr = _javanet_get_netaddr (env, addr); |
533 |
if ((*env)->ExceptionOccurred(env)) |
if ((*env)->ExceptionOccurred (env)) |
534 |
return; |
return; |
535 |
|
|
536 |
if (port == -1) |
if (port == -1) |
537 |
port = 0; |
port = 0; |
538 |
DBG("_javanet_connect(): Got network address\n"); |
DBG ("_javanet_connect(): Got network address\n"); |
539 |
|
|
540 |
/* Grab the real socket file descriptor */ |
/* Grab the real socket file descriptor */ |
541 |
fd = _javanet_get_int_field(env, this, "native_fd"); |
fd = _javanet_get_int_field (env, this, "native_fd"); |
542 |
if (fd == -1) |
if (fd == -1) |
543 |
{ |
{ |
544 |
JCL_ThrowException(env, IO_EXCEPTION, |
JCL_ThrowException (env, IO_EXCEPTION, |
545 |
"Internal error: _javanet_connect(): no native file descriptor"); |
"Internal error: _javanet_connect(): no native file descriptor"); |
546 |
return; |
return; |
547 |
} |
} |
548 |
DBG("_javanet_connect(): Got native fd\n"); |
DBG ("_javanet_connect(): Got native fd\n"); |
549 |
|
|
550 |
/* Connect up */ |
/* Connect up */ |
551 |
TARGET_NATIVE_NETWORK_SOCKET_CONNECT(fd,netaddr,port,result); |
TARGET_NATIVE_NETWORK_SOCKET_CONNECT (fd, netaddr, port, result); |
552 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
553 |
{ |
{ |
554 |
JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, IO_EXCEPTION, |
555 |
return; |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
556 |
|
return; |
557 |
} |
} |
558 |
DBG("_javanet_connect(): Connected successfully\n"); |
DBG ("_javanet_connect(): Connected successfully\n"); |
559 |
|
|
560 |
/* Populate instance variables */ |
/* Populate instance variables */ |
561 |
TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO(fd,local_address,local_port,result); |
TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO (fd, local_address, local_port, |
562 |
|
result); |
563 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
564 |
{ |
{ |
565 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
566 |
JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, IO_EXCEPTION, |
567 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
568 |
return; |
return; |
569 |
} |
} |
570 |
|
|
571 |
_javanet_create_localfd(env, this); |
_javanet_create_localfd (env, this); |
572 |
if ((*env)->ExceptionOccurred(env)) |
if ((*env)->ExceptionOccurred (env)) |
573 |
{ |
{ |
574 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
575 |
return; |
return; |
576 |
} |
} |
577 |
DBG("_javanet_connect(): Created fd\n"); |
DBG ("_javanet_connect(): Created fd\n"); |
578 |
|
|
579 |
_javanet_set_int_field(env, this, "java/net/SocketImpl", "localport", |
_javanet_set_int_field (env, this, "java/net/SocketImpl", "localport", |
580 |
local_port); |
local_port); |
581 |
if ((*env)->ExceptionOccurred(env)) |
if ((*env)->ExceptionOccurred (env)) |
582 |
{ |
{ |
583 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
584 |
return; |
return; |
585 |
} |
} |
586 |
DBG("_javanet_connect(): Set the local port\n"); |
DBG ("_javanet_connect(): Set the local port\n"); |
587 |
|
|
588 |
TARGET_NATIVE_NETWORK_SOCKET_GET_REMOTE_INFO(fd,remote_address,remote_port,result); |
TARGET_NATIVE_NETWORK_SOCKET_GET_REMOTE_INFO (fd, remote_address, |
589 |
|
remote_port, result); |
590 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
591 |
{ |
{ |
592 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
593 |
JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, IO_EXCEPTION, |
594 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
595 |
return; |
return; |
596 |
} |
} |
597 |
|
|
598 |
if (remote_address == netaddr) |
if (remote_address == netaddr) |
599 |
{ |
{ |
600 |
_javanet_set_remhost_addr(env, this, addr); |
_javanet_set_remhost_addr (env, this, addr); |
601 |
} |
} |
602 |
else |
else |
603 |
{ |
{ |
604 |
_javanet_set_remhost(env, this, remote_address); |
_javanet_set_remhost (env, this, remote_address); |
605 |
} |
} |
606 |
if ((*env)->ExceptionOccurred(env)) |
if ((*env)->ExceptionOccurred (env)) |
607 |
{ |
{ |
608 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
609 |
return; |
return; |
610 |
} |
} |
611 |
DBG("_javanet_connect(): Set the remote host\n"); |
DBG ("_javanet_connect(): Set the remote host\n"); |
612 |
|
|
613 |
_javanet_set_int_field(env, this, "java/net/SocketImpl", "port", |
_javanet_set_int_field (env, this, "java/net/SocketImpl", "port", |
614 |
remote_port); |
remote_port); |
615 |
if ((*env)->ExceptionOccurred(env)) |
if ((*env)->ExceptionOccurred (env)) |
616 |
{ |
{ |
617 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
618 |
return; |
return; |
619 |
} |
} |
620 |
DBG("_javanet_connect(): Set the remote port\n"); |
DBG ("_javanet_connect(): Set the remote port\n"); |
621 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
622 |
#endif /* not WITHOUT_NETWORK */ |
#endif /* not WITHOUT_NETWORK */ |
623 |
} |
} |
630 |
* port public instance variables. |
* port public instance variables. |
631 |
*/ |
*/ |
632 |
void |
void |
633 |
_javanet_bind(JNIEnv *env, jobject this, jobject addr, jint port, int stream) |
_javanet_bind (JNIEnv * env, jobject this, jobject addr, jint port, |
634 |
|
int stream) |
635 |
{ |
{ |
636 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
637 |
jclass cls; |
jclass cls; |
638 |
jmethodID mid; |
jmethodID mid; |
639 |
jbyteArray arr = 0; |
jbyteArray arr = 0; |
640 |
jbyte *octets; |
jbyte *octets; |
641 |
jint fd; |
jint fd; |
642 |
int tmpaddr; |
int tmpaddr; |
643 |
int result; |
int result; |
644 |
int local_address,local_port; |
int local_address, local_port; |
645 |
|
|
646 |
assert(env!=NULL); |
assert (env != NULL); |
647 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
648 |
|
|
649 |
DBG("_javanet_bind(): Entering native bind()\n"); |
DBG ("_javanet_bind(): Entering native bind()\n"); |
650 |
|
|
651 |
/* Get the address to connect to */ |
/* Get the address to connect to */ |
652 |
cls = (*env)->GetObjectClass(env, addr); |
cls = (*env)->GetObjectClass (env, addr); |
653 |
if (cls == NULL) |
if (cls == NULL) |
654 |
return; |
return; |
655 |
|
|
656 |
mid = (*env)->GetMethodID(env, cls, "getAddress", "()[B"); |
mid = (*env)->GetMethodID (env, cls, "getAddress", "()[B"); |
657 |
if (mid == NULL) |
if (mid == NULL) |
658 |
return; |
return; |
659 |
|
|
660 |
DBG("_javanet_bind(): Past getAddress method id\n"); |
DBG ("_javanet_bind(): Past getAddress method id\n"); |
661 |
|
|
662 |
arr = (*env)->CallObjectMethod(env, addr, mid); |
arr = (*env)->CallObjectMethod (env, addr, mid); |
663 |
if ((arr == NULL) || (*env)->ExceptionOccurred(env)) |
if ((arr == NULL) || (*env)->ExceptionOccurred (env)) |
664 |
{ JCL_ThrowException(env, IO_EXCEPTION, "Internal error: _javanet_bind()"); return; } |
{ |
665 |
|
JCL_ThrowException (env, IO_EXCEPTION, |
666 |
|
"Internal error: _javanet_bind()"); |
667 |
|
return; |
668 |
|
} |
669 |
|
|
670 |
DBG("_javanet_bind(): Past call object method\n"); |
DBG ("_javanet_bind(): Past call object method\n"); |
671 |
|
|
672 |
octets = (*env)->GetByteArrayElements(env, arr, 0); |
octets = (*env)->GetByteArrayElements (env, arr, 0); |
673 |
if (octets == NULL) |
if (octets == NULL) |
674 |
return; |
return; |
675 |
|
|
676 |
DBG("_javanet_bind(): Past grab array\n"); |
DBG ("_javanet_bind(): Past grab array\n"); |
677 |
|
|
678 |
/* Get the native socket file descriptor */ |
/* Get the native socket file descriptor */ |
679 |
fd = _javanet_get_int_field(env, this, "native_fd"); |
fd = _javanet_get_int_field (env, this, "native_fd"); |
680 |
if (fd == -1) |
if (fd == -1) |
681 |
{ |
{ |
682 |
(*env)->ReleaseByteArrayElements(env, arr, octets, 0); |
(*env)->ReleaseByteArrayElements (env, arr, octets, 0); |
683 |
JCL_ThrowException(env, IO_EXCEPTION, |
JCL_ThrowException (env, IO_EXCEPTION, |
684 |
"Internal error: _javanet_bind(): no native file descriptor"); |
"Internal error: _javanet_bind(): no native file descriptor"); |
685 |
return; |
return; |
686 |
} |
} |
687 |
DBG("_javanet_bind(): Past native_fd lookup\n"); |
DBG ("_javanet_bind(): Past native_fd lookup\n"); |
688 |
|
|
689 |
/* XXX NYI ??? */ |
/* XXX NYI ??? */ |
690 |
_javanet_set_option (env, this, SOCKOPT_SO_REUSEADDR, |
_javanet_set_option (env, this, SOCKOPT_SO_REUSEADDR, |
691 |
_javanet_create_boolean (env, JNI_TRUE)); |
_javanet_create_boolean (env, JNI_TRUE)); |
692 |
|
|
693 |
|
|
694 |
/* Bind the socket */ |
/* Bind the socket */ |
695 |
TARGET_NATIVE_NETWORK_IPADDRESS_BYTES_TO_INT(octets[0], |
TARGET_NATIVE_NETWORK_IPADDRESS_BYTES_TO_INT (octets[0], |
696 |
octets[1], |
octets[1], |
697 |
octets[2], |
octets[2], |
698 |
octets[3], |
octets[3], tmpaddr); |
699 |
tmpaddr |
TARGET_NATIVE_NETWORK_SOCKET_BIND (fd, tmpaddr, port, result); |
|
); |
|
|
TARGET_NATIVE_NETWORK_SOCKET_BIND(fd,tmpaddr,port,result); |
|
700 |
|
|
701 |
(*env)->ReleaseByteArrayElements(env, arr, octets, 0); |
(*env)->ReleaseByteArrayElements (env, arr, octets, 0); |
702 |
|
|
703 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
704 |
{ |
{ |
705 |
JCL_ThrowException(env, BIND_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, BIND_EXCEPTION, |
706 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
707 |
return; |
return; |
708 |
} |
} |
709 |
DBG("_javanet_bind(): Past bind\n"); |
DBG ("_javanet_bind(): Past bind\n"); |
710 |
|
|
711 |
/* Update instance variables, specifically the local port number */ |
/* Update instance variables, specifically the local port number */ |
712 |
TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO(fd,local_address,local_port,result); |
TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO (fd, local_address, local_port, |
713 |
|
result); |
714 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
715 |
{ |
{ |
716 |
JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, IO_EXCEPTION, |
717 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
718 |
return; |
return; |
719 |
} |
} |
720 |
|
|
721 |
if (stream) |
if (stream) |
722 |
_javanet_set_int_field(env, this, "java/net/SocketImpl", |
_javanet_set_int_field (env, this, "java/net/SocketImpl", |
723 |
"localport", local_port); |
"localport", local_port); |
724 |
else |
else |
725 |
_javanet_set_int_field(env, this, "java/net/DatagramSocketImpl", |
_javanet_set_int_field (env, this, "java/net/DatagramSocketImpl", |
726 |
"localPort", local_port); |
"localPort", local_port); |
727 |
DBG("_javanet_bind(): Past update port number\n"); |
DBG ("_javanet_bind(): Past update port number\n"); |
728 |
|
|
729 |
return; |
return; |
730 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
737 |
* Starts listening on a socket with the specified number of pending |
* Starts listening on a socket with the specified number of pending |
738 |
* connections allowed. |
* connections allowed. |
739 |
*/ |
*/ |
740 |
void |
void |
741 |
_javanet_listen(JNIEnv *env, jobject this, jint queuelen) |
_javanet_listen (JNIEnv * env, jobject this, jint queuelen) |
742 |
{ |
{ |
743 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
744 |
int fd; |
int fd; |
745 |
int result; |
int result; |
746 |
|
|
747 |
assert(env!=NULL); |
assert (env != NULL); |
748 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
749 |
|
|
750 |
/* Get the real file descriptor */ |
/* Get the real file descriptor */ |
751 |
fd = _javanet_get_int_field(env, this, "native_fd"); |
fd = _javanet_get_int_field (env, this, "native_fd"); |
752 |
if (fd == -1) |
if (fd == -1) |
753 |
{ |
{ |
754 |
JCL_ThrowException(env, IO_EXCEPTION, |
JCL_ThrowException (env, IO_EXCEPTION, |
755 |
"Internal error: _javanet_listen(): no native file descriptor"); |
"Internal error: _javanet_listen(): no native file descriptor"); |
756 |
return; |
return; |
757 |
} |
} |
758 |
|
|
759 |
/* Start listening */ |
/* Start listening */ |
760 |
TARGET_NATIVE_NETWORK_SOCKET_LISTEN(fd,queuelen,result); |
TARGET_NATIVE_NETWORK_SOCKET_LISTEN (fd, queuelen, result); |
761 |
if (result!=TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
762 |
{ |
{ |
763 |
JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, IO_EXCEPTION, |
764 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
765 |
return; |
return; |
766 |
} |
} |
767 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
774 |
* Accepts a new connection and assigns it to the passed in SocketImpl |
* Accepts a new connection and assigns it to the passed in SocketImpl |
775 |
* object. Note that we assume this is a PlainSocketImpl just like us |
* object. Note that we assume this is a PlainSocketImpl just like us |
776 |
*/ |
*/ |
777 |
void |
void |
778 |
_javanet_accept(JNIEnv *env, jobject this, jobject impl) |
_javanet_accept (JNIEnv * env, jobject this, jobject impl) |
779 |
{ |
{ |
780 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
781 |
int fd, newfd; |
int fd, newfd; |
782 |
int result; |
int result; |
783 |
int local_address,local_port; |
int local_address, local_port; |
784 |
int remote_address,remote_port; |
int remote_address, remote_port; |
785 |
|
|
786 |
assert(env!=NULL); |
assert (env != NULL); |
787 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
788 |
|
|
789 |
/* Get the real file descriptor */ |
/* Get the real file descriptor */ |
790 |
fd = _javanet_get_int_field(env, this, "native_fd"); |
fd = _javanet_get_int_field (env, this, "native_fd"); |
791 |
if (fd == -1) |
if (fd == -1) |
792 |
{ |
{ |
793 |
JCL_ThrowException(env, IO_EXCEPTION, |
JCL_ThrowException (env, IO_EXCEPTION, |
794 |
"Internal error: _javanet_accept(): no native file descriptor"); |
"Internal error: _javanet_accept(): no native file descriptor"); |
795 |
return; |
return; |
796 |
} |
} |
797 |
|
|
798 |
/* Accept the connection */ |
/* Accept the connection */ |
799 |
do |
do |
800 |
{ |
{ |
801 |
TARGET_NATIVE_NETWORK_SOCKET_ACCEPT(fd,newfd,result); |
TARGET_NATIVE_NETWORK_SOCKET_ACCEPT (fd, newfd, result); |
802 |
if (result != TARGET_NATIVE_OK |
if (result != TARGET_NATIVE_OK |
803 |
&& (TARGET_NATIVE_LAST_ERROR() |
&& (TARGET_NATIVE_LAST_ERROR () |
804 |
!= TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL)) |
!= TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL)) |
805 |
{ |
{ |
806 |
JCL_ThrowException(env, IO_EXCEPTION, |
JCL_ThrowException (env, IO_EXCEPTION, |
807 |
"Internal error: _javanet_accept(): "); |
"Internal error: _javanet_accept(): "); |
808 |
return; |
return; |
809 |
} |
} |
810 |
} |
} |
811 |
while (result != TARGET_NATIVE_OK); |
while (result != TARGET_NATIVE_OK); |
812 |
|
|
813 |
/* Populate instance variables */ |
/* Populate instance variables */ |
814 |
_javanet_set_int_field(env, impl, "gnu/java/net/PlainSocketImpl", "native_fd", |
_javanet_set_int_field (env, impl, "gnu/java/net/PlainSocketImpl", |
815 |
newfd); |
"native_fd", newfd); |
816 |
|
|
817 |
if ((*env)->ExceptionOccurred(env)) |
if ((*env)->ExceptionOccurred (env)) |
818 |
{ |
{ |
819 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
820 |
return; |
return; |
821 |
} |
} |
822 |
|
|
823 |
TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO(newfd,local_address,local_port,result); |
TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO (newfd, local_address, |
824 |
if (result!=TARGET_NATIVE_OK) |
local_port, result); |
825 |
|
if (result != TARGET_NATIVE_OK) |
826 |
{ |
{ |
827 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
828 |
JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, IO_EXCEPTION, |
829 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
830 |
return; |
return; |
831 |
} |
} |
832 |
|
|
833 |
_javanet_create_localfd(env, impl); |
_javanet_create_localfd (env, impl); |
834 |
if ((*env)->ExceptionOccurred(env)) |
if ((*env)->ExceptionOccurred (env)) |
835 |
{ |
{ |
836 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
837 |
return; |
return; |
838 |
} |
} |
839 |
|
|
840 |
_javanet_set_int_field(env, impl, "java/net/SocketImpl", "localport", |
_javanet_set_int_field (env, impl, "java/net/SocketImpl", "localport", |
841 |
local_port); |
local_port); |
842 |
if ((*env)->ExceptionOccurred(env)) |
if ((*env)->ExceptionOccurred (env)) |
843 |
{ |
{ |
844 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
845 |
return; |
return; |
846 |
} |
} |
847 |
|
|
848 |
TARGET_NATIVE_NETWORK_SOCKET_GET_REMOTE_INFO(newfd,remote_address,remote_port,result); |
TARGET_NATIVE_NETWORK_SOCKET_GET_REMOTE_INFO (newfd, remote_address, |
849 |
if (result!=TARGET_NATIVE_OK) |
remote_port, result); |
850 |
|
if (result != TARGET_NATIVE_OK) |
851 |
{ |
{ |
852 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
853 |
JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, IO_EXCEPTION, |
854 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
855 |
return; |
return; |
856 |
} |
} |
857 |
|
|
858 |
_javanet_set_remhost(env, impl, remote_address); |
_javanet_set_remhost (env, impl, remote_address); |
859 |
if ((*env)->ExceptionOccurred(env)) |
if ((*env)->ExceptionOccurred (env)) |
860 |
{ |
{ |
861 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
862 |
return; |
return; |
863 |
} |
} |
864 |
|
|
865 |
_javanet_set_int_field(env, impl, "java/net/SocketImpl", "port", |
_javanet_set_int_field (env, impl, "java/net/SocketImpl", "port", |
866 |
remote_port); |
remote_port); |
867 |
if ((*env)->ExceptionOccurred(env)) |
if ((*env)->ExceptionOccurred (env)) |
868 |
{ |
{ |
869 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
870 |
return; |
return; |
871 |
} |
} |
872 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
890 |
* The actual number of bytes read is returned. |
* The actual number of bytes read is returned. |
891 |
*/ |
*/ |
892 |
int |
int |
893 |
_javanet_recvfrom(JNIEnv *env, jobject this, jarray buf, int offset, int len, |
_javanet_recvfrom (JNIEnv * env, jobject this, jarray buf, int offset, |
894 |
int *addr, int *port) |
int len, int *addr, int *port) |
895 |
{ |
{ |
896 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
897 |
int fd; |
int fd; |
898 |
jbyte *p; |
jbyte *p; |
899 |
int from_address,from_port; |
int from_address, from_port; |
900 |
int received_bytes; |
int received_bytes; |
901 |
|
|
902 |
assert(env!=NULL); |
assert (env != NULL); |
903 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
904 |
|
|
905 |
DBG("_javanet_recvfrom(): Entered _javanet_recvfrom\n"); |
DBG ("_javanet_recvfrom(): Entered _javanet_recvfrom\n"); |
906 |
|
|
907 |
/* Get the real file descriptor */ |
/* Get the real file descriptor */ |
908 |
fd = _javanet_get_int_field(env, this, "native_fd"); |
fd = _javanet_get_int_field (env, this, "native_fd"); |
909 |
if (fd == -1) |
if (fd == -1) |
910 |
{ |
{ |
911 |
JCL_ThrowException(env, IO_EXCEPTION, |
JCL_ThrowException (env, IO_EXCEPTION, |
912 |
"Internal error: _javanet_recvfrom(): no native file descriptor"); |
"Internal error: _javanet_recvfrom(): no native file descriptor"); |
913 |
return 0; |
return 0; |
914 |
} |
} |
915 |
DBG("_javanet_recvfrom(): Got native_fd\n"); |
DBG ("_javanet_recvfrom(): Got native_fd\n"); |
916 |
|
|
917 |
/* Get a pointer to the buffer */ |
/* Get a pointer to the buffer */ |
918 |
p = (*env)->GetByteArrayElements(env, buf, 0); |
p = (*env)->GetByteArrayElements (env, buf, 0); |
919 |
if (p == NULL) |
if (p == NULL) |
920 |
return 0; |
return 0; |
921 |
|
|
922 |
DBG("_javanet_recvfrom(): Got buffer\n"); |
DBG ("_javanet_recvfrom(): Got buffer\n"); |
923 |
|
|
924 |
/* Read the data */ |
/* Read the data */ |
925 |
from_address = 0; |
from_address = 0; |
926 |
from_port = 0; |
from_port = 0; |
927 |
do { |
do |
928 |
if (addr != NULL) |
{ |
929 |
{ |
if (addr != NULL) |
930 |
TARGET_NATIVE_NETWORK_SOCKET_RECEIVE_WITH_ADDRESS_PORT(fd,p+offset,len,from_address,from_port,received_bytes); |
{ |
931 |
} |
TARGET_NATIVE_NETWORK_SOCKET_RECEIVE_WITH_ADDRESS_PORT (fd, |
932 |
else |
p + offset, |
933 |
{ |
len, |
934 |
TARGET_NATIVE_NETWORK_SOCKET_RECEIVE(fd,p+offset,len,received_bytes); |
from_address, |
935 |
} |
from_port, |
936 |
} while ((received_bytes == -1) && |
received_bytes); |
937 |
(TARGET_NATIVE_LAST_ERROR() == TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL) |
} |
938 |
); |
else |
939 |
|
{ |
940 |
|
TARGET_NATIVE_NETWORK_SOCKET_RECEIVE (fd, p + offset, len, |
941 |
|
received_bytes); |
942 |
|
} |
943 |
|
} |
944 |
|
while ((received_bytes == -1) && |
945 |
|
(TARGET_NATIVE_LAST_ERROR () == |
946 |
|
TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL)); |
947 |
|
|
948 |
(*env)->ReleaseByteArrayElements(env, buf, p, 0); |
(*env)->ReleaseByteArrayElements (env, buf, p, 0); |
949 |
|
|
950 |
if (received_bytes == -1) |
if (received_bytes == -1) |
951 |
{ |
{ |
952 |
JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, IO_EXCEPTION, |
953 |
return 0; |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
954 |
|
return 0; |
955 |
} |
} |
956 |
|
|
957 |
/* Handle return addr case */ |
/* Handle return addr case */ |
959 |
{ |
{ |
960 |
(*addr) = from_address; |
(*addr) = from_address; |
961 |
if (port != NULL) |
if (port != NULL) |
962 |
(*port) = from_port; |
(*port) = from_port; |
963 |
} |
} |
964 |
|
|
965 |
return(received_bytes); |
return (received_bytes); |
966 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
967 |
#endif /* not WITHOUT_NETWORK */ |
#endif /* not WITHOUT_NETWORK */ |
968 |
} |
} |
978 |
* addr - The 32bit address to send to (may be 0) |
* addr - The 32bit address to send to (may be 0) |
979 |
* port - The port number to send to (may be 0) |
* port - The port number to send to (may be 0) |
980 |
*/ |
*/ |
981 |
void |
void |
982 |
_javanet_sendto(JNIEnv *env, jobject this, jarray buf, int offset, int len, |
_javanet_sendto (JNIEnv * env, jobject this, jarray buf, int offset, int len, |
983 |
int addr, int port) |
int addr, int port) |
984 |
{ |
{ |
985 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
986 |
int fd; |
int fd; |
987 |
jbyte *p; |
jbyte *p; |
988 |
int bytes_sent; |
int bytes_sent; |
989 |
|
|
990 |
assert(env!=NULL); |
assert (env != NULL); |
991 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
992 |
|
|
993 |
/* Get the real file descriptor */ |
/* Get the real file descriptor */ |
994 |
fd = _javanet_get_int_field(env, this, "native_fd"); |
fd = _javanet_get_int_field (env, this, "native_fd"); |
995 |
if (fd == -1) |
if (fd == -1) |
996 |
{ |
{ |
997 |
JCL_ThrowException(env, IO_EXCEPTION, |
JCL_ThrowException (env, IO_EXCEPTION, |
998 |
"Internal error: _javanet_sendto(): no native file descriptor"); |
"Internal error: _javanet_sendto(): no native file descriptor"); |
999 |
return; |
return; |
1000 |
} |
} |
1001 |
|
|
1002 |
/* Get a pointer to the buffer */ |
/* Get a pointer to the buffer */ |
1003 |
p = (*env)->GetByteArrayElements(env, buf, 0); |
p = (*env)->GetByteArrayElements (env, buf, 0); |
1004 |
if (p == NULL) |
if (p == NULL) |
1005 |
return; |
return; |
1006 |
|
|
1007 |
/* Send the data */ |
/* Send the data */ |
1008 |
if (addr == 0) |
if (addr == 0) |
1009 |
{ |
{ |
1010 |
DBG("_javanet_sendto(): Sending....\n"); |
DBG ("_javanet_sendto(): Sending....\n"); |
1011 |
TARGET_NATIVE_NETWORK_SOCKET_SEND(fd,p+offset,len,bytes_sent); |
TARGET_NATIVE_NETWORK_SOCKET_SEND (fd, p + offset, len, bytes_sent); |
1012 |
} |
} |
1013 |
else |
else |
1014 |
{ |
{ |
1015 |
DBG("_javanet_sendto(): Sending....\n"); |
DBG ("_javanet_sendto(): Sending....\n"); |
1016 |
TARGET_NATIVE_NETWORK_SOCKET_SEND_WITH_ADDRESS_PORT(fd,p+offset,len,addr,port,bytes_sent); |
TARGET_NATIVE_NETWORK_SOCKET_SEND_WITH_ADDRESS_PORT (fd, p + offset, |
1017 |
|
len, addr, port, |
1018 |
|
bytes_sent); |
1019 |
} |
} |
1020 |
|
|
1021 |
(*env)->ReleaseByteArrayElements(env, buf, p, 0); |
(*env)->ReleaseByteArrayElements (env, buf, p, 0); |
1022 |
|
|
1023 |
/***** Do we need to check EINTR? */ |
/***** Do we need to check EINTR? */ |
1024 |
if (bytes_sent<0) |
if (bytes_sent < 0) |
1025 |
{ |
{ |
1026 |
JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, IO_EXCEPTION, |
1027 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1028 |
return; |
return; |
1029 |
} |
} |
1030 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
1036 |
/* |
/* |
1037 |
* Sets the specified option for a socket |
* Sets the specified option for a socket |
1038 |
*/ |
*/ |
1039 |
void |
void |
1040 |
_javanet_set_option(JNIEnv *env, jobject this, jint option_id, jobject val) |
_javanet_set_option (JNIEnv * env, jobject this, jint option_id, jobject val) |
1041 |
{ |
{ |
1042 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
1043 |
int fd; |
int fd; |
1044 |
int optval; |
int optval; |
1045 |
jclass cls; |
jclass cls; |
1046 |
jmethodID mid; |
jmethodID mid; |
1047 |
int address; |
int address; |
1048 |
int result; |
int result; |
1049 |
|
|
1050 |
assert(env!=NULL); |
assert (env != NULL); |
1051 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
1052 |
|
|
1053 |
/* Get the real file descriptor */ |
/* Get the real file descriptor */ |
1054 |
fd = _javanet_get_int_field(env, this, "native_fd"); |
fd = _javanet_get_int_field (env, this, "native_fd"); |
1055 |
if (fd == -1) |
if (fd == -1) |
1056 |
{ |
{ |
1057 |
JCL_ThrowException(env, IO_EXCEPTION, |
JCL_ThrowException (env, IO_EXCEPTION, |
1058 |
"Internal error: _javanet_set_option(): no native file descriptor"); |
"Internal error: _javanet_set_option(): no native file descriptor"); |
1059 |
return; |
return; |
1060 |
} |
} |
1061 |
|
|
1062 |
/* We need a class object for all cases below */ |
/* We need a class object for all cases below */ |
1063 |
cls = (*env)->GetObjectClass(env, val); |
cls = (*env)->GetObjectClass (env, val); |
1064 |
if (cls == NULL) |
if (cls == NULL) |
1065 |
return; |
return; |
1066 |
|
|
1069 |
switch (option_id) |
switch (option_id) |
1070 |
{ |
{ |
1071 |
/* TCP_NODELAY case. val is a Boolean that tells us what to do */ |
/* TCP_NODELAY case. val is a Boolean that tells us what to do */ |
1072 |
case SOCKOPT_TCP_NODELAY: |
case SOCKOPT_TCP_NODELAY: |
1073 |
mid = (*env)->GetMethodID(env, cls, "booleanValue", "()Z"); |
mid = (*env)->GetMethodID (env, cls, "booleanValue", "()Z"); |
1074 |
if (mid == NULL) |
if (mid == NULL) |
1075 |
{ JCL_ThrowException(env, IO_EXCEPTION, |
{ |
1076 |
"Internal error: _javanet_set_option()"); return; } |
JCL_ThrowException (env, IO_EXCEPTION, |
1077 |
|
"Internal error: _javanet_set_option()"); |
|
/* Should be a 0 or a 1 */ |
|
|
optval = (*env)->CallBooleanMethod(env, val, mid); |
|
|
if ((*env)->ExceptionOccurred(env)) |
|
1078 |
return; |
return; |
1079 |
|
} |
1080 |
|
|
1081 |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_TCP_NODELAY(fd,optval,result); |
/* Should be a 0 or a 1 */ |
1082 |
break; |
optval = (*env)->CallBooleanMethod (env, val, mid); |
1083 |
|
if ((*env)->ExceptionOccurred (env)) |
1084 |
|
return; |
1085 |
|
|
1086 |
|
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_TCP_NODELAY (fd, optval, |
1087 |
|
result); |
1088 |
|
break; |
1089 |
|
|
1090 |
/* SO_LINGER case. If val is a boolean, then it will always be set |
/* SO_LINGER case. If val is a boolean, then it will always be set |
1091 |
to false indicating disable linger, otherwise it will be an |
to false indicating disable linger, otherwise it will be an |
1092 |
integer that contains the linger value */ |
integer that contains the linger value */ |
1093 |
case SOCKOPT_SO_LINGER: |
case SOCKOPT_SO_LINGER: |
1094 |
mid = (*env)->GetMethodID(env, cls, "booleanValue", "()Z"); |
mid = (*env)->GetMethodID (env, cls, "booleanValue", "()Z"); |
1095 |
if (mid) |
if (mid) |
1096 |
{ |
{ |
1097 |
/* We are disabling linger */ |
/* We are disabling linger */ |
1098 |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_LINGER(fd,1,0,result); |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_LINGER (fd, 1, 0, |
1099 |
} |
result); |
1100 |
else |
} |
1101 |
{ |
else |
1102 |
/* Clear exception if thrown for failure to do method lookup |
{ |
1103 |
above */ |
/* Clear exception if thrown for failure to do method lookup |
1104 |
if ((*env)->ExceptionOccurred(env)) |
above */ |
1105 |
(*env)->ExceptionClear(env); |
if ((*env)->ExceptionOccurred (env)) |
1106 |
|
(*env)->ExceptionClear (env); |
1107 |
mid = (*env)->GetMethodID(env, cls, "intValue", "()I"); |
|
1108 |
if (mid == NULL) |
mid = (*env)->GetMethodID (env, cls, "intValue", "()I"); |
1109 |
{ JCL_ThrowException(env, IO_EXCEPTION, |
if (mid == NULL) |
1110 |
"Internal error: _javanet_set_option()"); return; } |
{ |
1111 |
|
JCL_ThrowException (env, IO_EXCEPTION, |
1112 |
optval= (*env)->CallIntMethod(env, val, mid); |
"Internal error: _javanet_set_option()"); |
|
if ((*env)->ExceptionOccurred(env)) |
|
1113 |
return; |
return; |
1114 |
|
} |
1115 |
|
|
1116 |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_LINGER(fd,0,optval,result); |
optval = (*env)->CallIntMethod (env, val, mid); |
1117 |
} |
if ((*env)->ExceptionOccurred (env)) |
1118 |
break; |
return; |
1119 |
|
|
1120 |
|
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_LINGER (fd, 0, optval, |
1121 |
|
result); |
1122 |
|
} |
1123 |
|
break; |
1124 |
|
|
1125 |
/* SO_TIMEOUT case. Val will be an integer with the new value */ |
/* SO_TIMEOUT case. Val will be an integer with the new value */ |
1126 |
/* Not writable on Linux */ |
/* Not writable on Linux */ |
1127 |
case SOCKOPT_SO_TIMEOUT: |
case SOCKOPT_SO_TIMEOUT: |
1128 |
#ifdef SO_TIMEOUT |
#ifdef SO_TIMEOUT |
1129 |
mid = (*env)->GetMethodID(env, cls, "intValue", "()I"); |
mid = (*env)->GetMethodID (env, cls, "intValue", "()I"); |
1130 |
if (mid == NULL) |
if (mid == NULL) |
1131 |
{ JCL_ThrowException(env, IO_EXCEPTION, |
{ |
1132 |
"Internal error: _javanet_set_option()"); return; } |
JCL_ThrowException (env, IO_EXCEPTION, |
1133 |
|
"Internal error: _javanet_set_option()"); |
|
optval = (*env)->CallIntMethod(env, val, mid); |
|
|
if ((*env)->ExceptionOccurred(env)) |
|
1134 |
return; |
return; |
1135 |
|
} |
1136 |
|
|
1137 |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_TIMEOUT(fd,optval,result); |
optval = (*env)->CallIntMethod (env, val, mid); |
1138 |
#endif |
if ((*env)->ExceptionOccurred (env)) |
1139 |
/* ignore errors and do not throw an exception. */ |
return; |
|
result = TARGET_NATIVE_OK; |
|
|
break; |
|
|
|
|
|
case SOCKOPT_SO_SNDBUF: |
|
|
case SOCKOPT_SO_RCVBUF: |
|
|
mid = (*env)->GetMethodID(env, cls, "intValue", "()I"); |
|
|
if (mid == NULL) |
|
|
{ JCL_ThrowException(env, IO_EXCEPTION, |
|
|
"Internal error: _javanet_set_option()"); return; } |
|
1140 |
|
|
1141 |
|
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_TIMEOUT (fd, optval, result); |
1142 |
|
#endif |
1143 |
|
/* ignore errors and do not throw an exception. */ |
1144 |
|
result = TARGET_NATIVE_OK; |
1145 |
|
break; |
1146 |
|
|
1147 |
optval = (*env)->CallIntMethod(env, val, mid); |
case SOCKOPT_SO_SNDBUF: |
1148 |
if ((*env)->ExceptionOccurred(env)) |
case SOCKOPT_SO_RCVBUF: |
1149 |
|
mid = (*env)->GetMethodID (env, cls, "intValue", "()I"); |
1150 |
|
if (mid == NULL) |
1151 |
|
{ |
1152 |
|
JCL_ThrowException (env, IO_EXCEPTION, |
1153 |
|
"Internal error: _javanet_set_option()"); |
1154 |
return; |
return; |
1155 |
|
} |
|
if (option_id == SOCKOPT_SO_SNDBUF) |
|
|
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_SNDBUF(fd,optval,result); |
|
|
else |
|
|
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_RCDBUF(fd,optval,result); |
|
|
break; |
|
1156 |
|
|
|
/* TTL case. Val with be an Integer with the new time to live value */ |
|
|
case SOCKOPT_IP_TTL: |
|
|
mid = (*env)->GetMethodID(env, cls, "intValue", "()I"); |
|
|
if (!mid) |
|
|
{ JCL_ThrowException(env, IO_EXCEPTION, |
|
|
"Internal error: _javanet_set_option()"); return; } |
|
1157 |
|
|
1158 |
optval = (*env)->CallIntMethod(env, val, mid); |
optval = (*env)->CallIntMethod (env, val, mid); |
1159 |
if ((*env)->ExceptionOccurred(env)) |
if ((*env)->ExceptionOccurred (env)) |
1160 |
|
return; |
1161 |
|
|
1162 |
|
if (option_id == SOCKOPT_SO_SNDBUF) |
1163 |
|
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_SNDBUF (fd, optval, |
1164 |
|
result); |
1165 |
|
else |
1166 |
|
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_RCDBUF (fd, optval, |
1167 |
|
result); |
1168 |
|
break; |
1169 |
|
|
1170 |
|
/* TTL case. Val with be an Integer with the new time to live value */ |
1171 |
|
case SOCKOPT_IP_TTL: |
1172 |
|
mid = (*env)->GetMethodID (env, cls, "intValue", "()I"); |
1173 |
|
if (!mid) |
1174 |
|
{ |
1175 |
|
JCL_ThrowException (env, IO_EXCEPTION, |
1176 |
|
"Internal error: _javanet_set_option()"); |
1177 |
return; |
return; |
1178 |
|
} |
1179 |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_IP_TTL(fd,optval,result); |
|
1180 |
break; |
optval = (*env)->CallIntMethod (env, val, mid); |
1181 |
|
if ((*env)->ExceptionOccurred (env)) |
1182 |
|
return; |
1183 |
|
|
1184 |
|
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_IP_TTL (fd, optval, result); |
1185 |
|
break; |
1186 |
|
|
1187 |
/* Multicast Interface case - val is InetAddress object */ |
/* Multicast Interface case - val is InetAddress object */ |
1188 |
case SOCKOPT_IP_MULTICAST_IF: |
case SOCKOPT_IP_MULTICAST_IF: |
1189 |
address = _javanet_get_netaddr(env, val); |
address = _javanet_get_netaddr (env, val); |
1190 |
|
|
1191 |
if ((*env)->ExceptionOccurred(env)) |
if ((*env)->ExceptionOccurred (env)) |
1192 |
return; |
return; |
1193 |
|
|
1194 |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_IP_MULTICAST_IF(fd,address,result); |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_IP_MULTICAST_IF (fd, address, |
1195 |
break; |
result); |
1196 |
|
break; |
1197 |
|
|
1198 |
case SOCKOPT_SO_REUSEADDR: |
case SOCKOPT_SO_REUSEADDR: |
1199 |
mid = (*env)->GetMethodID(env, cls, "booleanValue", "()Z"); |
mid = (*env)->GetMethodID (env, cls, "booleanValue", "()Z"); |
1200 |
if (mid == NULL) |
if (mid == NULL) |
1201 |
{ JCL_ThrowException(env, IO_EXCEPTION, |
{ |
1202 |
"Internal error: _javanet_set_option()"); return; } |
JCL_ThrowException (env, IO_EXCEPTION, |
1203 |
|
"Internal error: _javanet_set_option()"); |
|
/* Should be a 0 or a 1 */ |
|
|
optval = (*env)->CallBooleanMethod(env, val, mid); |
|
|
if ((*env)->ExceptionOccurred(env)) |
|
1204 |
return; |
return; |
1205 |
|
} |
1206 |
|
|
1207 |
|
/* Should be a 0 or a 1 */ |
1208 |
|
optval = (*env)->CallBooleanMethod (env, val, mid); |
1209 |
|
if ((*env)->ExceptionOccurred (env)) |
1210 |
|
return; |
1211 |
|
|
1212 |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_REUSE_ADDRESS(fd,optval,result); |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_REUSE_ADDRESS (fd, optval, |
1213 |
break; |
result); |
1214 |
|
break; |
1215 |
|
|
1216 |
case SOCKOPT_SO_KEEPALIVE: |
case SOCKOPT_SO_KEEPALIVE: |
1217 |
mid = (*env)->GetMethodID(env, cls, "booleanValue", "()Z"); |
mid = (*env)->GetMethodID (env, cls, "booleanValue", "()Z"); |
1218 |
if (mid == NULL) |
if (mid == NULL) |
1219 |
{ JCL_ThrowException(env, IO_EXCEPTION, |
{ |
1220 |
"Internal error: _javanet_set_option()"); return; } |
JCL_ThrowException (env, IO_EXCEPTION, |
1221 |
|
"Internal error: _javanet_set_option()"); |
|
/* Should be a 0 or a 1 */ |
|
|
optval = (*env)->CallBooleanMethod(env, val, mid); |
|
|
if ((*env)->ExceptionOccurred(env)) |
|
1222 |
return; |
return; |
1223 |
|
} |
1224 |
|
|
1225 |
|
/* Should be a 0 or a 1 */ |
1226 |
|
optval = (*env)->CallBooleanMethod (env, val, mid); |
1227 |
|
if ((*env)->ExceptionOccurred (env)) |
1228 |
|
return; |
1229 |
|
|
1230 |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_KEEP_ALIVE(fd,optval,result); |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_KEEP_ALIVE (fd, optval, result); |
1231 |
break; |
break; |
1232 |
|
|
1233 |
case SOCKOPT_SO_BINDADDR: |
case SOCKOPT_SO_BINDADDR: |
1234 |
JCL_ThrowException(env, SOCKET_EXCEPTION, "This option cannot be set"); |
JCL_ThrowException (env, SOCKET_EXCEPTION, "This option cannot be set"); |
1235 |
break; |
break; |
1236 |
|
|
1237 |
default: |
default: |
1238 |
JCL_ThrowException(env, SOCKET_EXCEPTION, "Unrecognized option"); |
JCL_ThrowException (env, SOCKET_EXCEPTION, "Unrecognized option"); |
1239 |
return; |
return; |
1240 |
} |
} |
1241 |
|
|
1242 |
/* Check to see if above operations succeeded */ |
/* Check to see if above operations succeeded */ |
1243 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
1244 |
{ |
{ |
1245 |
JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1246 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1247 |
return; |
return; |
1248 |
} |
} |
1249 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
1255 |
/* |
/* |
1256 |
* Retrieves the specified option values for a socket |
* Retrieves the specified option values for a socket |
1257 |
*/ |
*/ |
1258 |
jobject |
jobject |
1259 |
_javanet_get_option(JNIEnv *env, jobject this, jint option_id) |
_javanet_get_option (JNIEnv * env, jobject this, jint option_id) |
1260 |
{ |
{ |
1261 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
1262 |
int fd; |
int fd; |
1263 |
int flag,optval; |
int flag, optval; |
1264 |
int address; |
int address; |
1265 |
int result; |
int result; |
1266 |
|
|
1267 |
assert(env!=NULL); |
assert (env != NULL); |
1268 |
assert((*env)!=NULL); |
assert ((*env) != NULL); |
1269 |
|
|
1270 |
/* Get the real file descriptor */ |
/* Get the real file descriptor */ |
1271 |
fd = _javanet_get_int_field(env, this, "native_fd"); |
fd = _javanet_get_int_field (env, this, "native_fd"); |
1272 |
if (fd == -1) |
if (fd == -1) |
1273 |
{ |
{ |
1274 |
JCL_ThrowException(env, SOCKET_EXCEPTION, |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1275 |
"Internal error: _javanet_get_option(): no native file descriptor"); |
"Internal error: _javanet_get_option(): no native file descriptor"); |
1276 |
return(0); |
return (0); |
1277 |
} |
} |
1278 |
|
|
1279 |
/* Process the option requested */ |
/* Process the option requested */ |
1280 |
switch (option_id) |
switch (option_id) |
1281 |
{ |
{ |
1282 |
/* TCP_NODELAY case. Return a Boolean indicating on or off */ |
/* TCP_NODELAY case. Return a Boolean indicating on or off */ |
1283 |
case SOCKOPT_TCP_NODELAY: |
case SOCKOPT_TCP_NODELAY: |
1284 |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_TCP_NODELAY(fd,optval,result); |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_TCP_NODELAY (fd, optval, |
1285 |
if (result != TARGET_NATIVE_OK) |
result); |
1286 |
{ |
if (result != TARGET_NATIVE_OK) |
1287 |
JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
{ |
1288 |
return(0); |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1289 |
} |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1290 |
|
return (0); |
1291 |
if (optval) |
} |
1292 |
return(_javanet_create_boolean(env, JNI_TRUE)); |
|
1293 |
else |
if (optval) |
1294 |
return(_javanet_create_boolean(env, JNI_FALSE)); |
return (_javanet_create_boolean (env, JNI_TRUE)); |
1295 |
|
else |
1296 |
break; |
return (_javanet_create_boolean (env, JNI_FALSE)); |
1297 |
|
|
1298 |
|
break; |
1299 |
|
|
1300 |
/* SO_LINGER case. If disabled, return a Boolean object that represents |
/* SO_LINGER case. If disabled, return a Boolean object that represents |
1301 |
false, else return an Integer that is the value of SO_LINGER */ |
false, else return an Integer that is the value of SO_LINGER */ |
1302 |
case SOCKOPT_SO_LINGER: |
case SOCKOPT_SO_LINGER: |
1303 |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_LINGER(fd,flag,optval,result); |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_LINGER (fd, flag, optval, |
1304 |
if (result != TARGET_NATIVE_OK) |
result); |
1305 |
{ |
if (result != TARGET_NATIVE_OK) |
1306 |
JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
{ |
1307 |
return(0); |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1308 |
} |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1309 |
|
return (0); |
1310 |
if (optval) |
} |
|
return(_javanet_create_integer(env, JNI_TRUE)); |
|
|
else |
|
|
return(_javanet_create_boolean(env, JNI_FALSE)); |
|
1311 |
|
|
1312 |
break; |
if (optval) |
1313 |
|
return (_javanet_create_integer (env, JNI_TRUE)); |
1314 |
|
else |
1315 |
|
return (_javanet_create_boolean (env, JNI_FALSE)); |
1316 |
|
|
1317 |
|
break; |
1318 |
|
|
1319 |
/* SO_TIMEOUT case. Return an Integer object with the timeout value */ |
/* SO_TIMEOUT case. Return an Integer object with the timeout value */ |
1320 |
case SOCKOPT_SO_TIMEOUT: |
case SOCKOPT_SO_TIMEOUT: |
1321 |
#ifdef SO_TIMEOUT |
#ifdef SO_TIMEOUT |
1322 |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_TIMEOUT(fd,optval,result); |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_TIMEOUT (fd, optval, result); |
1323 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
1324 |
{ |
{ |
1325 |
JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1326 |
return(0); |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1327 |
} |
return (0); |
1328 |
|
} |
1329 |
|
|
1330 |
return(_javanet_create_integer(env, optval)); |
return (_javanet_create_integer (env, optval)); |
1331 |
#else |
#else |
1332 |
JCL_ThrowException(env, SOCKET_EXCEPTION, |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1333 |
"SO_TIMEOUT not supported on this platform"); |
"SO_TIMEOUT not supported on this platform"); |
1334 |
return(0); |
return (0); |
1335 |
#endif /* not SO_TIMEOUT */ |
#endif /* not SO_TIMEOUT */ |
1336 |
break; |
break; |
1337 |
|
|
1338 |
case SOCKOPT_SO_SNDBUF: |
case SOCKOPT_SO_SNDBUF: |
1339 |
case SOCKOPT_SO_RCVBUF: |
case SOCKOPT_SO_RCVBUF: |
1340 |
if (option_id == SOCKOPT_SO_SNDBUF) |
if (option_id == SOCKOPT_SO_SNDBUF) |
1341 |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_SNDBUF(fd,optval,result); |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_SNDBUF (fd, optval, |
1342 |
else |
result); |
1343 |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_RCDBUF(fd,optval,result); |
else |
1344 |
if (result != TARGET_NATIVE_OK) |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_RCDBUF (fd, optval, |
1345 |
{ |
result); |
1346 |
JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
if (result != TARGET_NATIVE_OK) |
1347 |
return(0); |
{ |
1348 |
} |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1349 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1350 |
|
return (0); |
1351 |
|
} |
1352 |
|
|
1353 |
return(_javanet_create_integer(env, optval)); |
return (_javanet_create_integer (env, optval)); |
1354 |
break; |
break; |
1355 |
|
|
1356 |
/* The TTL case. Return an Integer with the Time to Live value */ |
/* The TTL case. Return an Integer with the Time to Live value */ |
1357 |
case SOCKOPT_IP_TTL: |
case SOCKOPT_IP_TTL: |
1358 |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_IP_TTL(fd,optval,result); |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_IP_TTL (fd, optval, result); |
1359 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
1360 |
{ |
{ |
1361 |
JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1362 |
return(0); |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1363 |
} |
return (0); |
1364 |
|
} |
1365 |
|
|
1366 |
return(_javanet_create_integer(env, optval)); |
return (_javanet_create_integer (env, optval)); |
1367 |
break; |
break; |
1368 |
|
|
1369 |
/* Multicast interface case */ |
/* Multicast interface case */ |
1370 |
case SOCKOPT_IP_MULTICAST_IF: |
case SOCKOPT_IP_MULTICAST_IF: |
1371 |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_IP_MULTICAST_IF(fd,address,result); |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_IP_MULTICAST_IF (fd, address, |
1372 |
if (result != TARGET_NATIVE_OK) |
result); |
1373 |
{ |
if (result != TARGET_NATIVE_OK) |
1374 |
JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
{ |
1375 |
return(0); |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1376 |
} |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1377 |
|
return (0); |
1378 |
return(_javanet_create_inetaddress(env, address)); |
} |
1379 |
break; |
|
1380 |
|
return (_javanet_create_inetaddress (env, address)); |
1381 |
case SOCKOPT_SO_BINDADDR: |
break; |
1382 |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_BIND_ADDRESS(fd,address,result); |
|
1383 |
if (result != TARGET_NATIVE_OK) |
case SOCKOPT_SO_BINDADDR: |
1384 |
{ |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_BIND_ADDRESS (fd, address, |
1385 |
JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
result); |
1386 |
return(0); |
if (result != TARGET_NATIVE_OK) |
1387 |
} |
{ |
1388 |
|
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1389 |
return(_javanet_create_inetaddress(env, address)); |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1390 |
break; |
return (0); |
1391 |
|
} |
1392 |
case SOCKOPT_SO_REUSEADDR: |
|
1393 |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_REUSE_ADDRESS(fd,optval,result); |
return (_javanet_create_inetaddress (env, address)); |
1394 |
if (result != TARGET_NATIVE_OK) |
break; |
1395 |
{ |
|
1396 |
JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
case SOCKOPT_SO_REUSEADDR: |
1397 |
return(0); |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_REUSE_ADDRESS (fd, optval, |
1398 |
} |
result); |
1399 |
|
if (result != TARGET_NATIVE_OK) |
1400 |
if (optval) |
{ |
1401 |
return(_javanet_create_boolean(env, JNI_TRUE)); |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1402 |
else |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1403 |
return(_javanet_create_boolean(env, JNI_FALSE)); |
return (0); |
1404 |
|
} |
1405 |
break; |
|
1406 |
|
if (optval) |
1407 |
case SOCKOPT_SO_KEEPALIVE: |
return (_javanet_create_boolean (env, JNI_TRUE)); |
1408 |
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_KEEP_ALIVE(fd,optval,result); |
else |
1409 |
if (result != TARGET_NATIVE_OK) |
return (_javanet_create_boolean (env, JNI_FALSE)); |
1410 |
{ |
|
1411 |
JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING()); |
break; |
1412 |
return(0); |
|
1413 |
} |
case SOCKOPT_SO_KEEPALIVE: |
1414 |
|
TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_KEEP_ALIVE (fd, optval, result); |
1415 |
if (optval) |
if (result != TARGET_NATIVE_OK) |
1416 |
return(_javanet_create_boolean(env, JNI_TRUE)); |
{ |
1417 |
else |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1418 |
return(_javanet_create_boolean(env, JNI_FALSE)); |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1419 |
|
return (0); |
1420 |
break; |
} |
1421 |
|
|
1422 |
default: |
if (optval) |
1423 |
JCL_ThrowException(env, SOCKET_EXCEPTION, "No such option" ); |
return (_javanet_create_boolean (env, JNI_TRUE)); |
1424 |
return(0); |
else |
1425 |
|
return (_javanet_create_boolean (env, JNI_FALSE)); |
1426 |
|
|
1427 |
|
break; |
1428 |
|
|
1429 |
|
default: |
1430 |
|
JCL_ThrowException (env, SOCKET_EXCEPTION, "No such option"); |
1431 |
|
return (0); |
1432 |
} |
} |
1433 |
|
|
1434 |
return(0); |
return (0); |
1435 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
1436 |
#endif /* not WITHOUT_NETWORK */ |
#endif /* not WITHOUT_NETWORK */ |
1437 |
} |
} |
1438 |
|
|
1439 |
void |
void |
1440 |
_javanet_shutdownInput (JNIEnv *env, jobject this) |
_javanet_shutdownInput (JNIEnv * env, jobject this) |
1441 |
{ |
{ |
1442 |
int fd; |
int fd; |
1443 |
|
|
1447 |
/* Get the real file descriptor. */ |
/* Get the real file descriptor. */ |
1448 |
fd = _javanet_get_int_field (env, this, "native_fd"); |
fd = _javanet_get_int_field (env, this, "native_fd"); |
1449 |
if (fd == -1) |
if (fd == -1) |
1450 |
{ |
{ |
1451 |
JCL_ThrowException(env, SOCKET_EXCEPTION, |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1452 |
"Internal error: _javanet_get_option(): no native file descriptor"); |
"Internal error: _javanet_get_option(): no native file descriptor"); |
1453 |
return; |
return; |
1454 |
} |
} |
1455 |
|
|
1456 |
/* Shutdown input stream of socket. */ |
/* Shutdown input stream of socket. */ |
1462 |
} |
} |
1463 |
} |
} |
1464 |
|
|
1465 |
void |
void |
1466 |
_javanet_shutdownOutput (JNIEnv *env, jobject this) |
_javanet_shutdownOutput (JNIEnv * env, jobject this) |
1467 |
{ |
{ |
1468 |
int fd; |
int fd; |
1469 |
|
|
1473 |
/* Get the real file descriptor. */ |
/* Get the real file descriptor. */ |
1474 |
fd = _javanet_get_int_field (env, this, "native_fd"); |
fd = _javanet_get_int_field (env, this, "native_fd"); |
1475 |
if (fd == -1) |
if (fd == -1) |
1476 |
{ |
{ |
1477 |
JCL_ThrowException(env, SOCKET_EXCEPTION, |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
1478 |
"Internal error: _javanet_get_option(): no native file descriptor"); |
"Internal error: _javanet_get_option(): no native file descriptor"); |
1479 |
return; |
return; |
1480 |
} |
} |
1481 |
|
|
1482 |
/* Shutdown output stream of socket. */ |
/* Shutdown output stream of socket. */ |