void perf_net_parseserver(int family, const char *name, unsigned int port, isc_sockaddr_t *addr) { isc_sockaddr_t addrs[8]; int count, i; isc_result_t result; if (port == 0) { fprintf(stderr, "server port cannot be 0\n"); perf_opt_usage(); exit(1); } count = 0; result = bind9_getaddresses(name, port, addrs, 8, &count); if (result == ISC_R_SUCCESS) { for (i = 0; i < count; i++) { if (isc_sockaddr_pf(&addrs[i]) == family || family == AF_UNSPEC) { *addr = addrs[i]; return; } } } fprintf(stderr, "invalid server address %s\n", name); perf_opt_usage(); exit(1); }
void perf_opt_parse(int argc, char **argv) { int c; opt_t *opt; isc_result_t result; unsigned int i; progname = isc_file_basename(argv[0]); perf_opt_add('h', perf_opt_boolean, NULL, "print this help", NULL, NULL); while ((c = getopt(argc, argv, optstr)) != -1) { for (i = 0; i < nopts; i++) { if (opts[i].c == c) break; } if (i == nopts) { perf_opt_usage(); exit(1); } if (c == 'h') { perf_opt_usage(); exit(0); } opt = &opts[i]; result = ISC_R_SUCCESS; switch (opt->type) { case perf_opt_string: *opt->u.stringp = optarg; break; case perf_opt_boolean: *opt->u.boolp = ISC_TRUE; break; case perf_opt_uint: *opt->u.uintp = parse_uint(opt->desc, optarg, 1, 0xFFFFFFFF); break; case perf_opt_timeval: *opt->u.uint64p = parse_timeval(opt->desc, optarg); break; case perf_opt_double: *opt->u.doublep = parse_double(opt->desc, optarg); break; case perf_opt_port: *opt->u.portp = parse_uint(opt->desc, optarg, 0, 0xFFFF); break; } } if (optind != argc) { fprintf(stderr, "unexpected argument %s\n", argv[optind]); perf_opt_usage(); exit(1); } }
static isc_uint64_t parse_timeval(const char *desc, const char *str) { const char *s; char c; isc_boolean_t seen_dot = ISC_FALSE; s = str; while (*s != 0) { c = *s++; if (c == '.') { if (seen_dot) goto fail; seen_dot = ISC_TRUE; } else if (c < '0' || c > '9') { goto fail; } } return MILLION * atof(str); fail: fprintf(stderr, "invalid %s: %s\n", desc, str); perf_opt_usage(); exit(1); }
static isc_uint32_t parse_uint(const char *desc, const char *str, unsigned int min, unsigned int max) { isc_uint32_t val; isc_result_t result; val = 0; result = isc_parse_uint32(&val, str, 10); if (result != ISC_R_SUCCESS || val < min || val > max) { fprintf(stderr, "invalid %s: %s\n", desc, str); perf_opt_usage(); exit(1); } return val; }
int perf_net_parsefamily(const char *family) { if (family == NULL || strcmp(family, "any") == 0) return AF_UNSPEC; else if (strcmp(family, "inet") == 0) return AF_INET; #ifdef AF_INET6 else if (strcmp(family, "inet6") == 0) return AF_INET6; #endif else { fprintf(stderr, "invalid family %s\n", family); perf_opt_usage(); exit(1); } }
void perf_net_parselocal(int family, const char *name, unsigned int port, isc_sockaddr_t *addr) { struct in_addr in4a; struct in6_addr in6a; if (name == NULL) { isc_sockaddr_anyofpf(addr, family); isc_sockaddr_setport(addr, port); } else if (inet_pton(AF_INET, name, &in4a) == 1) { isc_sockaddr_fromin(addr, &in4a, port); } else if (inet_pton(AF_INET6, name, &in6a) == 1) { isc_sockaddr_fromin6(addr, &in6a, port); } else { fprintf(stderr, "invalid local address %s\n", name); perf_opt_usage(); exit(1); } }
static double parse_double(const char *desc, const char *str) { char c; int index = 0; isc_boolean_t seen_dot = ISC_FALSE; while (str[index] != 0) { c = str[index]; if (c == '.') { if (seen_dot) goto fail; seen_dot = ISC_TRUE; } else if (c < '0' || c > '9') { goto fail; } index++; } return atof(str); fail: fprintf(stderr, "invalid %s: %s\n", desc, str); perf_opt_usage(); exit(1); }