From 95e0999cc57a72d9da8f79c2cb12968ea9042dfa Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timo=20Ter=C3=A4s?= Date: Fri, 22 May 2015 13:40:59 +0300 Subject: [PATCH] sockunion: add accessors for sockunion address MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Upcoming nhrp code will use this, and it can be used to remove the sockunion2ip(X) macro. Signed-off-by: Timo Teräs Signed-off-by: David Lamparter (cherry picked from commit 483abc037b0ac4b3ed168c4810bb14ea338fa80c) --- lib/sockunion.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/sockunion.h | 5 +++++ 2 files changed, 61 insertions(+) diff --git a/lib/sockunion.c b/lib/sockunion.c index 2dbe34c21a..fdff61f542 100644 --- a/lib/sockunion.c +++ b/lib/sockunion.c @@ -623,6 +623,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 f041f95a10..c674cb8bb8 100644 --- a/lib/sockunion.h +++ b/lib/sockunion.h @@ -74,6 +74,11 @@ extern int sockunion_cmp (union sockunion *, 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.39.5