81
73
if (shutdown(sd, SHUT_RDWR))
92
82
size_t Vio::read(unsigned char* buf, size_t size)
96
/* Ensure nobody uses vio_read_buff and vio_read simultaneously */
97
assert(read_end == read_pos);
98
r= ::read(sd, buf, size);
84
return ::read(sd, buf, size);
103
87
size_t Vio::write(const unsigned char* buf, size_t size)
107
r = ::write(sd, buf, size);
89
return ::write(sd, buf, size);
112
92
int Vio::blocking(bool set_blocking_mode, bool *old_mode)
140
120
int Vio::fastsend()
145
error= setsockopt(sd, IPPROTO_TCP, TCP_NODELAY,
146
&nodelay, sizeof(nodelay));
123
int error= setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(nodelay));
149
125
perror("setsockopt");
155
129
int32_t Vio::keepalive(bool set_keep_alive)
163
r= setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, sizeof(opt));
131
uint32_t opt= set_keep_alive;
132
int r= setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, sizeof(opt));
166
135
perror("setsockopt");
173
141
bool Vio::should_retry() const
176
return (en == EAGAIN || en == EINTR ||
144
return en == EAGAIN || en == EINTR || en == EWOULDBLOCK;
180
147
bool Vio::was_interrupted() const
183
return (en == EAGAIN || en == EINTR ||
184
en == EWOULDBLOCK || en == ETIMEDOUT);
150
return en == EAGAIN || en == EINTR || en == EWOULDBLOCK || en == ETIMEDOUT;
187
153
bool Vio::peer_addr(char *buf, uint16_t *port, size_t buflen) const
190
155
char port_buf[NI_MAXSERV];
156
sockaddr_storage remote;
191
157
socklen_t al = sizeof(remote);
193
if (getpeername(sd, (struct sockaddr *) (&remote),
159
if (getpeername(sd, (sockaddr *) (&remote), &al) != 0)
199
if ((error= getnameinfo((struct sockaddr *)(&remote),
202
port_buf, NI_MAXSERV, NI_NUMERICHOST|NI_NUMERICSERV)))
162
if (getnameinfo((struct sockaddr *)(&remote), al, buf, buflen, port_buf, NI_MAXSERV, NI_NUMERICHOST|NI_NUMERICSERV))
212
172
void Vio::timeout(bool is_sndtimeo, int32_t t)
216
/* POSIX specifies time as struct timeval. */
217
struct timeval wait_timeout;
174
timeval wait_timeout;
218
175
wait_timeout.tv_sec= t;
219
176
wait_timeout.tv_usec= 0;
221
178
assert(t >= 0 && t <= INT32_MAX);
222
179
assert(sd != -1);
223
error= setsockopt(sd, SOL_SOCKET, is_sndtimeo ? SO_SNDTIMEO : SO_RCVTIMEO,
180
int error= setsockopt(sd, SOL_SOCKET, is_sndtimeo ? SO_SNDTIMEO : SO_RCVTIMEO, &wait_timeout,
225
181
(socklen_t)sizeof(struct timeval));
226
182
if (error == -1 && errno != ENOPROTOOPT)