int main(int argc, char * argv[]) { gflags::ParseCommandLineFlags(&argc, &argv, false); int num = FLAGS_task_num; std::vector<ip_port_t> ip_list; parse_ip_list(FLAGS_server_addr, &ip_list); if (ip_list.empty()) { fprintf(stderr, "server_addr:%s, format error!", FLAGS_server_addr.c_str()); return 1; } if (prepare_data(FLAGS_data_file.c_str())) { PLOG_ERROR("read data failed!"); return 1; } tasks = new ::task_t[num]; for (int i=0; i<num; ++i) { tasks[i].ip = ip_list[0].ip; tasks[i].port = ip_list[0].port; tasks[i].file = FLAGS_data_file; tasks[i].co = conet::alloc_coroutine(proc_send, tasks+i); tasks[i].data = &g_data; resume(tasks[i].co); } while (g_finish_task_num < FLAGS_task_num) { conet::dispatch(); } return 0; }
int dcplugin_init(DCPlugin * const dcplugin, int argc, char *argv[]) { Blocking *blocking; int opt_flag; int option_index = 0; if ((blocking = calloc((size_t) 1U, sizeof *blocking)) == NULL) { return -1; } dcplugin_set_user_data(dcplugin, blocking); blocking->fp = NULL; blocking->domains = NULL; blocking->domains_rev = NULL; blocking->domains_substr = NULL; blocking->ips = NULL; blocking->ltsv = 0; optind = 0; #ifdef _OPTRESET optreset = 1; #endif while ((opt_flag = getopt_long(argc, argv, getopt_options, getopt_long_options, &option_index)) != -1) { switch (opt_flag) { case 'd': if (parse_domain_list(&blocking->domains, &blocking->domains_rev, &blocking->domains_substr, optarg) != 0) { return -1; } break; case 'i': if (parse_ip_list(&blocking->ips, optarg) != 0) { return -1; } break; case 'l': if (strncmp(optarg, "ltsv:", (sizeof "ltsv:") - 1U) == 0) { blocking->ltsv = 1; optarg += (sizeof "ltsv:") - 1U; } if ((blocking->fp = fopen(optarg, "a")) == NULL) { return -1; } break; default: return -1; } } return 0; }
int main(int argc, char **argv) { fd_set readset, errorset; int max_fd; memset(&id_addr_queue, 0, sizeof(id_addr_queue)); memset(&delay_queue, 0, sizeof(delay_queue)); if (0 != parse_args(argc, argv)) return EXIT_FAILURE; if (0 != parse_ip_list()) return EXIT_FAILURE; if (0 != parse_chnroute()) return EXIT_FAILURE; if (0 != resolve_dns_servers()) return EXIT_FAILURE; if (0 != dns_init_sockets()) return EXIT_FAILURE; printf("%s\n", version); max_fd = MAX(local_sock, remote_sock) + 1; while (1) { FD_ZERO(&readset); FD_ZERO(&errorset); FD_SET(local_sock, &readset); FD_SET(local_sock, &errorset); FD_SET(remote_sock, &readset); FD_SET(remote_sock, &errorset); struct timeval timeout = { .tv_sec = 1, .tv_usec = 0, }; if (-1 == select(max_fd, &readset, NULL, &errorset, &timeout)) { ERR("select"); return EXIT_FAILURE; } check_and_send_delay(); if (FD_ISSET(local_sock, &errorset)) { // TODO getsockopt(..., SO_ERROR, ...); VERR("local_sock error\n"); return EXIT_FAILURE; } if (FD_ISSET(remote_sock, &errorset)) { // TODO getsockopt(..., SO_ERROR, ...); VERR("remote_sock error\n"); return EXIT_FAILURE; } if (FD_ISSET(local_sock, &readset)) dns_handle_local(); if (FD_ISSET(remote_sock, &readset)) dns_handle_remote(); } return EXIT_SUCCESS; } static int setnonblock(int sock) { int flags; flags = fcntl(sock, F_GETFL, 0); if (flags == -1) { ERR("fcntl"); return -1; } if (-1 == fcntl(sock, F_SETFL, flags | O_NONBLOCK)) { ERR("fcntl"); return -1; } return 0; }