00001
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