X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fnetutl.c;h=39cd79074e889af0eaff7c9951baf528e0ae0308;hp=ca30ec49c7157e8b4c4a93349d452b11179f0536;hb=5a132550deb58473285e5f91705d286aef47be71;hpb=f02d3ed3e135b5326003e7f69f8331ff6a3cc219 diff --git a/src/netutl.c b/src/netutl.c index ca30ec49..39cd7907 100644 --- a/src/netutl.c +++ b/src/netutl.c @@ -96,7 +96,7 @@ void sockaddr2str(const sockaddr_t *sa, char **addrstr, char **portstr) { return; } - err = getnameinfo(&sa->sa, SALEN(sa->sa), address, sizeof(address), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); + err = getnameinfo(&sa->sa, SALEN(sa->sa), address, sizeof address, port, sizeof port, NI_NUMERICHOST | NI_NUMERICSERV); if(err) { logger(LOG_ERR, _("Error while translating addresses: %s"), @@ -128,7 +128,7 @@ char *sockaddr2hostname(const sockaddr_t *sa) { return str; } - err = getnameinfo(&sa->sa, SALEN(sa->sa), address, sizeof(address), port, sizeof(port), + err = getnameinfo(&sa->sa, SALEN(sa->sa), address, sizeof address, port, sizeof port, hostnames ? 0 : (NI_NUMERICHOST | NI_NUMERICSERV)); if(err) { logger(LOG_ERR, _("Error while looking up hostname: %s"), @@ -140,7 +140,41 @@ char *sockaddr2hostname(const sockaddr_t *sa) { return str; } -int sockaddrcmp(const sockaddr_t *a, const sockaddr_t *b) { +int sockaddrcmp_noport(const sockaddr_t *a, const sockaddr_t *b) +{ + int result; + + cp(); + + result = a->sa.sa_family - b->sa.sa_family; + + if(result) + return result; + + switch (a->sa.sa_family) { + case AF_UNSPEC: + return 0; + + case AF_UNKNOWN: + return strcmp(a->unknown.address, b->unknown.address); + + case AF_INET: + return memcmp(&a->in.sin_addr, &b->in.sin_addr, sizeof(a->in.sin_addr)); + + case AF_INET6: + return memcmp(&a->in6.sin6_addr, &b->in6.sin6_addr, sizeof(a->in6.sin6_addr)); + + default: + logger(LOG_ERR, _("sockaddrcmp() was called with unknown address family %d, exitting!"), + a->sa.sa_family); + cp_trace(); + raise(SIGFPE); + exit(0); + } +} + +int sockaddrcmp(const sockaddr_t *a, const sockaddr_t *b) +{ int result; cp(); @@ -163,20 +197,20 @@ int sockaddrcmp(const sockaddr_t *a, const sockaddr_t *b) { return strcmp(a->unknown.port, b->unknown.port); case AF_INET: - result = memcmp(&a->in.sin_addr, &b->in.sin_addr, sizeof(a->in.sin_addr)); + result = memcmp(&a->in.sin_addr, &b->in.sin_addr, sizeof a->in.sin_addr); if(result) return result; - return memcmp(&a->in.sin_port, &b->in.sin_port, sizeof(a->in.sin_port)); + return memcmp(&a->in.sin_port, &b->in.sin_port, sizeof a->in.sin_port); case AF_INET6: - result = memcmp(&a->in6.sin6_addr, &b->in6.sin6_addr, sizeof(a->in6.sin6_addr)); + result = memcmp(&a->in6.sin6_addr, &b->in6.sin6_addr, sizeof a->in6.sin6_addr); if(result) return result; - return memcmp(&a->in6.sin6_port, &b->in6.sin6_port, sizeof(a->in6.sin6_port)); + return memcmp(&a->in6.sin6_port, &b->in6.sin6_port, sizeof a->in6.sin6_port); default: logger(LOG_ERR, _("sockaddrcmp() was called with unknown address family %d, exitting!"),