summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2015-05-22 13:40:59 +0300
committerDaniel Walton <dwalton@cumulusnetworks.com>2016-05-26 15:33:30 +0000
commit95e0999cc57a72d9da8f79c2cb12968ea9042dfa (patch)
treeba530a012568e5e3d74e4c53b65fdf1261844ed3
parentcf279b3abcdaf1bbee65d622f17229b8a0cd32d5 (diff)
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 <timo.teras@iki.fi> Signed-off-by: David Lamparter <equinox@opensourcerouting.org> (cherry picked from commit 483abc037b0ac4b3ed168c4810bb14ea338fa80c)
-rw-r--r--lib/sockunion.c56
-rw-r--r--lib/sockunion.h5
2 files changed, 61 insertions, 0 deletions
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 *);