We sure seem to have allot of different ways to get the address size for whatever family we are using. I haven't done a complete in depth examination of the code but it sure seems like something that we could standardize on.
donald On Fri, May 22, 2015 at 3:40 AM, Timo Teräs <[email protected]> wrote: > Upcoming nhrp code will use this, and it can be used to remove > the sockunion2ip(X) macro. > > Signed-off-by: Timo Teräs <[email protected]> > --- > 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 > [email protected] > https://lists.quagga.net/mailman/listinfo/quagga-dev >
_______________________________________________ Quagga-dev mailing list [email protected] https://lists.quagga.net/mailman/listinfo/quagga-dev
