static void add_ip_list(ICMP_CHAT *chat, const ACL_ARGV *domain_list, int npkt, int delay) { ACL_DNS_DB* dns_db; const char* ptr; int i, j; char *pdomain, *pip; ACL_ARGV* ip_list = acl_argv_alloc(10); for (i = 0; i < domain_list->argc; i++) { dns_db = acl_gethostbyname(domain_list->argv[i], NULL); if (dns_db == NULL) { acl_msg_warn("Can't find domain %s", domain_list->argv[i]); continue; } for (j = 0; j < acl_netdb_size(dns_db); j++) { ptr = acl_netdb_index_ip(dns_db, j); if (ptr == NULL) continue; acl_argv_add(ip_list, domain_list->argv[i], ptr, NULL); } acl_netdb_free(dns_db); } for (i = 0; i < ip_list->argc;) { pdomain = ip_list->argv[i++]; pip = ip_list->argv[i++]; if (strcmp(pdomain, pip) == 0) icmp_ping_one(chat, NULL, pip, npkt, delay, 1); else icmp_ping_one(chat, pdomain, pip, npkt, delay, 1); } }
ACL_DNS_DB *acl_gethostbyname(const char *name, int *h_error) { ACL_DNS_DB *db; ACL_SOCKADDR saddr; struct addrinfo *res0, *res; if (h_error) *h_error = 0; /* lookup the local dns cache first */ db = acl_netdb_cache_lookup(name); if (db) return db; db = acl_netdb_new(name); if (ip2addr(name, 0, &saddr)) { ACL_HOSTNAME *h_host = acl_mycalloc(1, sizeof(ACL_HOSTNAME)); memcpy(&h_host->saddr, &saddr, sizeof(h_host->saddr)); ACL_SAFE_STRNCPY(h_host->ip, name, sizeof(h_host->ip)); (void) acl_array_append(db->h_db, h_host); db->size++; return db; } res0 = acl_host_addrinfo(name, SOCK_DGRAM); if (res0 == NULL) return NULL; for (res = res0; res != NULL; res = res->ai_next) { ACL_SOCKADDR *sa = (ACL_SOCKADDR *) res->ai_addr; ACL_HOSTNAME *h_host; char ip[64]; memset(&saddr, 0, sizeof(saddr)); saddr.sa.sa_family = res->ai_family; if (res->ai_family == AF_INET) { if (inet_ntop(res->ai_family, &sa->in.sin_addr, ip, sizeof(ip)) == NULL) { continue; } memcpy(&saddr.in.sin_addr, &sa->in.sin_addr, sizeof(saddr.in.sin_addr)); #ifdef AF_INET6 } else if (res->ai_family == AF_INET6) { if (inet_ntop(res->ai_family, &sa->in6.sin6_addr, ip, sizeof(ip)) == NULL) { continue; } memcpy(&saddr.in6.sin6_addr, &sa->in6.sin6_addr, sizeof(saddr.in6.sin6_addr)); #endif } else { continue; } h_host = (ACL_HOSTNAME*) acl_mycalloc(1, sizeof(ACL_HOSTNAME)); memcpy(&h_host->saddr, &saddr, sizeof(h_host->saddr)); ACL_SAFE_STRNCPY(h_host->ip, ip, sizeof(h_host->ip)); h_host->hport = 0; (void) acl_array_append(db->h_db, h_host); db->size++; } freeaddrinfo(res0); if (acl_netdb_size(db) > 0) return db; acl_netdb_free(db); return NULL; }