]>
gcc.gnu.org Git - gcc.git/blob - libjava/java/net/natPlainDatagramSocketImpl.cc
1 /* Copyright (C) 1999, 2000, 2002 Free Software Foundation
3 This file is part of libgcj.
5 This software is copyrighted work licensed under the terms of the
6 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
17 #define ENOPROTOOPT 109
20 #define NATIVE_CLOSE(s) closesocket (s)
24 #ifdef HAVE_SYS_SOCKET_H
25 #include <sys/socket.h>
27 #ifdef HAVE_NETINET_IN_H
28 #include <netinet/in.h>
30 #ifdef HAVE_ARPA_INET_H
31 #include <arpa/inet.h>
36 #define NATIVE_CLOSE(s) ::close (s)
41 // Needed for bzero, implicitly used by FD_ZERO on IRIX 5.2
45 #ifndef DISABLE_JAVA_NET
46 // Avoid macro definitions of bind from system headers, e.g. on
47 // Solaris 7 with _XOPEN_SOURCE. FIXME
49 _Jv_bind (int fd
, struct sockaddr
*addr
, int addrlen
)
51 return ::bind (fd
, addr
, addrlen
);
53 #endif /* DISABLE_JAVA_NET */
60 #include <java/io/IOException.h>
61 #include <java/io/InterruptedIOException.h>
62 #include <java/net/BindException.h>
63 #include <java/net/SocketException.h>
64 #include <java/net/PlainDatagramSocketImpl.h>
65 #include <java/net/InetAddress.h>
66 #include <java/net/DatagramPacket.h>
67 #include <java/lang/InternalError.h>
68 #include <java/lang/Object.h>
69 #include <java/lang/Boolean.h>
70 #include <java/lang/Integer.h>
72 #ifdef DISABLE_JAVA_NET
75 java::net::PlainDatagramSocketImpl::create ()
77 throw new SocketException (
78 JvNewStringLatin1 ("DatagramSocketImpl.create: unimplemented"));
82 java::net::PlainDatagramSocketImpl::bind (jint
, java::net::InetAddress
*)
84 throw new BindException (
85 JvNewStringLatin1 ("DatagramSocketImpl.bind: unimplemented"));
89 java::net::PlainDatagramSocketImpl::peek (java::net::InetAddress
*)
91 throw new java::io::IOException (
92 JvNewStringLatin1 ("DatagramSocketImpl.peek: unimplemented"));
96 java::net::PlainDatagramSocketImpl::peekData(java::net::DatagramPacket
*)
98 throw new java::io::IOException (
99 JvNewStringLatin1 ("DatagramSocketImpl.peekData: unimplemented"));
103 java::net::PlainDatagramSocketImpl::close ()
105 throw new java::io::IOException (
106 JvNewStringLatin1 ("DatagramSocketImpl.close: unimplemented"));
110 java::net::PlainDatagramSocketImpl::send (java::net::DatagramPacket
*)
112 throw new java::io::IOException (
113 JvNewStringLatin1 ("DatagramSocketImpl.send: unimplemented"));
117 java::net::PlainDatagramSocketImpl::receive (java::net::DatagramPacket
*)
119 throw new java::io::IOException (
120 JvNewStringLatin1 ("DatagramSocketImpl.receive: unimplemented"));
124 java::net::PlainDatagramSocketImpl::setTimeToLive (jint
)
126 throw new java::io::IOException (
127 JvNewStringLatin1 ("DatagramSocketImpl.setTimeToLive: unimplemented"));
131 java::net::PlainDatagramSocketImpl::getTimeToLive ()
133 throw new java::io::IOException (
134 JvNewStringLatin1 ("DatagramSocketImpl.getTimeToLive: unimplemented"));
138 java::net::PlainDatagramSocketImpl::mcastGrp (java::net::InetAddress
*,
141 throw new java::io::IOException (
142 JvNewStringLatin1 ("DatagramSocketImpl.mcastGrp: unimplemented"));
146 java::net::PlainDatagramSocketImpl::setOption (jint
, java::lang::Object
*)
148 throw new SocketException (
149 JvNewStringLatin1 ("DatagramSocketImpl.setOption: unimplemented"));
153 java::net::PlainDatagramSocketImpl::getOption (jint
)
155 throw new SocketException (
156 JvNewStringLatin1 ("DatagramSocketImpl.getOption: unimplemented"));
159 #else /* DISABLE_JAVA_NET */
161 #ifndef HAVE_SOCKLEN_T
162 typedef int socklen_t
;
167 struct sockaddr_in address
;
169 struct sockaddr_in6 address6
;
175 #if HAVE_STRUCT_IP_MREQ
178 #if HAVE_STRUCT_IPV6_MREQ
179 struct ipv6_mreq mreq6
;
187 struct in6_addr addr6
;
192 // FIXME: routines here and/or in natPlainSocketImpl.cc could throw
193 // NoRouteToHostException; also consider UnknownHostException, ConnectException.
196 java::net::PlainDatagramSocketImpl::create ()
198 int sock
= ::socket (AF_INET
, SOCK_DGRAM
, 0);
201 char* strerr
= strerror (errno
);
202 throw new java::net::SocketException (JvNewStringUTF (strerr
));
205 _Jv_platform_close_on_exec (sock
);
207 // We use fnum in place of fd here. From leaving fd null we avoid
208 // the double close problem in FileDescriptor.finalize.
213 java::net::PlainDatagramSocketImpl::bind (jint lport
,
214 java::net::InetAddress
*host
)
217 struct sockaddr
*ptr
= (struct sockaddr
*) &u
.address
;
218 // FIXME: Use getaddrinfo() to get actual protocol instead of assuming ipv4.
219 jbyteArray haddress
= host
->addr
;
220 jbyte
*bytes
= elements (haddress
);
221 int len
= haddress
->length
;
225 u
.address
.sin_family
= AF_INET
;
227 memcpy (&u
.address
.sin_addr
, bytes
, len
);
229 u
.address
.sin_addr
.s_addr
= htonl (INADDR_ANY
);
230 len
= sizeof (struct sockaddr_in
);
231 u
.address
.sin_port
= htons (lport
);
236 u
.address6
.sin6_family
= AF_INET6
;
237 memcpy (&u
.address6
.sin6_addr
, bytes
, len
);
238 len
= sizeof (struct sockaddr_in6
);
239 u
.address6
.sin6_port
= htons (lport
);
243 throw new java::net::SocketException (JvNewStringUTF ("invalid length"));
245 if (_Jv_bind (fnum
, ptr
, len
) == 0)
247 socklen_t addrlen
= sizeof(u
);
250 else if (::getsockname (fnum
, (sockaddr
*) &u
, &addrlen
) == 0)
251 localPort
= ntohs (u
.address
.sin_port
);
254 /* Allow broadcast by default. */
256 if (::setsockopt (fnum
, SOL_SOCKET
, SO_BROADCAST
, (char *) &broadcast
,
257 sizeof (broadcast
)) != 0)
262 char* strerr
= strerror (errno
);
263 throw new java::net::BindException (JvNewStringUTF (strerr
));
267 java::net::PlainDatagramSocketImpl::peek (java::net::InetAddress
*i
)
269 // FIXME: Deal with Multicast and if the socket is connected.
271 socklen_t addrlen
= sizeof(u
);
273 ::recvfrom (fnum
, (char *) NULL
, 0, MSG_PEEK
, (sockaddr
*) &u
,
277 // FIXME: Deal with Multicast addressing and if the socket is connected.
280 if (u
.address
.sin_family
== AF_INET
)
282 raddr
= JvNewByteArray (4);
283 memcpy (elements (raddr
), &u
.address
.sin_addr
, 4);
284 rport
= ntohs (u
.address
.sin_port
);
287 else if (u
.address
.sin_family
== AF_INET6
)
289 raddr
= JvNewByteArray (16);
290 memcpy (elements (raddr
), &u
.address6
.sin6_addr
, 16);
291 rport
= ntohs (u
.address6
.sin6_port
);
295 throw new java::net::SocketException (JvNewStringUTF ("invalid family"));
300 char* strerr
= strerror (errno
);
301 throw new java::io::IOException (JvNewStringUTF (strerr
));
305 java::net::PlainDatagramSocketImpl::peekData(java::net::DatagramPacket
*p
)
307 // FIXME: Deal with Multicast and if the socket is connected.
309 socklen_t addrlen
= sizeof(u
);
310 jbyte
*dbytes
= elements (p
->getData());
313 // FIXME: implement timeout support for Win32
315 // Do timeouts via select since SO_RCVTIMEO is not always available.
316 if (timeout
> 0 && fnum
>= 0 && fnum
< FD_SETSIZE
)
322 tv
.tv_sec
= timeout
/ 1000;
323 tv
.tv_usec
= (timeout
% 1000) * 1000;
325 if ((retval
= _Jv_select (fnum
+ 1, &rset
, NULL
, NULL
, &tv
)) < 0)
327 else if (retval
== 0)
328 throw new java::io::InterruptedIOException ();
333 ::recvfrom (fnum
, (char *) dbytes
, p
->getLength(), MSG_PEEK
, (sockaddr
*) &u
,
337 // FIXME: Deal with Multicast addressing and if the socket is connected.
340 if (u
.address
.sin_family
== AF_INET
)
342 raddr
= JvNewByteArray (4);
343 memcpy (elements (raddr
), &u
.address
.sin_addr
, 4);
344 rport
= ntohs (u
.address
.sin_port
);
347 else if (u
.address
.sin_family
== AF_INET6
)
349 raddr
= JvNewByteArray (16);
350 memcpy (elements (raddr
), &u
.address6
.sin6_addr
, 16);
351 rport
= ntohs (u
.address6
.sin6_port
);
355 throw new java::net::SocketException (JvNewStringUTF ("invalid family"));
357 p
->setAddress (new InetAddress (raddr
, NULL
));
359 p
->setLength ((jint
) retlen
);
362 char* strerr
= strerror (errno
);
363 throw new java::io::IOException (JvNewStringUTF (strerr
));
366 // Close(shutdown) the socket.
368 java::net::PlainDatagramSocketImpl::close ()
370 // Avoid races from asynchronous finalization.
371 JvSynchronize
sync (this);
373 // The method isn't declared to throw anything, so we disregard
381 java::net::PlainDatagramSocketImpl::send (java::net::DatagramPacket
*p
)
383 // FIXME: Deal with Multicast and if the socket is connected.
384 jint rport
= p
->getPort();
386 jbyteArray haddress
= p
->getAddress()->addr
;
387 jbyte
*bytes
= elements (haddress
);
388 int len
= haddress
->length
;
389 struct sockaddr
*ptr
= (struct sockaddr
*) &u
.address
;
390 jbyte
*dbytes
= elements (p
->getData());
393 u
.address
.sin_family
= AF_INET
;
394 memcpy (&u
.address
.sin_addr
, bytes
, len
);
395 len
= sizeof (struct sockaddr_in
);
396 u
.address
.sin_port
= htons (rport
);
401 u
.address6
.sin6_family
= AF_INET6
;
402 memcpy (&u
.address6
.sin6_addr
, bytes
, len
);
403 len
= sizeof (struct sockaddr_in6
);
404 u
.address6
.sin6_port
= htons (rport
);
408 throw new java::net::SocketException (JvNewStringUTF ("invalid length"));
410 if (::sendto (fnum
, (char *) dbytes
, p
->getLength(), 0, ptr
, len
) >= 0)
413 char* strerr
= strerror (errno
);
414 throw new java::io::IOException (JvNewStringUTF (strerr
));
418 java::net::PlainDatagramSocketImpl::receive (java::net::DatagramPacket
*p
)
420 // FIXME: Deal with Multicast and if the socket is connected.
422 socklen_t addrlen
= sizeof(u
);
423 jbyte
*dbytes
= elements (p
->getData());
426 // FIXME: implement timeout support for Win32
428 // Do timeouts via select since SO_RCVTIMEO is not always available.
429 if (timeout
> 0 && fnum
>= 0 && fnum
< FD_SETSIZE
)
435 tv
.tv_sec
= timeout
/ 1000;
436 tv
.tv_usec
= (timeout
% 1000) * 1000;
438 if ((retval
= _Jv_select (fnum
+ 1, &rset
, NULL
, NULL
, &tv
)) < 0)
440 else if (retval
== 0)
441 throw new java::io::InterruptedIOException ();
446 ::recvfrom (fnum
, (char *) dbytes
, p
->getLength(), 0, (sockaddr
*) &u
,
450 // FIXME: Deal with Multicast addressing and if the socket is connected.
453 if (u
.address
.sin_family
== AF_INET
)
455 raddr
= JvNewByteArray (4);
456 memcpy (elements (raddr
), &u
.address
.sin_addr
, 4);
457 rport
= ntohs (u
.address
.sin_port
);
460 else if (u
.address
.sin_family
== AF_INET6
)
462 raddr
= JvNewByteArray (16);
463 memcpy (elements (raddr
), &u
.address6
.sin6_addr
, 16);
464 rport
= ntohs (u
.address6
.sin6_port
);
468 throw new java::net::SocketException (JvNewStringUTF ("invalid family"));
470 p
->setAddress (new InetAddress (raddr
, NULL
));
472 p
->setLength ((jint
) retlen
);
475 char* strerr
= strerror (errno
);
476 throw new java::io::IOException (JvNewStringUTF (strerr
));
480 java::net::PlainDatagramSocketImpl::setTimeToLive (jint ttl
)
482 // Assumes IPPROTO_IP rather than IPPROTO_IPV6 since socket created is IPv4.
483 char val
= (char) ttl
;
484 socklen_t val_len
= sizeof(val
);
485 if (::setsockopt (fnum
, IPPROTO_IP
, IP_MULTICAST_TTL
, &val
, val_len
) == 0)
488 char* strerr
= strerror (errno
);
489 throw new java::io::IOException (JvNewStringUTF (strerr
));
493 java::net::PlainDatagramSocketImpl::getTimeToLive ()
495 // Assumes IPPROTO_IP rather than IPPROTO_IPV6 since socket created is IPv4.
497 socklen_t val_len
= sizeof(val
);
498 if (::getsockopt (fnum
, IPPROTO_IP
, IP_MULTICAST_TTL
, &val
, &val_len
) == 0)
499 return ((int) val
) & 0xFF;
501 char* strerr
= strerror (errno
);
502 throw new java::io::IOException (JvNewStringUTF (strerr
));
506 java::net::PlainDatagramSocketImpl::mcastGrp (java::net::InetAddress
*inetaddr
,
510 jbyteArray haddress
= inetaddr
->addr
;
511 jbyte
*bytes
= elements (haddress
);
512 int len
= haddress
->length
;
517 #if HAVE_STRUCT_IP_MREQ
521 opname
= join
? IP_ADD_MEMBERSHIP
: IP_DROP_MEMBERSHIP
;
522 memcpy (&u
.mreq
.imr_multiaddr
, bytes
, len
);
523 // FIXME: If a non-default interface is set, use it; see Stevens p. 501.
524 // Maybe not, see note in last paragraph at bottom of Stevens p. 497.
525 u
.mreq
.imr_interface
.s_addr
= htonl (INADDR_ANY
);
526 len
= sizeof (struct ip_mreq
);
527 ptr
= (const char *) &u
.mreq
;
530 #if HAVE_STRUCT_IPV6_MREQ
533 level
= IPPROTO_IPV6
;
535 /* Prefer new RFC 2553 names. */
536 #ifndef IPV6_JOIN_GROUP
537 #define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP
539 #ifndef IPV6_LEAVE_GROUP
540 #define IPV6_LEAVE_GROUP IPV6_DROP_MEMBERSHIP
543 opname
= join
? IPV6_JOIN_GROUP
: IPV6_LEAVE_GROUP
;
544 memcpy (&u
.mreq6
.ipv6mr_multiaddr
, bytes
, len
);
545 // FIXME: If a non-default interface is set, use it; see Stevens p. 501.
546 // Maybe not, see note in last paragraph at bottom of Stevens p. 497.
547 u
.mreq6
.ipv6mr_interface
= 0;
548 len
= sizeof (struct ipv6_mreq
);
549 ptr
= (const char *) &u
.mreq6
;
553 throw new java::net::SocketException (JvNewStringUTF ("invalid length"));
555 if (::setsockopt (fnum
, level
, opname
, ptr
, len
) == 0)
558 char* strerr
= strerror (errno
);
559 throw new java::io::IOException (JvNewStringUTF (strerr
));
563 java::net::PlainDatagramSocketImpl::setOption (jint optID
,
564 java::lang::Object
*value
)
567 socklen_t val_len
= sizeof (val
);
570 throw new java::net::SocketException (JvNewStringUTF ("Socket closed"));
572 if (_Jv_IsInstanceOf (value
, &java::lang::Boolean::class$
))
574 java::lang::Boolean
*boolobj
=
575 static_cast<java::lang::Boolean
*> (value
);
576 val
= boolobj
->booleanValue() ? 1 : 0;
578 else if (_Jv_IsInstanceOf (value
, &java::lang::Integer::class$
))
580 java::lang::Integer
*intobj
=
581 static_cast<java::lang::Integer
*> (value
);
582 val
= (int) intobj
->intValue();
584 // Else assume value to be an InetAddress for use with IP_MULTICAST_IF.
588 case _Jv_TCP_NODELAY_
:
589 throw new java::net::SocketException (
590 JvNewStringUTF ("TCP_NODELAY not valid for UDP"));
592 case _Jv_SO_LINGER_
:
593 throw new java::net::SocketException (
594 JvNewStringUTF ("SO_LINGER not valid for UDP"));
596 case _Jv_SO_KEEPALIVE_
:
597 throw new java::net::SocketException (
598 JvNewStringUTF ("SO_KEEPALIVE not valid for UDP"));
601 case _Jv_SO_BROADCAST_
:
602 if (::setsockopt (fnum
, SOL_SOCKET
, SO_BROADCAST
, (char *) &val
,
607 case _Jv_SO_OOBINLINE_
:
608 throw new java::net::SocketException (
609 JvNewStringUTF ("SO_OOBINLINE: not valid for UDP"));
612 case _Jv_SO_SNDBUF_
:
613 case _Jv_SO_RCVBUF_
:
614 #if defined(SO_SNDBUF) && defined(SO_RCVBUF)
616 optID
== _Jv_SO_SNDBUF_
? opt
= SO_SNDBUF
: opt
= SO_RCVBUF
;
617 if (::setsockopt (fnum
, SOL_SOCKET
, opt
, (char *) &val
, val_len
) != 0)
620 throw new java::lang::InternalError (
621 JvNewStringUTF ("SO_RCVBUF/SO_SNDBUF not supported"));
624 case _Jv_SO_REUSEADDR_
:
625 #if defined(SO_REUSEADDR)
626 if (::setsockopt (fnum
, SOL_SOCKET
, SO_REUSEADDR
, (char *) &val
,
630 throw new java::lang::InternalError (
631 JvNewStringUTF ("SO_REUSEADDR not supported"));
634 case _Jv_SO_BINDADDR_
:
635 throw new java::net::SocketException (
636 JvNewStringUTF ("SO_BINDADDR: read only option"));
638 case _Jv_IP_MULTICAST_IF_
:
646 haddress
= ((java::net::InetAddress
*) value
)->addr
;
647 bytes
= elements (haddress
);
648 len
= haddress
->length
;
652 opname
= IP_MULTICAST_IF
;
653 memcpy (&u
.addr
, bytes
, len
);
654 len
= sizeof (struct in_addr
);
655 ptr
= (const char *) &u
.addr
;
657 // Tru64 UNIX V5.0 has struct sockaddr_in6, but no IPV6_MULTICAST_IF
658 #if defined (HAVE_INET6) && defined (IPV6_MULTICAST_IF)
661 level
= IPPROTO_IPV6
;
662 opname
= IPV6_MULTICAST_IF
;
663 memcpy (&u
.addr6
, bytes
, len
);
664 len
= sizeof (struct in6_addr
);
665 ptr
= (const char *) &u
.addr6
;
670 new java::net::SocketException (JvNewStringUTF ("invalid length"));
672 if (::setsockopt (fnum
, level
, opname
, ptr
, len
) != 0)
676 case _Jv_IP_MULTICAST_IF2_
:
677 throw new java::net::SocketException (
678 JvNewStringUTF ("IP_MULTICAST_IF2: not yet implemented"));
681 case _Jv_IP_MULTICAST_LOOP_
:
682 throw new java::net::SocketException (
683 JvNewStringUTF ("IP_MULTICAST_LOOP: not yet implemented"));
687 if (::setsockopt (fnum
, SOL_SOCKET
, IP_TOS
, (char *) &val
,
692 case _Jv_SO_TIMEOUT_
:
700 char* strerr
= strerror (errno
);
701 throw new java::net::SocketException (JvNewStringUTF (strerr
));
705 java::net::PlainDatagramSocketImpl::getOption (jint optID
)
708 socklen_t val_len
= sizeof(val
);
710 socklen_t addrlen
= sizeof(u
);
714 case _Jv_TCP_NODELAY_
:
715 throw new java::net::SocketException (
716 JvNewStringUTF ("TCP_NODELAY not valid for UDP"));
718 case _Jv_SO_LINGER_
:
719 throw new java::net::SocketException (
720 JvNewStringUTF ("SO_LINGER not valid for UDP"));
722 case _Jv_SO_KEEPALIVE_
:
723 throw new java::net::SocketException (
724 JvNewStringUTF ("SO_KEEPALIVE not valid for UDP"));
727 case _Jv_SO_BROADCAST_
:
728 if (::getsockopt (fnum
, SOL_SOCKET
, SO_BROADCAST
, (char *) &val
,
731 return new java::lang::Boolean (val
!= 0);
733 case _Jv_SO_OOBINLINE_
:
734 throw new java::net::SocketException (
735 JvNewStringUTF ("SO_OOBINLINE not valid for UDP"));
738 case _Jv_SO_RCVBUF_
:
739 case _Jv_SO_SNDBUF_
:
740 #if defined(SO_SNDBUF) && defined(SO_RCVBUF)
742 optID
== _Jv_SO_SNDBUF_
? opt
= SO_SNDBUF
: opt
= SO_RCVBUF
;
743 if (::getsockopt (fnum
, SOL_SOCKET
, opt
, (char *) &val
, &val_len
) != 0)
746 return new java::lang::Integer (val
);
748 throw new java::lang::InternalError (
749 JvNewStringUTF ("SO_RCVBUF/SO_SNDBUF not supported"));
752 case _Jv_SO_BINDADDR_
:
753 // cache the local address
754 if (localAddress
== NULL
)
757 if (::getsockname (fnum
, (sockaddr
*) &u
, &addrlen
) != 0)
759 if (u
.address
.sin_family
== AF_INET
)
761 laddr
= JvNewByteArray (4);
762 memcpy (elements (laddr
), &u
.address
.sin_addr
, 4);
765 else if (u
.address
.sin_family
== AF_INET6
)
767 laddr
= JvNewByteArray (16);
768 memcpy (elements (laddr
), &u
.address6
.sin6_addr
, 16);
772 throw new java::net::SocketException (JvNewStringUTF ("invalid family"));
773 localAddress
= new java::net::InetAddress (laddr
, NULL
);
777 case _Jv_SO_REUSEADDR_
:
778 #if defined(SO_REUSEADDR)
779 if (::getsockopt (fnum
, SOL_SOCKET
, SO_REUSEADDR
, (char *) &val
,
782 return new java::lang::Boolean (val
!= 0);
784 throw new java::lang::InternalError (
785 JvNewStringUTF ("SO_REUSEADDR not supported"));
788 case _Jv_IP_MULTICAST_IF_
:
789 #ifdef HAVE_INET_NTOA
790 struct in_addr inaddr
;
791 socklen_t inaddr_len
;
794 inaddr_len
= sizeof(inaddr
);
795 if (::getsockopt (fnum
, IPPROTO_IP
, IP_MULTICAST_IF
, (char *) &inaddr
,
799 bytes
= inet_ntoa (inaddr
);
801 return java::net::InetAddress::getByName (JvNewStringLatin1 (bytes
));
803 throw new java::net::SocketException (
804 JvNewStringUTF ("IP_MULTICAST_IF: not available - no inet_ntoa()"));
807 case _Jv_SO_TIMEOUT_
:
808 return new java::lang::Integer (timeout
);
811 case _Jv_IP_MULTICAST_IF2_
:
812 throw new java::net::SocketException (
813 JvNewStringUTF ("IP_MULTICAST_IF2: not yet implemented"));
816 case _Jv_IP_MULTICAST_LOOP_
:
817 if (::getsockopt (fnum
, SOL_SOCKET
, IP_MULTICAST_LOOP
, (char *) &val
,
820 return new java::lang::Boolean (val
!= 0);
823 if (::getsockopt (fnum
, SOL_SOCKET
, IP_TOS
, (char *) &val
,
826 return new java::lang::Integer (val
);
833 char* strerr
= strerror (errno
);
834 throw new java::net::SocketException (JvNewStringUTF (strerr
));
837 #endif /* DISABLE_JAVA_NET */
This page took 0.075732 seconds and 5 git commands to generate.