diff options
Diffstat (limited to 'src/socket.c')
-rw-r--r-- | src/socket.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/socket.c b/src/socket.c index 4fe5e3a..b666eb1 100644 --- a/src/socket.c +++ b/src/socket.c @@ -92,6 +92,35 @@ int socket_accept_in(const psocket *psock, psocket *client_psock) return 0; } +int socket_connect_in(psocket *psock, struct addrinfo *results) +{ + int fd = -1, rv, reuse_enable = 1; + struct addrinfo *rp = NULL; + + assert(psock && results); + + for (rp = results; rp != NULL; rp = rp->ai_next) { + fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if (fd < 0) + continue; + rv = connect(fd, rp->ai_addr, rp->ai_addrlen); + if (!rv) + break; + close(fd); + } + + if (!rp) + return -1; + + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse_enable, sizeof(int)) < 0) + return -2; + psock->fd = fd; + psock->addr_len = rp->ai_addrlen; + psock->addr = *rp->ai_addr; + freeaddrinfo(results); + return socket_nonblock(psock); +} + int socket_addrtostr_in(const psocket *psock, char hbuf[NI_MAXHOST], char sbuf[NI_MAXSERV]) { |