X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fnetutils.c;fp=src%2Flib%2Fnetutils.c;h=5399fb07f56520e7b3001176770666b60526ca36;hb=ba0970e1c7736ca136e7bf070f6ee1270af891a0;hp=13ebce926da9b55a34a0202a076f62b82495e49f;hpb=427cd9fb5c59495ac493ab1c5bc118a08fc70ef1;p=deb_shairplay.git diff --git a/src/lib/netutils.c b/src/lib/netutils.c index 13ebce9..5399fb0 100644 --- a/src/lib/netutils.c +++ b/src/lib/netutils.c @@ -151,3 +151,39 @@ netutils_get_address(void *sockaddr, int *length) return NULL; } +int +netutils_parse_address(int family, const char *src, void *dst, int dstlen) +{ + struct addrinfo *result; + struct addrinfo *ptr; + struct addrinfo hints; + int length; + int ret; + + if (family != AF_INET && family != AF_INET6) { + return -1; + } + if (!src || !dst) { + return -1; + } + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = family; + hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST; + + ret = getaddrinfo(src, NULL, &hints, &result); + if (ret != 0) { + return -1; + } + + length = -1; + for (ptr=result; ptr!=NULL; ptr=ptr->ai_next) { + if (family == ptr->ai_family && dstlen >= ptr->ai_addrlen) { + memcpy(dst, ptr->ai_addr, ptr->ai_addrlen); + length = ptr->ai_addrlen; + break; + } + } + freeaddrinfo(result); + return length; +}