#endif
}
-static bool parse_ipv4(const char *s, unsigned port, struct sockaddr_in *sin)
-{
- sin->sin_family = AF_INET;
- sin->sin_port = htons(port);
-
- if (inet_pton(AF_INET, s, &sin->sin_addr) != 1) {
- DEBUG(DEBUG_ERR, (__location__ " Failed to translate %s into sin_addr\n", s));
- return false;
- }
-
-#ifdef HAVE_SOCK_SIN_LEN
- sin->sin_len = sizeof(*sin);
-#endif
- return true;
-}
-
-static bool parse_ipv6(const char *s, const char *ifaces, unsigned port, ctdb_sock_addr *saddr)
-{
- saddr->ip6.sin6_family = AF_INET6;
- saddr->ip6.sin6_port = htons(port);
- saddr->ip6.sin6_flowinfo = 0;
- saddr->ip6.sin6_scope_id = 0;
-
- if (inet_pton(AF_INET6, s, &saddr->ip6.sin6_addr) != 1) {
- DEBUG(DEBUG_ERR, (__location__ " Failed to translate %s into sin6_addr\n", s));
- return false;
- }
-
- if (ifaces && IN6_IS_ADDR_LINKLOCAL(&saddr->ip6.sin6_addr)) {
- if (strchr(ifaces, ',')) {
- DEBUG(DEBUG_ERR, (__location__ " Link local address %s "
- "is specified for multiple ifaces %s\n",
- s, ifaces));
- return false;
- }
- saddr->ip6.sin6_scope_id = if_nametoindex(ifaces);
- }
-
-#ifdef HAVE_SOCK_SIN6_LEN
- saddr->ip6.sin6_len = sizeof(*saddr);
-#endif
- return true;
-}
-
-/*
- parse an ip
- */
-static bool parse_ip(const char *addr, const char *ifaces, unsigned port,
- ctdb_sock_addr *saddr)
-{
- char *p;
- bool ret;
-
- ZERO_STRUCTP(saddr); /* valgrind :-) */
-
- /* IPv4 or IPv6 address?
- *
- * Use rindex() because we need the right-most ':' below for
- * IPv4-mapped IPv6 addresses anyway...
- */
- p = rindex(addr, ':');
- if (p == NULL) {
- ret = parse_ipv4(addr, port, &saddr->ip);
- } else {
- uint8_t ipv4_mapped_prefix[12] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff
- };
-
- ret = parse_ipv6(addr, ifaces, port, saddr);
- if (! ret) {
- return ret;
- }
-
- /*
- * Check for IPv4-mapped IPv6 address
- * (e.g. ::ffff:192.0.2.128) - reparse as IPv4 if
- * necessary
- */
- if (memcmp(&saddr->ip6.sin6_addr.s6_addr[0],
- ipv4_mapped_prefix,
- sizeof(ipv4_mapped_prefix)) == 0) {
- /* Reparse as IPv4 */
- ret = parse_ipv4(p+1, port, &saddr->ip);
- }
- }
-
- return ret;
-}
-
-/*
- parse a ip/mask pair
- */
-bool parse_ip_mask(const char *str, const char *ifaces, ctdb_sock_addr *addr, unsigned *mask)
-{
- char *p;
- char s[64]; /* Much longer than INET6_ADDRSTRLEN */
- char *endp = NULL;
- ssize_t len;
- bool ret;
-
- ZERO_STRUCT(*addr);
-
- len = strlen(str);
- if (len >= sizeof(s)) {
- DEBUG(DEBUG_ERR, ("Address %s is unreasonably long\n", str));
- return false;
- }
-
- strncpy(s, str, len+1);
-
- p = rindex(s, '/');
- if (p == NULL) {
- DEBUG(DEBUG_ERR, (__location__ " This addr: %s does not contain a mask\n", s));
- return false;
- }
-
- *mask = strtoul(p+1, &endp, 10);
- if (endp == NULL || *endp != 0) {
- /* trailing garbage */
- DEBUG(DEBUG_ERR, (__location__ " Trailing garbage after the mask in %s\n", s));
- return false;
- }
- *p = 0;
-
-
- /* now is this a ipv4 or ipv6 address ?*/
- ret = parse_ip(s, ifaces, 0, addr);
-
- return ret;
-}
-
/* we don't lock future pages here; it would increase the chance that
* we'd fail to mmap later on. */
void lockdown_memory(bool valgrinding)