tests: investigating catch2
[m6w6/libmemcached] / testing / lib / WaitForConn.cpp
1 #include "WaitForConn.hpp"
2
3 #include <cerrno>
4 #include <cstdio>
5 #include <sys/socket.h>
6 #include <unistd.h>
7
8 bool WaitForConn::connect(const conn_t &conn) {
9 int sock;
10 unsigned size;
11 sockaddr_storage addr;
12
13 tie(sock, addr, size) = conn;
14
15 connect_again:
16 if (0 == ::connect(sock, reinterpret_cast<sockaddr *>(&addr), size)) {
17 close(sock);
18 return true;
19 }
20
21 switch (errno) {
22 case EINTR:
23 goto connect_again;
24 case EAGAIN:
25 case EALREADY:
26 case EINPROGRESS:
27 case EISCONN:
28 case ETIMEDOUT:
29 break;
30 default:
31 perror("WaitForConn::connect connect()");
32 close(sock);
33 return false;
34 }
35
36 return true;
37 }
38
39 bool WaitForConn::operator () () {
40 vector<int> fds;
41
42 fds.reserve(conns.size());
43 for (const auto &conn : conns) {
44 if (!connect(conn)) {
45 return false;
46 }
47 fds.push_back(get<0>(conn));
48 }
49
50 return poll(fds);
51 }