From: Timo Teräs Date: Fri, 22 May 2015 10:40:59 +0000 (+0300) Subject: sockunion: add accessors for sockunion address X-Git-Tag: frr-2.0-rc1~734 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=95e0999cc57a72d9da8f79c2cb12968ea9042dfa;p=matthieu%2Ffrr.git sockunion: add accessors for sockunion address 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) --- 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 *);