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); } }
void acl_clean_env(char **preserve_list) { #ifdef ACL_UNIX extern char **environ; char **env = environ; #elif defined(ACL_WINDOWS) extern char **_environ; char **env = _environ; #endif ACL_ARGV *save_list; char *value; char **cpp; char *eq; /* * Preserve or specify selected environment variables. */ #define STRING_AND_LENGTH(x, y) (x), (ssize_t) (y) save_list = acl_argv_alloc(10); for (cpp = preserve_list; *cpp; cpp++) if ((eq = strchr(*cpp, '=')) != 0) acl_argv_addn(save_list, STRING_AND_LENGTH(*cpp, eq - *cpp), STRING_AND_LENGTH(eq + 1, strlen(eq + 1)), (char *) 0); else if ((value = acl_safe_getenv(*cpp)) != 0) acl_argv_add(save_list, *cpp, value, (char *) 0); /* * Truncate the process environment, if available. On some systems * (Ultrix!), environ can be a null pointer. */ if (env) env[0] = 0; /* * Restore preserved environment variables. */ for (cpp = save_list->argv; *cpp; cpp += 2) #ifdef ACL_UNIX if (setenv(cpp[0], cpp[1], 1)) #elif defined(ACL_WINDOWS) if (!SetEnvironmentVariable(cpp[0], cpp[1])) #endif acl_msg_error("setenv(%s, %s): %s", cpp[0], cpp[1], acl_last_serror()); /* * Cleanup. */ acl_argv_free(save_list); }
ACL_ARGV *proctl_serivce_get_all() { ACL_ARGV *argv = acl_argv_alloc(10); PROCTL_SERVICE *service; int i, n; LOCK_RUNNING_SERVICE; n = acl_array_size(__services); for (i = 0; i < n; i++) { service = (PROCTL_SERVICE*) acl_array_index(__services, i); acl_argv_add(argv, service->filepath, NULL); } UNLOCK_RUNNING_SERVICE; if (argv->argc == 0) { acl_argv_free(argv); return (NULL); } return (argv); }
int main(int argc, char* argv[]) { char ch; int npkt = 5, i, syn = 0, thread = 0; ACL_ARGV* dest_list = acl_argv_alloc(10); signal(SIGINT, OnSigInt); /* 用户按下 ctr + c 时中断 PING 程序 */ acl_socket_init(); /* 在 WIN32 下需要初始化全局套接字库 */ acl_msg_stdout_enable(1); /* 允许 acl_msg_xxx 记录的信息输出至屏幕 */ while ((ch = getopt(argc, argv, "htsl:n:")) > 0) { switch (ch) { case 'h': usage(argv[0]); return (0); case 's': syn = 1; break; case 't': thread = 1; break; case 'n': npkt = atoi(optarg); break; default: usage(argv[0]); return (0); } } if (optind == argc) { usage(argv[0]); return (0); } for (i = optind; i < argc; i++) { acl_argv_add(dest_list, argv[i], NULL); } if (npkt <= 0) npkt = 0; /* 同步 PING 方式,对于多个目标地址,采用一个线程 PING 一个地址 */ if (thread) ping_main_threads(dest_list, npkt); /* 同步 PING 方式,只能同时 PING 一个地址 */ else if (syn) ping_main_sync(dest_list->argv[0], npkt); /* 异步 PING 方式,可以在一个线程中同时 PING 多个地址 */ else ping_main_async(dest_list, npkt); acl_argv_free(dest_list); #ifdef WIN32 printf("please enter any key to exit\r\n"); getchar(); #endif acl_socket_end(); return 0; }