43 lines
1.1 KiB
C
43 lines
1.1 KiB
C
|
|
#include "Internal.h"
|
|
#include <netdb.h>
|
|
#include <string.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/types.h>
|
|
#include <assert.h>
|
|
|
|
int CgeNetAddrFromStr(const char *str, uint16_t port, CgeNetAddr *addr) {
|
|
struct addrinfo *result, *rp;
|
|
int code, found;
|
|
|
|
assert(str != NULL);
|
|
assert(addr != NULL);
|
|
|
|
code = getaddrinfo(str, NULL, NULL, &result);
|
|
if (code) {
|
|
return 0;
|
|
}
|
|
|
|
found = 0;
|
|
for (rp = result; rp != NULL; rp = rp->ai_next) {
|
|
if (rp->ai_family == AF_INET) {
|
|
struct sockaddr_in *sa4 = (struct sockaddr_in *)rp->ai_addr;
|
|
addr->ipv4.type = CGE_NET_IPV4;
|
|
memcpy(addr->ipv4.addr, &sa4->sin_addr, 4);
|
|
addr->ipv4.port = port;
|
|
found = 1;
|
|
break;
|
|
} else if (rp->ai_family == AF_INET6) {
|
|
struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)rp->ai_addr;
|
|
addr->ipv6.type = CGE_NET_IPV6;
|
|
memcpy(addr->ipv6.addr, &sa6->sin6_addr, 16);
|
|
addr->ipv6.port = port;
|
|
found = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
freeaddrinfo(result);
|
|
return found;
|
|
}
|