From e1596bbf27ee636d8ab47e39eda21c64ef49b671 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 27 Apr 2010 10:34:15 +0200 Subject: lib/tsocket: add tsocket_address_is_inet() function metze --- lib/tsocket/tsocket.h | 17 +++++++++++++++++ lib/tsocket/tsocket_bsd.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) (limited to 'lib/tsocket') diff --git a/lib/tsocket/tsocket.h b/lib/tsocket/tsocket.h index d983325c45..a008fd8232 100644 --- a/lib/tsocket/tsocket.h +++ b/lib/tsocket/tsocket.h @@ -101,6 +101,7 @@ struct iovec; * * @return The address as a string representation, NULL on error. * + * @see tsocket_address_is_inet() * @see tsocket_address_inet_addr_string() * @see tsocket_address_inet_port() */ @@ -486,6 +487,20 @@ int tstream_disconnect_recv(struct tevent_req *req, * @{ */ +/** + * @brief Find out if the tsocket_address represents an ipv4 or ipv6 endpoint. + * + * @param[in] addr The tsocket_address pointer + * + * @param[in] fam The family can be can be "ipv4", "ipv6" or "ip". With + * "ip" is autodetects "ipv4" or "ipv6" based on the + * addr. + * + * @return true if addr represents an address of the given family, + * otherwise false. + */ +bool tsocket_address_is_inet(const struct tsocket_address *addr, const char *fam); + #if DOXYGEN /** * @brief Create a tsocket_address for ipv4 and ipv6 endpoint addresses. @@ -533,6 +548,8 @@ int _tsocket_address_inet_from_strings(TALLOC_CTX *mem_ctx, * * @return A newly allocated string of the address, NULL on error * with errno set. + * + * @see tsocket_address_is_inet() */ char *tsocket_address_inet_addr_string(const struct tsocket_address *addr, TALLOC_CTX *mem_ctx); diff --git a/lib/tsocket/tsocket_bsd.c b/lib/tsocket/tsocket_bsd.c index 43defb30c8..5adf9214c8 100644 --- a/lib/tsocket/tsocket_bsd.c +++ b/lib/tsocket/tsocket_bsd.c @@ -294,6 +294,43 @@ ssize_t tsocket_address_bsd_sockaddr(const struct tsocket_address *addr, return sa_socklen; } +bool tsocket_address_is_inet(const struct tsocket_address *addr, const char *fam) +{ + struct tsocket_address_bsd *bsda = talloc_get_type(addr->private_data, + struct tsocket_address_bsd); + + if (!bsda) { + return false; + } + + switch (bsda->u.sa.sa_family) { + case AF_INET: + if (strcasecmp(fam, "ip") == 0) { + return true; + } + + if (strcasecmp(fam, "ipv4") == 0) { + return true; + } + + return false; +#ifdef HAVE_IPV6 + case AF_INET6: + if (strcasecmp(fam, "ip") == 0) { + return true; + } + + if (strcasecmp(fam, "ipv6") == 0) { + return true; + } + + return false; +#endif + } + + return false; +} + int _tsocket_address_inet_from_strings(TALLOC_CTX *mem_ctx, const char *fam, const char *addr, -- cgit