This patch allows interface names in addition to IPv4 and IPv6 addresses in the slp_interfaces list. Interfaces still have to have a valid address to be used, but the address doesn't have to be known when writing the config file.
Signed-Off-By: David L Stevens <dlstev...@us.ibm.com> diff --git a/common/slp_iface.c b/common/slp_iface.c index e1423a3..8eb471b 100644 --- a/common/slp_iface.c +++ b/common/slp_iface.c @@ -690,6 +690,50 @@ static int SLPD_Get_Iface_From_Ip(char *ip, char *iface) { return 0; } +/** Get an IP address for an interface + * + * Fills in sockaddr with a valid address on the given interface and returns + * the length of the socket address + * + * @param[in] ifaddrs0 - pointer to ifaddrlist, or NULL + * @param[in] ifname - Pointer to interface name + * @param[in] family - A hint indicating the address family to get info + * for - can be AF_INET, AF_INET6, or AF_UNSPEC for both. + * @param[out] sa - sockaddr containing an address on interface "ifname" + * + * @return Zero on failure, sizeof(sockaddr_in) for AF_INET, + * sizeof(sockaddr_in6) for AF_INET6 + */ +static int ifname_to_addr(struct ifaddrs *ifaddrs0, char *ifname, int family, + struct sockaddr *sa) +{ + int salen = 0; + struct ifaddrs *ifaddrs, *ifa; + + ifaddrs = ifaddrs0; + + if (ifaddrs == NULL && getifaddrs(&ifaddrs) < 0) + return 0; + for (ifa = ifaddrs; ifa; ifa = ifa->ifa_next) + { + if (strcmp(ifa->ifa_name, ifname) != 0) + continue; + if (family != AF_UNSPEC && ifa->ifa_addr->sa_family != family) + continue; + switch (ifa->ifa_addr->sa_family) { + case AF_INET: salen = sizeof(struct sockaddr_in); break; + case AF_INET6: salen = sizeof(struct sockaddr_in6); break; + default: + continue; + } + memcpy(sa, ifa->ifa_addr, salen); + break; + } + if (!ifaddrs0) + freeifaddrs(ifaddrs); + return salen; +} + /** Get the network interface addresses for this host. * * Returns either a complete list or a subset of the list of network interface @@ -739,8 +783,12 @@ int SLPIfaceGetInfo(const char * useifaces, SLPIfaceInfo * ifaceinfo, { char *token, *saveptr; char interface[MAX_IFACE_LEN]; + struct ifaddrs *ifaddrs; int ret = 0; + if (getifaddrs(&ifaddrs) < 0) + ifaddrs = NULL; + for (token = strtok_r(p, ",", &saveptr); token; token = strtok_r(NULL, ",", &saveptr)) { @@ -793,7 +841,20 @@ int SLPIfaceGetInfo(const char * useifaces, SLPIfaceInfo * ifaceinfo, else sts = (errno = EINVAL), -1; /* not v4, not v6 */ } + else if (if_nametoindex(token)) + { + struct sockaddr_storage ss; + int salen; + + salen = ifname_to_addr(ifaddrs, token, family, + (struct sockaddr *)&ss); + if (salen > 0) + memcpy(&ifaceinfo->iface_addr[ifaceinfo->iface_count++], + &ss, salen); + } } + if (ifaddrs) + freeifaddrs(ifaddrs); } xfree(p); } ------------------------------------------------------------------------------ Monitor your physical, virtual and cloud infrastructure from a single web console. Get in-depth insight into apps, servers, databases, vmware, SAP, cloud infrastructure, etc. Download 30-day Free Trial. Pricing starts from $795 for 25 servers or applications! http://p.sf.net/sfu/zoho_dev2dev_nov _______________________________________________ Openslp-devel mailing list Openslp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openslp-devel