Upcoming nhrp code will use this, and it can be used to remove the sockunion2ip(X) macro.
Signed-off-by: Timo Teräs <timo.te...@iki.fi> --- lib/sockunion.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/sockunion.h | 5 +++++ 2 files changed, 61 insertions(+) diff --git a/lib/sockunion.c b/lib/sockunion.c index c7315f2..727730a 100644 --- a/lib/sockunion.c +++ b/lib/sockunion.c @@ -589,6 +589,62 @@ sockunion_hash (const union sockunion *su) return 0; } +size_t +family2addrsize(int family) +{ + switch (family) + { + case AF_INET: + return sizeof(struct in_addr); +#ifdef HAVE_IPV6 + case AF_INET6: + return sizeof(struct in6_addr); +#endif /* HAVE_IPV6 */ + } + return 0; +} + +size_t +sockunion_get_addrlen(const union sockunion *su) +{ + return family2addrsize(sockunion_family(su)); +} + +const u_char * +sockunion_get_addr(const union sockunion *su) +{ + switch (sockunion_family(su)) + { + case AF_INET: + return (const u_char *) &su->sin.sin_addr.s_addr; +#ifdef HAVE_IPV6 + case AF_INET6: + return (const u_char *) &su->sin6.sin6_addr; +#endif /* HAVE_IPV6 */ + } + return NULL; +} + +void +sockunion_set(union sockunion *su, int family, const u_char *addr, size_t bytes) +{ + if (family2addrsize(family) != bytes) + return; + + sockunion_family(su) = family; + switch (family) + { + case AF_INET: + memcpy(&su->sin.sin_addr.s_addr, addr, bytes); + break; +#ifdef HAVE_IPV6 + case AF_INET6: + memcpy(&su->sin6.sin6_addr, addr, bytes); + break; +#endif /* HAVE_IPV6 */ + } +} + /* After TCP connection is established. Get local address and port. */ union sockunion * sockunion_getsockname (int fd) diff --git a/lib/sockunion.h b/lib/sockunion.h index ea3b833..a6f964f 100644 --- a/lib/sockunion.h +++ b/lib/sockunion.h @@ -89,6 +89,11 @@ extern int sockunion_cmp (const union sockunion *, const union sockunion *); extern int sockunion_same (const union sockunion *, const union sockunion *); extern unsigned int sockunion_hash (const union sockunion *); +extern size_t family2addrsize(int family); +extern size_t sockunion_get_addrlen(const union sockunion *); +extern const u_char *sockunion_get_addr(const union sockunion *); +extern void sockunion_set(union sockunion *, int family, const u_char *addr, size_t bytes); + extern union sockunion *sockunion_str2su (const char *str); extern int sockunion_accept (int sock, union sockunion *); extern int sockunion_stream_socket (union sockunion *); -- 2.4.1 _______________________________________________ Quagga-dev mailing list Quagga-dev@lists.quagga.net https://lists.quagga.net/mailman/listinfo/quagga-dev