aboutsummaryrefslogtreecommitdiff
path: root/src/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/socket.c')
-rw-r--r--src/socket.c29
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])
{