[前][次][番号順一覧][スレッド一覧]

ruby-changes:16569

From: naruse <ko1@a...>
Date: Wed, 7 Jul 2010 10:29:55 +0900 (JST)
Subject: [ruby-changes:16569] Ruby:r28561 (trunk): * missing/close.c: ignore ECONNRESET.

naruse	2010-07-07 10:29:22 +0900 (Wed, 07 Jul 2010)

  New Revision: 28561

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28561

  Log:
    * missing/close.c: ignore ECONNRESET.
      FreeBSD wrongly sets ECONNRESET on close(2) and
      it causes false-negative exceptions. [ruby-dev:41778]
    
    * configure.in: ditto.

  Added files:
    trunk/missing/close.c
  Modified files:
    trunk/ChangeLog
    trunk/configure.in
    trunk/include/ruby/ruby.h

Index: include/ruby/ruby.h
===================================================================
--- include/ruby/ruby.h	(revision 28560)
+++ include/ruby/ruby.h	(revision 28561)
@@ -1421,6 +1421,17 @@
 #define snprintf ruby_snprintf
 #define vsnprintf ruby_vsnprintf
 
+#ifdef __FreeBSD__
+#undef getpeername
+#define getpeername ruby_getpeername
+#undef getsockname
+#define getsockname ruby_getsockname
+#undef shutdown
+#define shutdown ruby_shutdown
+#undef close
+#define close ruby_close
+#endif
+
 #if defined(__cplusplus)
 #if 0
 { /* satisfy cc-mode */
Index: configure.in
===================================================================
--- configure.in	(revision 28560)
+++ configure.in	(revision 28561)
@@ -926,6 +926,10 @@
 		AC_DEFINE(BROKEN_SETREGID, 1)
                 ac_cv_sizeof_rlim_t=8],
 [freebsd*], [	LIBS="-lm $LIBS"
+		ac_cv_func_getpeername=no
+		ac_cv_func_getsockname=no
+		ac_cv_func_shutdown=no
+		ac_cv_func_close=no
 		],
 [dragonfly*], [	LIBS="-lm $LIBS"
 		],
@@ -1119,6 +1123,7 @@
 	rb_cv_broken_glibc_ia64_erfc=no)])
 AS_CASE([$rb_cv_broken_glibc_ia64_erfc],[yes],[ac_cv_func_erf=no])
 
+AS_CASE(["$target_os"],[freebsd],[],[AC_REPLACE_FUNCS(close)])
 AC_REPLACE_FUNCS(dup2 memmove strerror\
 		 strchr strstr crypt flock\
 		 isnan finite isinf hypot acosh erf tgamma lgamma_r cbrt \
@@ -1140,7 +1145,7 @@
 	      setitimer setruid seteuid setreuid setresuid setproctitle socketpair\
 	      setrgid setegid setregid setresgid issetugid pause lchown lchmod\
 	      getpgrp setpgrp getpgid setpgid initgroups getgroups setgroups\
-	      getpriority getrlimit setrlimit sysconf \
+	      getpriority getrlimit setrlimit sysconf close\
 	      dlopen sigprocmask sigaction sigsetjmp _setjmp _longjmp\
 	      setsid telldir seekdir fchmod cosh sinh tanh log2 round\
 	      setuid setgid daemon select_large_fdset setenv unsetenv\
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28560)
+++ ChangeLog	(revision 28561)
@@ -1,3 +1,11 @@
+Wed Jul  7 10:26:20 2010  NARUSE, Yui  <naruse@r...>
+
+	* missing/close.c: ignore ECONNRESET.
+	  FreeBSD wrongly sets ECONNRESET on close(2) and
+	  it causes false-negative exceptions. [ruby-dev:41778]
+
+	* configure.in: ditto.
+
 Tue Jul  6 22:57:21 2010  Tanaka Akira  <akr@f...>
 
 	* io.c (nogvl_copy_stream_sendfile): jump to retry_sendfile directly
Index: missing/close.c
===================================================================
--- missing/close.c	(revision 0)
+++ missing/close.c	(revision 28561)
@@ -0,0 +1,55 @@
+/* Ignore ECONNRESET of FreeBSD */
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+int
+ruby_getpeername(int s, struct sockaddr * name,
+         socklen_t * namelen)
+{
+    errno = 0;
+    s = getpeername(s, name, namelen);
+    if (errno == ECONNRESET) {
+	errno = 0;
+	s = 0;
+    }
+    return s;
+}
+
+int
+ruby_getsockname(int s, struct sockaddr * name,
+         socklen_t * namelen)
+{
+    errno = 0;
+    s = getsockname(s, name, namelen);
+    if (errno == ECONNRESET) {
+	errno = 0;
+	s = 0;
+    }
+    return s;
+}
+
+int
+ruby_shutdown(int s, int how)
+{
+    errno = 0;
+    s = shutdown(s, how);
+    if (errno == ECONNRESET) {
+	errno = 0;
+	s = 0;
+    }
+    return s;
+}
+
+int
+ruby_close(int s)
+{
+    errno = 0;
+    s = close(s);
+    if (errno == ECONNRESET) {
+	errno = 0;
+	s = 0;
+    }
+    return s;
+}

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]