| | |
| | | |
| | | #define NUM_TESTS 10 |
| | | |
| | | /* struct test_server_input { */ |
| | | /* int dns; */ |
| | | /* //struct hosts_list *hosts; */ |
| | | /* int num_hosts; */ |
| | | /* int num_tests; */ |
| | | /* }; */ |
| | | |
| | | /* struct progress_input { */ |
| | | /* int num_hosts; */ |
| | | /* int num_tests; */ |
| | | /* int num_servers; */ |
| | | /* }; */ |
| | | |
| | | int test_dns(void); |
| | | void *test_server(void *in); |
| | | void *print_progress(void *in); |
| | |
| | | int main(int argc, char** argv) |
| | | { |
| | | int option, added_hosts = 0; |
| | | while((option = getopt(argc, argv, "s:h:t:n:")) != -1) { |
| | | while((option = getopt(argc, argv, "s:a:t:n:h")) != -1) { |
| | | switch (option) { |
| | | case 's': //server to use |
| | | add_dns_server(&servers, optarg); |
| | | num_servers++; |
| | | break; |
| | | case 'h': //hostname to search |
| | | case 'a': //hostname to search |
| | | add_hosts_server(&hosts, optarg); |
| | | added_hosts++; |
| | | break; |
| | |
| | | num_tests = atoi(optarg); |
| | | break; |
| | | case '?': |
| | | case 'h': |
| | | default: |
| | | printf("Error: invalid option -%c\n", optopt); |
| | | printf("Usage: %s [options]\n", argv[0]); |
| | | printf("Options:\n"); |
| | | printf("\t-s <server>\tadd a DNS server to be tested\n"); |
| | | printf("\t-a <hostname>\tadd a hostname to be tested\n"); |
| | | printf("\t-t <number>\tspecify the number of hostnames to be tested, capped at 50 + number manually added\n\t\t\tdefaults to test all available\n"); |
| | | printf("\t-n <number>\tspecify the number of tests to perform on each hostname\n\t\t\tdefaults to 10\n"); |
| | | printf("\t-h\t\tShow this help\n"); |
| | | free_dns_list(&servers); |
| | | free_hosts_list(&hosts); |
| | | exit(1); |
| | |
| | | num_hosts = NUM_HOSTNAMES + added_hosts; |
| | | } |
| | | for (int i = added_hosts; i < num_hosts; i++) { |
| | | add_hosts_server(&hosts, HOSTNAMES[i-added_hosts]); |
| | | add_hosts_server(&hosts, (char*)HOSTNAMES[i-added_hosts]); |
| | | } |
| | | for (int i = 0; i < NUM_DNS; i++) { |
| | | add_dns_server(&servers, DNS_SERVERS[i]); |
| | | add_dns_server(&servers, (char*)DNS_SERVERS[i]); |
| | | } |
| | | test_dns(); |
| | | sort_servers(&servers); |
| | |
| | | struct hosts_list *curr = hosts; |
| | | while (curr) { |
| | | struct timespec run; |
| | | run.tv_sec = -1; run.tv_nsec = 0; |
| | | unsigned char buf[65536]; |
| | | run = resolve(buf, curr->server, dns->server, T_A); |
| | | if (run.tv_sec == -1) //currently ignore failed tests, need to figure out what to do with them |
| | | continue; |
| | | for (int i = 0; i < 3 && run.tv_sec == -1; i++) { |
| | | run = resolve(buf, curr->server, dns->server, T_A); |
| | | } |
| | | if (run.tv_sec == -1) //if test has failed 3 times, set time taken to 3s as penalty |
| | | run.tv_sec = 3; |
| | | dns->time.tv_sec += run.tv_sec; |
| | | dns->time.tv_nsec += run.tv_nsec; |
| | | if (dns->time.tv_nsec >= 1000000000) { //nanoseconds have overflowed into seconds |