00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00027 #include "ReadWritePolicy.hh"
00028
00029
00030
00031 #include <sys/types.h>
00032 #include <sys/socket.h>
00033 #include <unistd.h>
00034 #include <errno.h>
00035
00036
00037
00038 #define prefix_
00039
00040
00041 prefix_ unsigned senf::ReadablePolicy::read(FileHandle & handle, char * buffer,
00042 unsigned size)
00043 {
00044 int rv = -1;
00045 do {
00046 rv = ::read(handle.fd(), buffer, size);
00047 if (rv < 0)
00048 switch(errno) {
00049 case EINTR:
00050 break;
00051 case EAGAIN:
00052
00053 rv = 0;
00054 break;
00055 default:
00056 SENF_THROW_SYSTEM_EXCEPTION("");
00057 }
00058 } while (rv<0);
00059 return rv;
00060 }
00061
00062 prefix_ unsigned senf::ReadablePolicy::do_readfrom(FileHandle & handle, char * buffer,
00063 unsigned size,
00064 struct ::sockaddr * addr, socklen_t * len)
00065 {
00066 int rv = -1;
00067 do {
00068 rv = ::recvfrom(handle.fd(),buffer, size, 0, addr, len);
00069 if (rv < 0)
00070 switch (errno) {
00071 case EINTR:
00072 break;
00073 case EAGAIN:
00074 rv = 0;
00075 break;
00076 default:
00077 SENF_THROW_SYSTEM_EXCEPTION("");
00078 }
00079 } while (rv<0);
00080 return rv;
00081 }
00082
00083 prefix_ unsigned senf::WriteablePolicy::do_write(FileHandle & handle, char const * buffer,
00084 unsigned size)
00085 {
00086 int rv = -1;
00087 do {
00088 rv = ::write(handle.fd(), buffer, size);
00089 if (rv < 0)
00090 switch (errno) {
00091 case EINTR:
00092 break;
00093 case EAGAIN:
00094 case ENOBUFS:
00095
00096
00097 case ECONNREFUSED:
00098
00099
00100
00101
00102
00103 rv = 0;
00104 break;
00105 default:
00106 SENF_THROW_SYSTEM_EXCEPTION("");
00107 }
00108 } while (rv<0);
00109 return rv;
00110 }
00111
00112 prefix_ unsigned senf::WriteablePolicy::do_writeto(FileHandle & handle,
00113 char const * buffer, unsigned size,
00114 struct sockaddr const * addr, socklen_t len)
00115 {
00116 int rv = -1;
00117 do {
00118 rv = ::sendto(handle.fd(), buffer, size, 0, addr, len);
00119 if (rv < 0)
00120 switch (errno) {
00121 case EINTR:
00122 break;
00123 case EAGAIN:
00124 case ENOBUFS:
00125
00126
00127 rv = 0;
00128 break;
00129 default:
00130 SENF_THROW_SYSTEM_EXCEPTION("");
00131 }
00132 } while (rv<0);
00133 return rv;
00134 }
00135
00136
00137 #undef prefix_
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149