static void dynmasq_refresh(void) { server_rec *s; pr_log_debug(DEBUG2, MOD_DYNMASQ_VERSION ": resolving all MasqueradeAddress directives (could take a little while)"); for (s = (server_rec *) server_list->xas_list; s; s = s->next) { config_rec *c; c = find_config(s->conf, CONF_PARAM, "MasqueradeAddress", FALSE); if (c != NULL) { const char *masq_addr; pr_netaddr_t *na; masq_addr = c->argv[1]; pr_netaddr_clear_ipcache(masq_addr); na = pr_netaddr_get_addr(s->pool, masq_addr, NULL); if (na != NULL) { /* Compare the obtained netaddr with the one already present. * Only update the "live" netaddr if they differ. */ pr_log_debug(DEBUG2, MOD_DYNMASQ_VERSION ": resolved MasqueradeAddress '%s' to IP address %s", masq_addr, pr_netaddr_get_ipstr(na)); if (pr_netaddr_cmp(c->argv[0], na) != 0) { pr_log_pri(PR_LOG_DEBUG, MOD_DYNMASQ_VERSION ": MasqueradeAddress '%s' updated for new address %s (was %s)", masq_addr, pr_netaddr_get_ipstr(na), pr_netaddr_get_ipstr(c->argv[0])); /* Overwrite the old netaddr pointer. Note that this constitutes * a minor memory leak, as there currently isn't a way to free * the memory used by a netaddr object. Hrm. */ c->argv[0] = na; } else { pr_log_debug(DEBUG2, MOD_DYNMASQ_VERSION ": MasqueradeAddress '%s' has not changed addresses", masq_addr); } } else { pr_log_pri(PR_LOG_INFO, MOD_DYNMASQ_VERSION ": unable to resolve '%s', keeping previous address", masq_addr); } } } return; }
END_TEST #ifdef PR_USE_IPV6 START_TEST (netaddr_get_dnsstr_ipv6_test) { pr_netaddr_t *addr; const char *ip, *res; ip = "::1"; res = pr_netaddr_get_dnsstr(NULL); fail_unless(res == NULL, "Failed to handle null argument"); fail_unless(errno == EINVAL, "Failed to set errno to EINVAL"); addr = pr_netaddr_get_addr(p, ip, NULL); fail_unless(addr != NULL, "Failed to get addr for '%s': %s", ip, strerror(errno)); pr_netaddr_set_reverse_dns(FALSE); res = pr_netaddr_get_dnsstr(addr); fail_unless(res != NULL, "Failed to get DNS str for addr: %s", strerror(errno)); fail_unless(strcmp(res, ip) == 0, "Expected '%s', got '%s'", ip, res); pr_netaddr_set_reverse_dns(TRUE); /* Even though we should expect a DNS name, not an IP address, the * previous call to pr_netaddr_get_dnsstr() cached the IP address. */ res = pr_netaddr_get_dnsstr(addr); fail_unless(res != NULL, "Failed to get DNS str for addr: %s", strerror(errno)); fail_unless(strcmp(res, ip) == 0, "Expected '%s', got '%s'", ip, res); pr_netaddr_clear(addr); /* Clearing the address doesn't work, since that removes even the address * info, in addition to the cached strings. */ res = pr_netaddr_get_dnsstr(addr); fail_unless(res != NULL, "Failed to get DNS str for addr: %s", strerror(errno)); fail_unless(strcmp(res, "") == 0, "Expected '%s', got '%s'", "", res); /* We need to clear the netaddr internal cache as well. */ pr_netaddr_clear_ipcache(ip); addr = pr_netaddr_get_addr(p, ip, NULL); fail_unless(addr != NULL, "Failed to get addr for '%s': %s", ip, strerror(errno)); mark_point(); fail_unless(addr->na_have_dnsstr == 0, "addr already has cached DNS str"); mark_point(); res = pr_netaddr_get_dnsstr(addr); fail_unless(res != NULL, "Failed to get DNS str for addr: %s", strerror(errno)); mark_point(); /* Depending on the contents of /etc/hosts, resolving ::1 could * return either "localhost" or "localhost.localdomain". Perhaps even * other variations, although these should be the most common. */ fail_unless(strcmp(res, "localhost") == 0 || strcmp(res, "localhost.localdomain") == 0 || strcmp(res, "localhost6") == 0 || strcmp(res, "localhost6.localdomain") == 0 || strcmp(res, "ip6-localhost") == 0 || strcmp(res, "ip6-loopback") == 0 || strcmp(res, ip) == 0, "Expected '%s', got '%s'", "localhost, localhost.localdomain et al", res); }