diff options
| author | Renato Westphal <renato@opensourcerouting.org> | 2016-03-01 15:31:28 -0300 |
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2016-09-23 09:31:09 -0400 |
| commit | eac6e3f027356c25a8c8fddf921f769b79945fcc (patch) | |
| tree | 69d5a17fb3f95934bafa22f8a3aee28c92780d62 /ldpd/util.c | |
| parent | e30090a678e45aee2755c492212c5a478b9dcfcc (diff) | |
ldpd: adapt the code for Quagga
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Diffstat (limited to 'ldpd/util.c')
| -rw-r--r-- | ldpd/util.c | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/ldpd/util.c b/ldpd/util.c index 981a5c8c21..e735263f5f 100644 --- a/ldpd/util.c +++ b/ldpd/util.c @@ -19,8 +19,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include <sys/types.h> -#include <string.h> +#include <zebra.h> #include "ldpd.h" #include "log.h" @@ -44,7 +43,7 @@ mask2prefixlen6(struct sockaddr_in6 *sa_in6) * the possibly truncated sin6_addr struct. */ ap = (uint8_t *)&sa_in6->sin6_addr; - ep = (uint8_t *)sa_in6 + sa_in6->sin6_len; + ep = (uint8_t *)sa_in6 + sockaddr_len((struct sockaddr *)sa_in6); for (; ap < ep; ap++) { /* this "beauty" is adopted from sbin/route/show.c ... */ switch (*ap) { @@ -317,13 +316,17 @@ addr2sa(int af, union ldpd_addr *addr, uint16_t port) switch (af) { case AF_INET: sa_in->sin_family = AF_INET; +#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN sa_in->sin_len = sizeof(struct sockaddr_in); +#endif sa_in->sin_addr = addr->v4; sa_in->sin_port = htons(port); break; case AF_INET6: sa_in6->sin6_family = AF_INET6; +#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN sa_in6->sin6_len = sizeof(struct sockaddr_in6); +#endif sa_in6->sin6_addr = addr->v6; sa_in6->sin6_port = htons(port); break; @@ -335,22 +338,48 @@ addr2sa(int af, union ldpd_addr *addr, uint16_t port) } void -sa2addr(struct sockaddr *sa, int *af, union ldpd_addr *addr) +sa2addr(struct sockaddr *sa, int *af, union ldpd_addr *addr, in_port_t *port) { struct sockaddr_in *sa_in = (struct sockaddr_in *)sa; struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6 *)sa; - memset(addr, 0, sizeof(*addr)); + if (addr) + memset(addr, 0, sizeof(*addr)); switch (sa->sa_family) { case AF_INET: - *af = AF_INET; - addr->v4 = sa_in->sin_addr; + if (af) + *af = AF_INET; + if (addr) + addr->v4 = sa_in->sin_addr; + if (port) + *port = sa_in->sin_port; break; case AF_INET6: - *af = AF_INET6; - addr->v6 = sa_in6->sin6_addr; + if (af) + *af = AF_INET6; + if (addr) + addr->v6 = sa_in6->sin6_addr; + if (port) + *port = sa_in6->sin6_port; break; default: fatalx("sa2addr: unknown af"); } } + +socklen_t +sockaddr_len(struct sockaddr *sa) +{ +#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN + return (sa->sa_len); +#else + switch (sa->sa_family) { + case AF_INET: + return (sizeof(struct sockaddr_in)); + case AF_INET6: + return (sizeof(struct sockaddr_in6)); + default: + fatalx("sockaddr_len: unknown af"); + } +#endif +} |
