Hi,
This is to fix the bug #30488.
ChangeLog
2007-01-18 Ito Kazumitsu <[EMAIL PROTECTED]>
* native/jni/native-lib/cpnet.c(SOCKET_NOSIGNAL): Deleted,
(setsockopt_NOSIGPIPE): New function,
(cpnet_send): Corrected the option setting to send(),
(cpnet_sendTo): Corrected the option setting to sendto().
cvs diff: Diffing classpath/native/jni/native-lib
Index: classpath/native/jni/native-lib/cpnet.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/native-lib/cpnet.c,v
retrieving revision 1.5
diff -u -r1.5 cpnet.c
--- classpath/native/jni/native-lib/cpnet.c 17 Sep 2006 07:31:43 -0000
1.5
+++ classpath/native/jni/native-lib/cpnet.c 16 Jan 2007 22:03:17 -0000
@@ -55,14 +55,6 @@
#define SOCKET_DEFAULT_TIMEOUT -1 /* milliseconds */
-#if defined (HAVE_MSG_NOSIGNAL)
-#define SOCKET_NOSIGNAL MSG_NOSIGNAL
-#elif defined (HAVE_SO_NOSIGPIPE)
-#define SOCKET_NOSIGNAL SO_NOSIGPIPE
-#else
-#error "No suitable flag found to ommit a SIGPIPE on signal errors with
send()."
-#endif
-
static int socketTimeouts[FD_SETSIZE];
static jint waitForWritable(jint fd)
@@ -249,6 +241,15 @@
return 0;
}
+#if defined (HAVE_MSG_NOSIGNAL)
+#elif defined (HAVE_SO_NOSIGPIPE)
+static int setsockopt_NOSIGPIPE (int fd)
+{
+ int setToTrue = 1;
+ return setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &setToTrue,
sizeof(setToTrue));
+}
+#endif
+
jint cpnet_send (JNIEnv *env UNUSED, jint fd, jbyte *data, jint len, jint
*bytes_sent)
{
ssize_t ret;
@@ -256,7 +257,17 @@
if (waitForWritable(fd) < 0)
return ETIMEDOUT;
- ret = send(fd, data, len, SOCKET_NOSIGNAL);
+#if defined (HAVE_MSG_NOSIGNAL)
+ ret = send(fd, data, len, MSG_NOSIGNAL);
+#elif defined (HAVE_SO_NOSIGPIPE)
+ ret = setsockopt_NOSIGPIPE(fd);
+ if (ret == 0) ret = send(fd, data, len, 0);
+#else
+ /* We want SIGPIPE to be omitted. But this configuration does not have an
+ * option for that.
+ */
+ ret = send(fd, data, len, 0);
+#endif
if (ret < 0)
return errno;
@@ -272,8 +283,24 @@
if (waitForWritable(fd) < 0)
return ETIMEDOUT;
- ret = sendto(fd, data, len, SOCKET_NOSIGNAL, (struct sockaddr *)addr->data,
+#if defined (HAVE_MSG_NOSIGNAL)
+ ret = sendto(fd, data, len, MSG_NOSIGNAL, (struct sockaddr *)addr->data,
+ addr->len);
+#elif defined (HAVE_SO_NOSIGPIPE)
+ ret = setsockopt_NOSIGPIPE(fd);
+ if (ret == 0)
+ {
+ ret = sendto(fd, data, len, 0, (struct sockaddr *)addr->data,
+ addr->len);
+ }
+#else
+ /* We want SIGPIPE to be omitted. But this configuration does not have an
+ * option for that.
+ */
+ ret = sendto(fd, data, len, 0, (struct sockaddr *)addr->data,
addr->len);
+#endif
+
if (ret < 0)
return errno;