377 |
|
|
378 |
DBG ("_javanet_get_netaddr(): Entered _javanet_get_netaddr\n"); |
DBG ("_javanet_get_netaddr(): Entered _javanet_get_netaddr\n"); |
379 |
|
|
380 |
|
if (addr == NULL) |
381 |
|
{ |
382 |
|
JCL_ThrowException (env, "java/lang/NullPointerException", |
383 |
|
"Null address"); |
384 |
|
return 0; |
385 |
|
} |
386 |
|
|
387 |
/* Call the getAddress method on the object to retrieve the IP address */ |
/* Call the getAddress method on the object to retrieve the IP address */ |
388 |
cls = (*env)->GetObjectClass (env, addr); |
cls = (*env)->GetObjectClass (env, addr); |
389 |
if (cls == NULL) |
if (cls == NULL) |
480 |
else |
else |
481 |
_javanet_set_int_field (env, this, "gnu/java/net/PlainDatagramSocketImpl", |
_javanet_set_int_field (env, this, "gnu/java/net/PlainDatagramSocketImpl", |
482 |
"native_fd", fd); |
"native_fd", fd); |
483 |
|
|
484 |
|
if ((*env)->ExceptionOccurred (env)) |
485 |
|
{ |
486 |
|
/* Try to make sure we close the socket since close() won't work. */ |
487 |
|
do |
488 |
|
{ |
489 |
|
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
490 |
|
if (result != TARGET_NATIVE_OK |
491 |
|
&& (TARGET_NATIVE_LAST_ERROR () |
492 |
|
!= TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL)) |
493 |
|
return; |
494 |
|
} |
495 |
|
while (result != TARGET_NATIVE_OK); |
496 |
|
return; |
497 |
|
} |
498 |
|
|
499 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
500 |
#endif /* not WITHOUT_NETWORK */ |
#endif /* not WITHOUT_NETWORK */ |
501 |
} |
} |
512 |
#ifndef WITHOUT_NETWORK |
#ifndef WITHOUT_NETWORK |
513 |
int fd; |
int fd; |
514 |
int result; |
int result; |
515 |
|
int error = 0; |
516 |
|
|
517 |
assert (env != NULL); |
assert (env != NULL); |
518 |
assert ((*env) != NULL); |
assert ((*env) != NULL); |
521 |
if (fd == -1) |
if (fd == -1) |
522 |
return; |
return; |
523 |
|
|
|
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
|
|
|
|
524 |
if (stream) |
if (stream) |
525 |
_javanet_set_int_field (env, this, "gnu/java/net/PlainSocketImpl", |
_javanet_set_int_field (env, this, "gnu/java/net/PlainSocketImpl", |
526 |
"native_fd", -1); |
"native_fd", -1); |
527 |
else |
else |
528 |
_javanet_set_int_field (env, this, "gnu/java/net/PlainDatagramSocketImpl", |
_javanet_set_int_field (env, this, "gnu/java/net/PlainDatagramSocketImpl", |
529 |
"native_fd", -1); |
"native_fd", -1); |
530 |
|
do |
531 |
|
{ |
532 |
|
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
533 |
|
if (result != TARGET_NATIVE_OK) |
534 |
|
{ |
535 |
|
/* Only throw an error when a "real" error occurs. */ |
536 |
|
error = TARGET_NATIVE_LAST_ERROR (); |
537 |
|
if (error != TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL |
538 |
|
&& error != ENOTCONN && error != ECONNRESET && error != EBADF) |
539 |
|
JCL_ThrowException (env, IO_EXCEPTION, |
540 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
541 |
|
} |
542 |
|
} |
543 |
|
while (error == TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL); |
544 |
|
|
545 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
546 |
#endif /* not WITHOUT_NETWORK */ |
#endif /* not WITHOUT_NETWORK */ |
547 |
} |
} |
585 |
DBG ("_javanet_connect(): Got native fd\n"); |
DBG ("_javanet_connect(): Got native fd\n"); |
586 |
|
|
587 |
/* Connect up */ |
/* Connect up */ |
588 |
TARGET_NATIVE_NETWORK_SOCKET_CONNECT (fd, netaddr, port, result); |
do |
|
if (result != TARGET_NATIVE_OK) |
|
589 |
{ |
{ |
590 |
JCL_ThrowException (env, IO_EXCEPTION, |
TARGET_NATIVE_NETWORK_SOCKET_CONNECT (fd, netaddr, port, result); |
591 |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
if (result != TARGET_NATIVE_OK |
592 |
return; |
&& (TARGET_NATIVE_LAST_ERROR () |
593 |
|
!= TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL)) |
594 |
|
{ |
595 |
|
JCL_ThrowException (env, IO_EXCEPTION, |
596 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
597 |
|
return; |
598 |
|
} |
599 |
} |
} |
600 |
|
while (result != TARGET_NATIVE_OK); |
601 |
|
|
602 |
DBG ("_javanet_connect(): Connected successfully\n"); |
DBG ("_javanet_connect(): Connected successfully\n"); |
603 |
|
|
604 |
/* Populate instance variables */ |
/* Populate instance variables */ |
606 |
result); |
result); |
607 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
608 |
{ |
{ |
|
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
|
609 |
JCL_ThrowException (env, IO_EXCEPTION, |
JCL_ThrowException (env, IO_EXCEPTION, |
610 |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
611 |
|
/* We don't care whether this succeeds. close() will cleanup later. */ |
612 |
|
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
613 |
return; |
return; |
614 |
} |
} |
615 |
|
|
616 |
_javanet_create_localfd (env, this); |
_javanet_create_localfd (env, this); |
617 |
if ((*env)->ExceptionOccurred (env)) |
if ((*env)->ExceptionOccurred (env)) |
618 |
{ |
{ |
619 |
|
/* We don't care whether this succeeds. close() will cleanup later. */ |
620 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
621 |
return; |
return; |
622 |
} |
} |
626 |
local_port); |
local_port); |
627 |
if ((*env)->ExceptionOccurred (env)) |
if ((*env)->ExceptionOccurred (env)) |
628 |
{ |
{ |
629 |
|
/* We don't care whether this succeeds. close() will cleanup later. */ |
630 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
631 |
return; |
return; |
632 |
} |
} |
636 |
remote_port, result); |
remote_port, result); |
637 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
638 |
{ |
{ |
|
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
|
639 |
JCL_ThrowException (env, IO_EXCEPTION, |
JCL_ThrowException (env, IO_EXCEPTION, |
640 |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
641 |
|
/* We don't care whether this succeeds. close() will cleanup later. */ |
642 |
|
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
643 |
return; |
return; |
644 |
} |
} |
645 |
|
|
653 |
} |
} |
654 |
if ((*env)->ExceptionOccurred (env)) |
if ((*env)->ExceptionOccurred (env)) |
655 |
{ |
{ |
656 |
|
/* We don't care whether this succeeds. close() will cleanup later. */ |
657 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
658 |
return; |
return; |
659 |
} |
} |
663 |
remote_port); |
remote_port); |
664 |
if ((*env)->ExceptionOccurred (env)) |
if ((*env)->ExceptionOccurred (env)) |
665 |
{ |
{ |
666 |
|
/* We don't care whether this succeeds. close() will cleanup later. */ |
667 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result); |
668 |
return; |
return; |
669 |
} |
} |
748 |
octets[3], tmpaddr); |
octets[3], tmpaddr); |
749 |
TARGET_NATIVE_NETWORK_SOCKET_BIND (fd, tmpaddr, port, result); |
TARGET_NATIVE_NETWORK_SOCKET_BIND (fd, tmpaddr, port, result); |
750 |
|
|
|
(*env)->ReleaseByteArrayElements (env, arr, octets, 0); |
|
|
|
|
751 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
752 |
{ |
{ |
753 |
|
char *errorstr = TARGET_NATIVE_LAST_ERROR_STRING (); |
754 |
|
(*env)->ReleaseByteArrayElements (env, arr, octets, 0); |
755 |
|
|
756 |
JCL_ThrowException (env, BIND_EXCEPTION, |
JCL_ThrowException (env, BIND_EXCEPTION, |
757 |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
errorstr); |
758 |
return; |
return; |
759 |
} |
} |
760 |
DBG ("_javanet_bind(): Past bind\n"); |
DBG ("_javanet_bind(): Past bind\n"); |
761 |
|
|
762 |
|
(*env)->ReleaseByteArrayElements (env, arr, octets, 0); |
763 |
|
|
764 |
/* Update instance variables, specifically the local port number */ |
/* Update instance variables, specifically the local port number */ |
765 |
TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO (fd, local_address, local_port, |
TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO (fd, local_address, local_port, |
766 |
result); |
result); |
869 |
|
|
870 |
if ((*env)->ExceptionOccurred (env)) |
if ((*env)->ExceptionOccurred (env)) |
871 |
{ |
{ |
872 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
/* Try to make sure we close the socket since close() won't work. */ |
873 |
|
do |
874 |
|
{ |
875 |
|
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
876 |
|
if (result != TARGET_NATIVE_OK |
877 |
|
&& (TARGET_NATIVE_LAST_ERROR () |
878 |
|
!= TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL)) |
879 |
|
return; |
880 |
|
} |
881 |
|
while (result != TARGET_NATIVE_OK); |
882 |
return; |
return; |
883 |
} |
} |
884 |
|
|
886 |
local_port, result); |
local_port, result); |
887 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
888 |
{ |
{ |
889 |
|
/* We don't care whether this succeeds. close() will cleanup later. */ |
890 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
891 |
JCL_ThrowException (env, IO_EXCEPTION, |
JCL_ThrowException (env, IO_EXCEPTION, |
892 |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
896 |
_javanet_create_localfd (env, impl); |
_javanet_create_localfd (env, impl); |
897 |
if ((*env)->ExceptionOccurred (env)) |
if ((*env)->ExceptionOccurred (env)) |
898 |
{ |
{ |
899 |
|
/* We don't care whether this succeeds. close() will cleanup later. */ |
900 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
901 |
return; |
return; |
902 |
} |
} |
905 |
local_port); |
local_port); |
906 |
if ((*env)->ExceptionOccurred (env)) |
if ((*env)->ExceptionOccurred (env)) |
907 |
{ |
{ |
908 |
|
/* We don't care whether this succeeds. close() will cleanup later. */ |
909 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
910 |
return; |
return; |
911 |
} |
} |
914 |
remote_port, result); |
remote_port, result); |
915 |
if (result != TARGET_NATIVE_OK) |
if (result != TARGET_NATIVE_OK) |
916 |
{ |
{ |
|
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
|
917 |
JCL_ThrowException (env, IO_EXCEPTION, |
JCL_ThrowException (env, IO_EXCEPTION, |
918 |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
919 |
|
/* We don't care whether this succeeds. close() will cleanup later. */ |
920 |
|
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
921 |
return; |
return; |
922 |
} |
} |
923 |
|
|
924 |
_javanet_set_remhost (env, impl, remote_address); |
_javanet_set_remhost (env, impl, remote_address); |
925 |
if ((*env)->ExceptionOccurred (env)) |
if ((*env)->ExceptionOccurred (env)) |
926 |
{ |
{ |
927 |
|
/* We don't care whether this succeeds. close() will cleanup later. */ |
928 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
929 |
return; |
return; |
930 |
} |
} |
933 |
remote_port); |
remote_port); |
934 |
if ((*env)->ExceptionOccurred (env)) |
if ((*env)->ExceptionOccurred (env)) |
935 |
{ |
{ |
936 |
|
/* We don't care whether this succeeds. close() will cleanup later. */ |
937 |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result); |
938 |
return; |
return; |
939 |
} |
} |
1013 |
(TARGET_NATIVE_LAST_ERROR () == |
(TARGET_NATIVE_LAST_ERROR () == |
1014 |
TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL)); |
TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL)); |
1015 |
|
|
|
(*env)->ReleaseByteArrayElements (env, buf, p, 0); |
|
|
|
|
1016 |
if (received_bytes == -1) |
if (received_bytes == -1) |
1017 |
{ |
{ |
1018 |
JCL_ThrowException (env, IO_EXCEPTION, |
if (TARGET_NATIVE_LAST_ERROR () == EAGAIN) |
1019 |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
JCL_ThrowException (env, "java/net/SocketTimeoutException", "Timeout"); |
1020 |
|
else |
1021 |
|
JCL_ThrowException (env, IO_EXCEPTION, |
1022 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1023 |
|
|
1024 |
|
/* Cleanup and return. */ |
1025 |
|
(*env)->ReleaseByteArrayElements (env, buf, p, 0); |
1026 |
return 0; |
return 0; |
1027 |
} |
} |
1028 |
|
|
1029 |
|
(*env)->ReleaseByteArrayElements (env, buf, p, 0); |
1030 |
|
|
1031 |
/* Handle return addr case */ |
/* Handle return addr case */ |
1032 |
if (addr != NULL) |
if (addr != NULL) |
1033 |
{ |
{ |
1078 |
if (p == NULL) |
if (p == NULL) |
1079 |
return; |
return; |
1080 |
|
|
1081 |
/* Send the data */ |
/* We must send all the data, so repeat till done. */ |
1082 |
if (addr == 0) |
while (len > 0) |
1083 |
{ |
{ |
1084 |
DBG ("_javanet_sendto(): Sending....\n"); |
/* Send the data */ |
1085 |
TARGET_NATIVE_NETWORK_SOCKET_SEND (fd, p + offset, len, bytes_sent); |
if (addr == 0) |
1086 |
} |
{ |
1087 |
else |
DBG ("_javanet_sendto(): Sending....\n"); |
1088 |
{ |
TARGET_NATIVE_NETWORK_SOCKET_SEND (fd, p + offset, len, bytes_sent); |
1089 |
DBG ("_javanet_sendto(): Sending....\n"); |
} |
1090 |
TARGET_NATIVE_NETWORK_SOCKET_SEND_WITH_ADDRESS_PORT (fd, p + offset, |
else |
1091 |
len, addr, port, |
{ |
1092 |
bytes_sent); |
DBG ("_javanet_sendto(): Sending....\n"); |
1093 |
|
TARGET_NATIVE_NETWORK_SOCKET_SEND_WITH_ADDRESS_PORT (fd, p + offset, |
1094 |
|
len, addr, port, |
1095 |
|
bytes_sent); |
1096 |
|
} |
1097 |
|
|
1098 |
|
if (bytes_sent < 0) |
1099 |
|
{ |
1100 |
|
if (TARGET_NATIVE_LAST_ERROR () |
1101 |
|
!= TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL) |
1102 |
|
{ |
1103 |
|
JCL_ThrowException (env, IO_EXCEPTION, |
1104 |
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1105 |
|
break; |
1106 |
|
} |
1107 |
|
} |
1108 |
|
else |
1109 |
|
{ |
1110 |
|
len -= bytes_sent; |
1111 |
|
addr += bytes_sent; |
1112 |
|
} |
1113 |
} |
} |
1114 |
|
|
1115 |
(*env)->ReleaseByteArrayElements (env, buf, p, 0); |
(*env)->ReleaseByteArrayElements (env, buf, p, 0); |
1116 |
|
|
|
/***** Do we need to check EINTR? */ |
|
|
if (bytes_sent < 0) |
|
|
{ |
|
|
JCL_ThrowException (env, IO_EXCEPTION, |
|
|
TARGET_NATIVE_LAST_ERROR_STRING ()); |
|
|
return; |
|
|
} |
|
1117 |
#else /* not WITHOUT_NETWORK */ |
#else /* not WITHOUT_NETWORK */ |
1118 |
#endif /* not WITHOUT_NETWORK */ |
#endif /* not WITHOUT_NETWORK */ |
1119 |
} |
} |
1226 |
return; |
return; |
1227 |
|
|
1228 |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_TIMEOUT (fd, optval, result); |
TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_TIMEOUT (fd, optval, result); |
1229 |
#endif |
#else |
|
/* ignore errors and do not throw an exception. */ |
|
1230 |
result = TARGET_NATIVE_OK; |
result = TARGET_NATIVE_OK; |
1231 |
|
#endif |
1232 |
break; |
break; |
1233 |
|
|
1234 |
case SOCKOPT_SO_SNDBUF: |
case SOCKOPT_SO_SNDBUF: |
1413 |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
TARGET_NATIVE_LAST_ERROR_STRING ()); |
1414 |
return (0); |
return (0); |
1415 |
} |
} |
|
|
|
1416 |
return (_javanet_create_integer (env, optval)); |
return (_javanet_create_integer (env, optval)); |
1417 |
#else |
#else |
1418 |
JCL_ThrowException (env, SOCKET_EXCEPTION, |
JCL_ThrowException (env, SOCKET_EXCEPTION, |