static void *ping_thread(void *arg) { const char *ip, *dest = (char *) arg; ACL_DNS_DB* dns_db; int delay = 1; ICMP_CHAT *chat; /* 通过域名解析出IP地址 */ dns_db = acl_gethostbyname(dest, NULL); if (dns_db == NULL) { acl_msg_warn("Can't find domain %s", dest); return (NULL); } /* 只取出域名第一个 IP 地址 PING */ ip = acl_netdb_index_ip(dns_db, 0); if (ip == NULL || *ip == 0) { acl_msg_error("ip invalid"); acl_netdb_free(dns_db); return (NULL); } /* 创建 ICMP 对象 */ chat = icmp_chat_create(NULL, 1); /* 开始 PING */ if (strcmp(dest, ip) == 0) icmp_ping_one(chat, NULL, ip, __npkt, delay, 1); else icmp_ping_one(chat, dest, ip, __npkt, delay, 1); acl_netdb_free(dns_db); /* 释放域名解析对象 */ display_res2(chat); /* 显示 PING 结果 */ icmp_chat_free(chat); /* 释放 ICMP 对象 */ return (NULL); }
ACL_DNS_DB *acl_netdb_clone(const ACL_DNS_DB *h_dns_db) { const char *myname = "acl_netdb_clone"; char buf[256]; ACL_DNS_DB *dns_db; ACL_HOSTNAME *phost, *h_host; int i, n; if (h_dns_db == NULL || h_dns_db->h_db == NULL) return (NULL); n = acl_array_size(h_dns_db->h_db); if (n <= 0) { acl_msg_error("%s, %s(%d): h_db's size(%d) <= 0", __FILE__, myname, __LINE__, n); return (NULL); } dns_db = acl_netdb_new(h_dns_db->name); if (dns_db == NULL) { acl_msg_error("%s, %s(%d): acl_netdb_new error(%s)", __FILE__, myname, __LINE__, acl_last_strerror(buf, sizeof(buf))); return (NULL); } for (i = 0; i < n; i++) { phost = (ACL_HOSTNAME *) acl_array_index(h_dns_db->h_db, i); acl_assert(phost); h_host = acl_mycalloc(1, sizeof(ACL_HOSTNAME)); if (h_host == NULL) { acl_msg_error("%s, %s(%d): calloc error(%s)", __FILE__, myname, __LINE__, acl_last_strerror(buf, sizeof(buf))); acl_netdb_free(dns_db); return (NULL); } h_host->saddr.sin_addr.s_addr = phost->saddr.sin_addr.s_addr; ACL_SAFE_STRNCPY(h_host->ip, phost->ip, sizeof(h_host->ip)); h_host->hport = phost->hport; if (acl_array_append(dns_db->h_db, h_host) < 0) { acl_msg_error("%s, %s(%d): array append error(%s)", __FILE__, myname, __LINE__, acl_last_strerror(buf, sizeof(buf))); acl_netdb_free(dns_db); return (NULL); } dns_db->size++; } return (dns_db); }
/* 单线程 PING 单个地址的函数入口 */ static void ping_main_sync(const char *dest, int npkt) { ACL_DNS_DB* dns_db; int delay = 1; const char* ip; /* 创建 ICMP 对象 */ __chat = icmp_chat_create(NULL, 1); /* 由域名解析出 IP 地址 */ dns_db = acl_gethostbyname(dest, NULL); if (dns_db == NULL) { acl_msg_warn("Can't find domain %s", dest); return; } ip = acl_netdb_index_ip(dns_db, 0); if (ip == NULL || *ip == 0) acl_msg_fatal("ip invalid"); /* 开始 PING 一个 IP 地址 */ if (strcmp(dest, ip) == 0) icmp_ping_one(__chat, NULL, ip, npkt, delay, 1); else icmp_ping_one(__chat, dest, ip, npkt, delay, 1); /* 释放 DNS 查询结果 */ acl_netdb_free(dns_db); /* 显示 PING 结果小结 */ display_res(); }
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); } }
bool pop3_client::get_ip() { ACL_DNS_DB* dns_db = acl_gethostbyname(pop3_addr_.c_str(), NULL); if (dns_db == NULL) { logger_error("gethostbyname(%s) failed", pop3_addr_.c_str()); return false; } const char* first_ip = acl_netdb_index_ip(dns_db, 0); if (first_ip == NULL || *first_ip == 0) { logger_error("no ip for domain: %s", pop3_addr_.c_str()); acl_netdb_free(dns_db); return false; } pop3_ip_ = first_ip; acl_netdb_free(dns_db); return true; }
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; }