diff options
| -rw-r--r-- | src/sa.c | 36 | ||||
| -rw-r--r-- | src/sa.h | 1 |
2 files changed, 35 insertions, 2 deletions
@@ -371,8 +371,12 @@ sa_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2) { socklen_t offset, len; - assert(sa1 != NULL); - assert(sa2 != NULL); + if (sa == NULL && sa == NULL) + return 0; + if (sa1 == NULL && sa2 != NULL) + return -1; + if (sa1 != NULL && sa2 == NULL) + return 1; /* Treat AF_UNSPEC as the unspecified address. */ if ((sa1->sa_family == AF_UNSPEC || sa2->sa_family == AF_UNSPEC) && @@ -456,3 +460,31 @@ sa_in6_init(struct sockaddr *sa, const struct in6_addr *addr) sizeof(sin6->sin6_addr.s6_addr)); } #endif + +void +sa_cpy(struct sockaddr *src, const struct sockaddr *dst) +{ +#ifdef HAVE_SA_LEN + if (src->sa_len == 0) + memset(src, 0, sizeof(*src)); + else + memcpy(src, dst, src->sa_len); +#else + size_t sa_len; + + switch (dst->sa_family) { + case AF_INET: + sa_len = sizeof(struct sockaddr_in); + break; + case AF_INET6: + sa_len = sizeof(struct sockaddr_in6); + break; + default: + sa_len = 0; + } + if (sa_len == 0) + memset(src, 0, sizeof(*src)); + else + memcpy(src, dst, sa_len); +#endif +} @@ -64,5 +64,6 @@ const char *sa_addrtop(const struct sockaddr *, char *, socklen_t); int sa_cmp(const struct sockaddr *, const struct sockaddr *); void sa_in_init(struct sockaddr *, const struct in_addr *); void sa_in6_init(struct sockaddr *, const struct in6_addr *); +void sa_cpy(struct sockaddr *, const struct sockaddr *); #endif |
