From f8b32f7620efdb73055f7fd6af4c796a770050e2 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 15 Jan 2016 21:04:16 +0100 Subject: [PATCH] usock: add usock_inet, which returns the remote address Signed-off-by: Felix Fietkau --- usock.c | 19 ++++++++++++------- usock.h | 1 + 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/usock.c b/usock.c index 6748ef3..62a5f20 100644 --- a/usock.c +++ b/usock.c @@ -66,9 +66,11 @@ static int usock_connect(int type, struct sockaddr *sa, int sa_len, int family, return -1; } -static int usock_unix(int type, const char *host, int socktype, bool server) +static int usock_unix(int type, const char *host) { struct sockaddr_un sun = {.sun_family = AF_UNIX}; + bool server = !!(type & USOCK_SERVER); + int socktype = ((type & 0xff) == USOCK_TCP) ? SOCK_STREAM : SOCK_DGRAM; if (strlen(host) >= sizeof(sun.sun_path)) { errno = EINVAL; @@ -79,8 +81,10 @@ static int usock_unix(int type, const char *host, int socktype, bool server) return usock_connect(type, (struct sockaddr*)&sun, sizeof(sun), AF_UNIX, socktype, server); } -static int usock_inet(int type, const char *host, const char *service, int socktype, bool server) +int usock_inet(int type, const char *host, const char *service, void *addr) { + int socktype = ((type & 0xff) == USOCK_TCP) ? SOCK_STREAM : SOCK_DGRAM; + bool server = !!(type & USOCK_SERVER); struct addrinfo *result, *rp; struct addrinfo hints = { .ai_family = (type & USOCK_IPV6ONLY) ? AF_INET6 : @@ -97,8 +101,11 @@ static int usock_inet(int type, const char *host, const char *service, int sockt for (rp = result; rp != NULL; rp = rp->ai_next) { sock = usock_connect(type, rp->ai_addr, rp->ai_addrlen, rp->ai_family, socktype, server); - if (sock >= 0) + if (sock >= 0) { + if (addr) + memcpy(addr, rp->ai_addr, rp->ai_addrlen); break; + } } freeaddrinfo(result); @@ -118,14 +125,12 @@ const char *usock_port(int port) } int usock(int type, const char *host, const char *service) { - int socktype = ((type & 0xff) == USOCK_TCP) ? SOCK_STREAM : SOCK_DGRAM; - bool server = !!(type & USOCK_SERVER); int sock; if (type & USOCK_UNIX) - sock = usock_unix(type, host, socktype, server); + sock = usock_unix(type, host); else - sock = usock_inet(type, host, service, socktype, server); + sock = usock_inet(type, host, service, NULL); if (sock < 0) return -1; diff --git a/usock.h b/usock.h index b0b952b..2ead7e5 100644 --- a/usock.h +++ b/usock.h @@ -32,6 +32,7 @@ const char *usock_port(int port); int usock(int type, const char *host, const char *service); +int usock_inet(int type, const char *host, const char *service, void *addr); /** * Wait for a socket to become ready.