parent
c231c91e55
commit
4033adc630
|
@ -7,23 +7,15 @@ Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
|
|||
details. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#ifndef ENOPROTOOPT
|
||||
#define ENOPROTOOPT 109
|
||||
#endif
|
||||
|
||||
#define NATIVE_CLOSE(s) closesocket (s)
|
||||
|
||||
#else /* WIN32 */
|
||||
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
@ -33,8 +25,6 @@ details. */
|
|||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#define NATIVE_CLOSE(s) ::close (s)
|
||||
|
||||
#endif /* WIN32 */
|
||||
|
||||
#if HAVE_BSTRING_H
|
||||
|
@ -42,20 +32,6 @@ details. */
|
|||
#include <bstring.h>
|
||||
#endif
|
||||
|
||||
#ifndef DISABLE_JAVA_NET
|
||||
// Avoid macro definitions of bind from system headers, e.g. on
|
||||
// Solaris 7 with _XOPEN_SOURCE. FIXME
|
||||
static inline int
|
||||
_Jv_bind (int fd, struct sockaddr *addr, int addrlen)
|
||||
{
|
||||
return ::bind (fd, addr, addrlen);
|
||||
}
|
||||
#endif /* DISABLE_JAVA_NET */
|
||||
|
||||
#ifdef bind
|
||||
#undef bind
|
||||
#endif
|
||||
|
||||
#include <gcj/cni.h>
|
||||
#include <java/io/IOException.h>
|
||||
#include <java/io/InterruptedIOException.h>
|
||||
|
@ -212,7 +188,8 @@ union InAddr
|
|||
void
|
||||
java::net::PlainDatagramSocketImpl::create ()
|
||||
{
|
||||
int sock = ::socket (AF_INET, SOCK_DGRAM, 0);
|
||||
int sock = _Jv_socket (AF_INET, SOCK_DGRAM, 0);
|
||||
|
||||
if (sock < 0)
|
||||
{
|
||||
char* strerr = strerror (errno);
|
||||
|
@ -240,10 +217,12 @@ java::net::PlainDatagramSocketImpl::bind (jint lport,
|
|||
if (len == 4)
|
||||
{
|
||||
u.address.sin_family = AF_INET;
|
||||
|
||||
if (host != NULL)
|
||||
memcpy (&u.address.sin_addr, bytes, len);
|
||||
memcpy (&u.address.sin_addr, bytes, len);
|
||||
else
|
||||
u.address.sin_addr.s_addr = htonl (INADDR_ANY);
|
||||
u.address.sin_addr.s_addr = htonl (INADDR_ANY);
|
||||
|
||||
len = sizeof (struct sockaddr_in);
|
||||
u.address.sin_port = htons (lport);
|
||||
}
|
||||
|
@ -262,19 +241,23 @@ java::net::PlainDatagramSocketImpl::bind (jint lport,
|
|||
if (_Jv_bind (fnum, ptr, len) == 0)
|
||||
{
|
||||
socklen_t addrlen = sizeof(u);
|
||||
|
||||
if (lport != 0)
|
||||
localPort = lport;
|
||||
else if (::getsockname (fnum, (sockaddr*) &u, &addrlen) == 0)
|
||||
localPort = ntohs (u.address.sin_port);
|
||||
else
|
||||
goto error;
|
||||
|
||||
/* Allow broadcast by default. */
|
||||
int broadcast = 1;
|
||||
if (::setsockopt (fnum, SOL_SOCKET, SO_BROADCAST, (char *) &broadcast,
|
||||
sizeof (broadcast)) != 0)
|
||||
goto error;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
error:
|
||||
char* strerr = strerror (errno);
|
||||
throw new java::net::BindException (JvNewStringUTF (strerr));
|
||||
|
@ -329,8 +312,10 @@ java::net::PlainDatagramSocketImpl::peek (java::net::InetAddress *i)
|
|||
return rport;
|
||||
error:
|
||||
char* strerr = strerror (errno);
|
||||
|
||||
if (errno == ECONNREFUSED)
|
||||
throw new PortUnreachableException (JvNewStringUTF (strerr));
|
||||
|
||||
throw new java::io::IOException (JvNewStringUTF (strerr));
|
||||
}
|
||||
|
||||
|
@ -356,9 +341,9 @@ java::net::PlainDatagramSocketImpl::peekData(java::net::DatagramPacket *p)
|
|||
tv.tv_usec = (timeout % 1000) * 1000;
|
||||
int retval;
|
||||
if ((retval = _Jv_select (fnum + 1, &rset, NULL, NULL, &tv)) < 0)
|
||||
goto error;
|
||||
goto error;
|
||||
else if (retval == 0)
|
||||
throw new java::io::InterruptedIOException ();
|
||||
throw new java::io::InterruptedIOException ();
|
||||
}
|
||||
#endif /* WIN32 */
|
||||
|
||||
|
@ -391,10 +376,13 @@ java::net::PlainDatagramSocketImpl::peekData(java::net::DatagramPacket *p)
|
|||
p->setPort (rport);
|
||||
p->setLength ((jint) retlen);
|
||||
return rport;
|
||||
|
||||
error:
|
||||
char* strerr = strerror (errno);
|
||||
|
||||
if (errno == ECONNREFUSED)
|
||||
throw new PortUnreachableException (JvNewStringUTF (strerr));
|
||||
|
||||
throw new java::io::IOException (JvNewStringUTF (strerr));
|
||||
}
|
||||
|
||||
|
@ -407,7 +395,7 @@ java::net::PlainDatagramSocketImpl::close ()
|
|||
|
||||
// The method isn't declared to throw anything, so we disregard
|
||||
// the return value.
|
||||
NATIVE_CLOSE (fnum);
|
||||
_Jv_close (fnum);
|
||||
fnum = -1;
|
||||
timeout = 0;
|
||||
}
|
||||
|
@ -446,8 +434,10 @@ java::net::PlainDatagramSocketImpl::send (java::net::DatagramPacket *p)
|
|||
return;
|
||||
|
||||
char* strerr = strerror (errno);
|
||||
|
||||
if (errno == ECONNREFUSED)
|
||||
throw new PortUnreachableException (JvNewStringUTF (strerr));
|
||||
|
||||
throw new java::io::IOException (JvNewStringUTF (strerr));
|
||||
}
|
||||
|
||||
|
@ -473,9 +463,9 @@ java::net::PlainDatagramSocketImpl::receive (java::net::DatagramPacket *p)
|
|||
tv.tv_usec = (timeout % 1000) * 1000;
|
||||
int retval;
|
||||
if ((retval = _Jv_select (fnum + 1, &rset, NULL, NULL, &tv)) < 0)
|
||||
goto error;
|
||||
goto error;
|
||||
else if (retval == 0)
|
||||
throw new java::io::InterruptedIOException ();
|
||||
throw new java::io::InterruptedIOException ();
|
||||
}
|
||||
#endif /* WIN32 */
|
||||
|
||||
|
@ -508,10 +498,13 @@ java::net::PlainDatagramSocketImpl::receive (java::net::DatagramPacket *p)
|
|||
p->setPort (rport);
|
||||
p->setLength ((jint) retlen);
|
||||
return;
|
||||
|
||||
error:
|
||||
char* strerr = strerror (errno);
|
||||
|
||||
if (errno == ECONNREFUSED)
|
||||
throw new PortUnreachableException (JvNewStringUTF (strerr));
|
||||
|
||||
throw new java::io::IOException (JvNewStringUTF (strerr));
|
||||
}
|
||||
|
||||
|
@ -521,6 +514,7 @@ java::net::PlainDatagramSocketImpl::setTimeToLive (jint ttl)
|
|||
// Assumes IPPROTO_IP rather than IPPROTO_IPV6 since socket created is IPv4.
|
||||
char val = (char) ttl;
|
||||
socklen_t val_len = sizeof(val);
|
||||
|
||||
if (::setsockopt (fnum, IPPROTO_IP, IP_MULTICAST_TTL, &val, val_len) == 0)
|
||||
return;
|
||||
|
||||
|
@ -534,6 +528,7 @@ java::net::PlainDatagramSocketImpl::getTimeToLive ()
|
|||
// Assumes IPPROTO_IP rather than IPPROTO_IPV6 since socket created is IPv4.
|
||||
char val;
|
||||
socklen_t val_len = sizeof(val);
|
||||
|
||||
if (::getsockopt (fnum, IPPROTO_IP, IP_MULTICAST_TTL, &val, &val_len) == 0)
|
||||
return ((int) val) & 0xFF;
|
||||
|
||||
|
|
|
@ -10,7 +10,9 @@ details. */
|
|||
#include <platform.h>
|
||||
|
||||
#ifndef DISABLE_JAVA_NET
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#include <windows.h>
|
||||
#include <winsock.h>
|
||||
#include <errno.h>
|
||||
|
@ -20,8 +22,6 @@ details. */
|
|||
#undef MIN_PRIORITY
|
||||
#undef FIONREAD
|
||||
|
||||
#define NATIVE_CLOSE(s) closesocket (s)
|
||||
|
||||
// These functions make the Win32 socket API look more POSIXy
|
||||
static inline int
|
||||
write(int s, void *buf, int len)
|
||||
|
@ -36,11 +36,6 @@ read(int s, void *buf, int len)
|
|||
}
|
||||
|
||||
// these errors cannot occur on Win32
|
||||
#define ENOTCONN 0
|
||||
#define ECONNRESET 0
|
||||
#ifndef ENOPROTOOPT
|
||||
#define ENOPROTOOPT 109
|
||||
#endif
|
||||
#else /* WIN32 */
|
||||
|
||||
#ifdef HAVE_SYS_IOCTL_H
|
||||
|
@ -53,14 +48,11 @@ read(int s, void *buf, int len)
|
|||
#include <sys/filio.h>
|
||||
#endif
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#define NATIVE_CLOSE(s) ::close (s)
|
||||
|
||||
#endif /* WIN32 */
|
||||
#endif /* DISABLE_JAVA_NET */
|
||||
|
||||
|
@ -73,43 +65,6 @@ read(int s, void *buf, int len)
|
|||
typedef int socklen_t;
|
||||
#endif
|
||||
|
||||
#ifndef DISABLE_JAVA_NET
|
||||
|
||||
// Avoid macro definitions of bind, connect from system headers, e.g. on
|
||||
// Solaris 7 with _XOPEN_SOURCE. FIXME
|
||||
static inline int
|
||||
_Jv_bind (int fd, struct sockaddr *addr, int addrlen)
|
||||
{
|
||||
return ::bind (fd, addr, addrlen);
|
||||
}
|
||||
|
||||
#ifdef bind
|
||||
#undef bind
|
||||
#endif
|
||||
|
||||
static inline int
|
||||
_Jv_connect (int fd, struct sockaddr *addr, int addrlen)
|
||||
{
|
||||
return ::connect (fd, addr, addrlen);
|
||||
}
|
||||
|
||||
#ifdef connect
|
||||
#undef connect
|
||||
#endif
|
||||
|
||||
// Same problem with accept on Tru64 UNIX with _POSIX_PII_SOCKET
|
||||
static inline int
|
||||
_Jv_accept (int fd, struct sockaddr *addr, socklen_t *addrlen)
|
||||
{
|
||||
return ::accept (fd, addr, addrlen);
|
||||
}
|
||||
|
||||
#ifdef accept
|
||||
#undef accept
|
||||
#endif
|
||||
|
||||
#endif /* DISABLE_JAVA_NET */
|
||||
|
||||
#include <gcj/cni.h>
|
||||
#include <gcj/javaprims.h>
|
||||
#include <java/io/IOException.h>
|
||||
|
@ -258,7 +213,7 @@ union SockAddr
|
|||
void
|
||||
java::net::PlainSocketImpl::create (jboolean stream)
|
||||
{
|
||||
int sock = ::socket (AF_INET, stream ? SOCK_STREAM : SOCK_DGRAM, 0);
|
||||
int sock = _Jv_socket (AF_INET, stream ? SOCK_STREAM : SOCK_DGRAM, 0);
|
||||
|
||||
if (sock < 0)
|
||||
{
|
||||
|
@ -495,7 +450,7 @@ java::net::PlainSocketImpl::close()
|
|||
JvSynchronize sync (this);
|
||||
|
||||
// should we use shutdown here? how would that effect so_linger?
|
||||
int res = NATIVE_CLOSE (fnum);
|
||||
int res = _Jv_close (fnum);
|
||||
|
||||
if (res == -1)
|
||||
{
|
||||
|
@ -518,7 +473,7 @@ java::net::PlainSocketImpl::write(jint b)
|
|||
|
||||
while (r != 1)
|
||||
{
|
||||
r = ::write (fnum, &d, 1);
|
||||
r = _Jv_write (fnum, &d, 1);
|
||||
if (r == -1)
|
||||
{
|
||||
if (java::lang::Thread::interrupted())
|
||||
|
@ -551,7 +506,7 @@ java::net::PlainSocketImpl::write(jbyteArray b, jint offset, jint len)
|
|||
|
||||
while (len > 0)
|
||||
{
|
||||
int r = ::write (fnum, bytes, len);
|
||||
int r = _Jv_write (fnum, bytes, len);
|
||||
|
||||
if (r == -1)
|
||||
{
|
||||
|
@ -614,7 +569,7 @@ java::net::PlainSocketImpl::read(void)
|
|||
}
|
||||
#endif /* WIN32 */
|
||||
|
||||
int r = ::read (fnum, &b, 1);
|
||||
int r = _Jv_read (fnum, &b, 1);
|
||||
|
||||
if (r == 0)
|
||||
return -1;
|
||||
|
|
Loading…
Reference in New Issue