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/