Пример #1
0
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);
}
Пример #2
0
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);
	}
}
Пример #3
0
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);
}
Пример #4
0
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;
}
Пример #5
0
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);
	}
}
Пример #6
0
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);
	}
}
Пример #7
0
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);
}