Mercurial > hg > dhcpcd
changeset 4307:adaa774e40e6 draft ia
Add sa_cpy. While here allow NULL in sa_cmp.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Mon, 27 Aug 2018 19:10:18 +0100 |
| parents | 3bfea819f902 |
| children | |
| files | src/sa.c src/sa.h |
| diffstat | 2 files changed, 35 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/sa.c Mon Aug 20 11:37:17 2018 +0100 +++ b/src/sa.c Mon Aug 27 19:10:18 2018 +0100 @@ -371,8 +371,12 @@ { 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 @@ 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 +}
--- a/src/sa.h Mon Aug 20 11:37:17 2018 +0100 +++ b/src/sa.h Mon Aug 27 19:10:18 2018 +0100 @@ -64,5 +64,6 @@ 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
