| 248 | static_assert(sizeof(linux_sockaddr) == sizeof(sockaddr)); |
| 249 | |
| 250 | int fstack_connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen, Timeout timeout) { |
| 251 | int err = 0; |
| 252 | while (true) { |
| 253 | int ret = ff_connect(sockfd, (linux_sockaddr*) addr, addrlen); |
| 254 | if (ret < 0) { |
| 255 | auto e = errno; |
| 256 | if (e == EINTR) { |
| 257 | err = 1; |
| 258 | continue; |
| 259 | } |
| 260 | if (e == EINPROGRESS || (e == EADDRINUSE && err == 1)) { |
| 261 | ret = g_engine->wait_for_fd_writable(sockfd, timeout); |
| 262 | if (ret < 0) return -1; |
| 263 | socklen_t n = sizeof(err); |
| 264 | ret = ff_getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &err, &n); |
| 265 | if (ret < 0) return -1; |
| 266 | if (err) { |
| 267 | errno = err; |
| 268 | return -1; |
| 269 | } |
| 270 | return 0; |
| 271 | } |
| 272 | } |
| 273 | return ret; |
| 274 | } |
| 275 | } |
| 276 | |
| 277 | int fstack_listen(int sockfd, int backlog) { |
| 278 | return ff_listen(sockfd, backlog); |
no test coverage detected