23
29
struct addrinfo hints, *ai = NULL;
25
register const char *cp;
29
38
NTP_REQUIRE(num != NULL);
30
39
NTP_REQUIRE(strlen(num) < sizeof(name));
44
* to distinguish IPv6 embedded colons from a port
45
* specification on an IPv4 address, assume all
46
* legal IPv6 addresses have at least two colons.
48
pp = strchr(num, ':');
50
cp = num; /* no colons */
51
else if (NULL != strchr(pp + 1, ':'))
52
cp = num; /* two or more colons */
53
else { /* one colon */
54
strncpy(name, num, sizeof(name));
55
name[sizeof(name) - 1] = '\0';
37
64
while (*cp && ']' != *cp)
67
if (']' == cp[0] && ':' == cp[1] && '\0' != cp[2])
42
memset(&hints, 0, sizeof(hints));
43
hints.ai_flags = AI_NUMERICHOST;
44
err = getaddrinfo(cp, NULL, &hints, &ai);
72
hints.ai_flags = Z_AI_NUMERICHOST;
73
err = getaddrinfo(cp, "ntp", &hints, &ai);
47
memcpy(netnum, ai->ai_addr, ai->ai_addrlen);
76
NTP_INSIST(ai->ai_addrlen <= sizeof(*netnum));
77
memcpy(netnum, ai->ai_addr, ai->ai_addrlen);
79
if (NULL == port_str || 1 != sscanf(port_str, "%hu", &port))
81
SET_PORT(netnum, port);