25 #include <drizzled/util/test.h>
26 #include <sys/socket.h>
28 #include <sys/types.h>
29 #include <netinet/tcp.h>
30 #include <netinet/in.h>
43 namespace drizzle_plugin {
58 fcntl(sd, F_SETFL, 0);
59 fcntl_mode= fcntl(sd, F_GETFL);
73 if (shutdown(sd, SHUT_RDWR))
84 return ::read(sd, buf, size);
89 return ::write(sd, buf, size);
98 *old_mode= drizzled::test(!(fcntl_mode & O_NONBLOCK));
102 int old_fcntl=fcntl_mode;
103 if (set_blocking_mode)
104 fcntl_mode &= ~O_NONBLOCK;
106 fcntl_mode |= O_NONBLOCK;
107 if (old_fcntl != fcntl_mode)
109 r= fcntl(sd, F_SETFL, fcntl_mode);
112 fcntl_mode= old_fcntl;
123 int error= setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, &nodelay,
sizeof(nodelay));
125 perror(
"setsockopt");
131 uint32_t opt= set_keep_alive;
132 int r= setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (
char *) &opt,
sizeof(opt));
135 perror(
"setsockopt");
144 return en == EAGAIN || en == EINTR || en == EWOULDBLOCK;
150 return en == EAGAIN || en == EINTR || en == EWOULDBLOCK || en == ETIMEDOUT;
155 char port_buf[NI_MAXSERV];
156 sockaddr_storage remote;
157 socklen_t al =
sizeof(remote);
159 if (getpeername(sd, (sockaddr *) (&remote), &al) != 0)
162 if (getnameinfo((
struct sockaddr *)(&remote), al, buf, buflen, port_buf, NI_MAXSERV, NI_NUMERICHOST|NI_NUMERICSERV))
167 port= (uint16_t)strtol(port_buf, (
char **)NULL, 10);
174 timeval wait_timeout;
175 wait_timeout.tv_sec= t;
176 wait_timeout.tv_usec= 0;
178 assert(t >= 0 && t <= INT32_MAX);
180 int error= setsockopt(sd, SOL_SOCKET, is_sndtimeo ? SO_SNDTIMEO : SO_RCVTIMEO, &wait_timeout,
181 (socklen_t)
sizeof(
struct timeval));
182 if (error == -1 && errno != ENOPROTOOPT)
184 perror(
"setsockopt");