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
#include <errno.h>
#include <string.h>
-#define NATIVE_CLOSE(s) ::close (s)
-
#endif /* WIN32 */
#if HAVE_BSTRING_H
#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>
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);
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);
}
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));
return rport;
error:
char* strerr = strerror (errno);
+
if (errno == ECONNREFUSED)
throw new PortUnreachableException (JvNewStringUTF (strerr));
+
throw new java::io::IOException (JvNewStringUTF (strerr));
}
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 */
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));
}
// The method isn't declared to throw anything, so we disregard
// the return value.
- NATIVE_CLOSE (fnum);
+ _Jv_close (fnum);
fnum = -1;
timeout = 0;
}
return;
char* strerr = strerror (errno);
+
if (errno == ECONNREFUSED)
throw new PortUnreachableException (JvNewStringUTF (strerr));
+
throw new java::io::IOException (JvNewStringUTF (strerr));
}
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 */
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));
}
// 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;
// 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;
#include <platform.h>
#ifndef DISABLE_JAVA_NET
+
#ifdef WIN32
+
#include <windows.h>
#include <winsock.h>
#include <errno.h>
#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)
}
// 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
#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 */
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>
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)
{
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)
{
while (r != 1)
{
- r = ::write (fnum, &d, 1);
+ r = _Jv_write (fnum, &d, 1);
if (r == -1)
{
if (java::lang::Thread::interrupted())
while (len > 0)
{
- int r = ::write (fnum, bytes, len);
+ int r = _Jv_write (fnum, bytes, len);
if (r == -1)
{
}
#endif /* WIN32 */
- int r = ::read (fnum, &b, 1);
+ int r = _Jv_read (fnum, &b, 1);
if (r == 0)
return -1;