Ruby  2.0.0p247(2013-06-27revision41674)
missing/close.c
Go to the documentation of this file.
00001 /* Ignore ECONNRESET of FreeBSD */
00002 #include "ruby/missing.h"
00003 #include <errno.h>
00004 #include <unistd.h>
00005 #include <sys/types.h>
00006 #include <sys/socket.h>
00007 
00008 #undef getpeername
00009 int
00010 ruby_getpeername(int s, struct sockaddr * name,
00011          socklen_t * namelen)
00012 {
00013     int err = errno;
00014     errno = 0;
00015     s = getpeername(s, name, namelen);
00016     if (errno == ECONNRESET) {
00017         errno = 0;
00018         s = 0;
00019     }
00020     else if (errno == 0)
00021         errno = err;
00022     return s;
00023 }
00024 
00025 #undef getsockname
00026 int
00027 ruby_getsockname(int s, struct sockaddr * name,
00028          socklen_t * namelen)
00029 {
00030     int err = errno;
00031     errno = 0;
00032     s = getsockname(s, name, namelen);
00033     if (errno == ECONNRESET) {
00034         errno = 0;
00035         s = 0;
00036     }
00037     else if (errno == 0)
00038         errno = err;
00039     return s;
00040 }
00041 
00042 #undef shutdown
00043 int
00044 ruby_shutdown(int s, int how)
00045 {
00046     int err = errno;
00047     errno = 0;
00048     s = shutdown(s, how);
00049     if (errno == ECONNRESET) {
00050         errno = 0;
00051         s = 0;
00052     }
00053     else if (errno == 0)
00054         errno = err;
00055     return s;
00056 }
00057 
00058 #undef close
00059 int
00060 ruby_close(int s)
00061 {
00062     int err = errno;
00063     errno = 0;
00064     s = close(s);
00065     if (errno == ECONNRESET) {
00066         errno = 0;
00067         s = 0;
00068     }
00069     else if (errno == 0)
00070         errno = err;
00071     return s;
00072 }
00073