Annotation of embedaddon/ntp/libntp/decodenetnum.c, revision 1.1.1.1
1.1 misho 1: /*
2: * decodenetnum - return a net number (this is crude, but careful)
3: */
4: #include <config.h>
5: #include <sys/types.h>
6: #include <ctype.h>
7: #ifdef HAVE_SYS_SOCKET_H
8: #include <sys/socket.h>
9: #endif
10: #ifdef HAVE_NETINET_IN_H
11: #include <netinet/in.h>
12: #endif
13:
14: #include "ntp.h"
15: #include "ntp_stdlib.h"
16: #include "ntp_assert.h"
17:
18: /*
19: * decodenetnum convert text IP address and port to sockaddr_u
20: *
21: * Returns 0 for failure, 1 for success.
22: */
23: int
24: decodenetnum(
25: const char *num,
26: sockaddr_u *netnum
27: )
28: {
29: struct addrinfo hints, *ai = NULL;
30: int err;
31: u_short port;
32: const char *cp;
33: const char *port_str;
34: char *pp;
35: char *np;
36: char name[80];
37:
38: NTP_REQUIRE(num != NULL);
39: NTP_REQUIRE(strlen(num) < sizeof(name));
40:
41: port_str = NULL;
42: if ('[' != num[0]) {
43: /*
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.
47: */
48: pp = strchr(num, ':');
49: if (NULL == pp)
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';
56: cp = name;
57: pp = strchr(cp, ':');
58: *pp = '\0';
59: port_str = pp + 1;
60: }
61: } else {
62: cp = num + 1;
63: np = name;
64: while (*cp && ']' != *cp)
65: *np++ = *cp++;
66: *np = 0;
67: if (']' == cp[0] && ':' == cp[1] && '\0' != cp[2])
68: port_str = &cp[2];
69: cp = name;
70: }
71: ZERO(hints);
72: hints.ai_flags = Z_AI_NUMERICHOST;
73: err = getaddrinfo(cp, "ntp", &hints, &ai);
74: if (err != 0)
75: return 0;
76: NTP_INSIST(ai->ai_addrlen <= sizeof(*netnum));
77: memcpy(netnum, ai->ai_addr, ai->ai_addrlen);
78: freeaddrinfo(ai);
79: if (NULL == port_str || 1 != sscanf(port_str, "%hu", &port))
80: port = NTP_PORT;
81: SET_PORT(netnum, port);
82: return 1;
83: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>