| 154 | #endif /* HAS_POLL */ |
| 155 | |
| 156 | int sane_socketpair(int domain, int type, int protocol, socket_t result[2]) |
| 157 | { |
| 158 | socket_t listener = inet_listen("127.0.0.1", 0, 10), client; |
| 159 | struct sockaddr_in addr; |
| 160 | struct sockaddr *sa = (struct sockaddr*) &addr; |
| 161 | socklen_t len = sizeof(addr); |
| 162 | |
| 163 | if (listener == INVALID_SOCKET) { |
| 164 | return -1; |
| 165 | } |
| 166 | |
| 167 | result[0] = INVALID_SOCKET; |
| 168 | result[1] = INVALID_SOCKET; |
| 169 | |
| 170 | if (listener == INVALID_SOCKET) { |
| 171 | msg_error("%s(%d), %s: listen error %s", |
| 172 | __FILE__, __LINE__, __FUNCTION__, last_serror()); |
| 173 | return -1; |
| 174 | } |
| 175 | |
| 176 | tcp_nodelay(listener, 1); |
| 177 | if (getsockname(listener, sa, &len) < 0) { |
| 178 | msg_error("%s(%d), %s: getoskname error %s", |
| 179 | __FILE__, __LINE__, __FUNCTION__, last_serror()); |
| 180 | CLOSE_SOCKET(listener); |
| 181 | return -1; |
| 182 | } |
| 183 | |
| 184 | client = socket(AF_INET, SOCK_STREAM, 0); |
| 185 | if (client == INVALID_SOCKET) { |
| 186 | msg_error("%s(%d), %s: create socket %s error %s", |
| 187 | __FILE__, __LINE__, __FUNCTION__, addr, last_serror()); |
| 188 | CLOSE_SOCKET(listener); |
| 189 | return -1; |
| 190 | } |
| 191 | |
| 192 | non_blocking(client, NON_BLOCKING); |
| 193 | |
| 194 | if (!var_hook_sys_api) { |
| 195 | if (connect(client, sa, len) == -1) { |
| 196 | int err = acl_fiber_last_error(); |
| 197 | if (err != FIBER_EINPROGRESS && !error_again(err)) { |
| 198 | msg_error("%s(%d), %s: connect error %s", |
| 199 | __FILE__, __LINE__, __FUNCTION__, last_serror()); |
| 200 | CLOSE_SOCKET(listener); |
| 201 | CLOSE_SOCKET(client); |
| 202 | return -1; |
| 203 | } |
| 204 | } |
| 205 | } else if ((*sys_connect)(client, sa, len) == -1) { |
| 206 | int err = acl_fiber_last_error(); |
| 207 | if (err != FIBER_EINPROGRESS && !error_again(err)) { |
| 208 | msg_error("%s(%d), %s: connect error %s", |
| 209 | __FILE__, __LINE__, __FUNCTION__, last_serror()); |
| 210 | CLOSE_SOCKET(listener); |
| 211 | CLOSE_SOCKET(client); |
| 212 | return -1; |
| 213 | } |
no test coverage detected
searching dependent graphs…