This of course needs a libc minor bump too.
On Mon, Apr 04, 2011 at 11:10:54AM -0700, Matthew Dempsky wrote:
> I haven't heard any objections to my initial AI_FQDN diff, so here's
> the diff again with updated man page bits. See the original thread
> for a proof-of-concept diff from djm@ to use this in OpenSSH.
>
> The man page mostly only uses "hostname" when referring to the formal
> argument, so I changed the AI_CANONNAME descriptive text to use "host
> name" to be consistent with the rest of the file. The AI_FQDN text is
> based on the AI_CANONNAME text + the MSDN description of Windows's
> flag.
>
> ok?
>
> Index: lib/libc/net/getaddrinfo.3
> ===================================================================
> RCS file: /cvs/src/lib/libc/net/getaddrinfo.3,v
> retrieving revision 1.47
> diff -u -p lib/libc/net/getaddrinfo.3
> --- lib/libc/net/getaddrinfo.3 9 Jul 2009 10:14:41 -0000 1.47
> +++ lib/libc/net/getaddrinfo.3 4 Apr 2011 17:53:40 -0000
> @@ -126,11 +126,33 @@ If the
> bit is set, a successful call to
> .Fn getaddrinfo
> will return a NUL-terminated string containing the canonical name
> -of the specified hostname in the
> +of the specified host name in the
> .Fa ai_canonname
> element of the first
> .Li addrinfo
> structure returned.
> +.It Dv AI_FQDN
> +If the
> +.Dv AI_FQDN
> +bit is set, a successful call to
> +.Fn getaddrinfo
> +will return a NUL-terminated string containing the fully qualified domain
> name
> +of the specified host name in the
> +.Fa ai_canonname
> +element of the first
> +.Li addrinfo
> +structure returned.
> +.Pp
> +This is different than the
> +.Dv AI_CANONNAME
> +bit flag that returns the canonical name registered in DNS,
> +which may be different than the fully qualified domain name
> +that the host name resolved to.
> +Only one of the
> +.Dv AI_FQDN
> +and
> +.DV AI_CANONNAME
> +bits can be set.
> .It Dv AI_NUMERICHOST
> If the
> .Dv AI_NUMERICHOST
> @@ -438,6 +460,10 @@ function is defined by the
> draft specification and documented in
> .Dv "RFC 3493" ,
> .Dq Basic Socket Interface Extensions for IPv6 .
> +.Pp
> +The
> +.Dv AI_FQDN
> +flag bit first appeared in Windows 7.
> .Sh BUGS
> The implementation of
> .Fn getaddrinfo
> Index: include/netdb.h
> ===================================================================
> RCS file: /cvs/src/include/netdb.h,v
> retrieving revision 1.27
> diff -u -p include/netdb.h
> --- include/netdb.h 2 Jun 2009 16:47:50 -0000 1.27
> +++ include/netdb.h 4 Apr 2011 17:53:40 -0000
> @@ -155,9 +155,10 @@ struct protoent {
> #define AI_NUMERICHOST 4 /* don't ever try hostname lookup */
> #define AI_EXT 8 /* enable non-portable extensions */
> #define AI_NUMERICSERV 16 /* don't ever try servname lookup */
> +#define AI_FQDN 32 /* return the FQDN that was resolved */
> /* valid flags for addrinfo */
> #define AI_MASK \
> - (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_NUMERICSERV)
> + (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST | AI_NUMERICSERV | AI_FQDN)
>
> #define NI_NUMERICHOST 1 /* return the host address, not the
> name */
> #define NI_NUMERICSERV 2 /* return the service address, not the
> name */
> Index: lib/libc/net/getaddrinfo.c
> ===================================================================
> RCS file: /cvs/src/lib/libc/net/getaddrinfo.c,v
> retrieving revision 1.71
> diff -u -p lib/libc/net/getaddrinfo.c
> --- lib/libc/net/getaddrinfo.c 18 Nov 2009 07:43:22 -0000 1.71
> +++ lib/libc/net/getaddrinfo.c 4 Apr 2011 17:53:40 -0000
> @@ -309,7 +309,9 @@ getaddrinfo(const char *hostname, const char *servname
> if (hints->ai_addrlen || hints->ai_canonname ||
> hints->ai_addr || hints->ai_next)
> ERR(EAI_BADHINTS); /* xxx */
> - if (hints->ai_flags & ~AI_MASK)
> + if ((hints->ai_flags & ~AI_MASK) != 0 ||
> + (hints->ai_flags & (AI_CANONNAME | AI_FQDN)) ==
> + (AI_CANONNAME | AI_FQDN))
> ERR(EAI_BADFLAGS);
> switch (hints->ai_family) {
> case PF_UNSPEC:
> @@ -671,14 +673,13 @@ explore_numeric(const struct addrinfo *pai, const char
> pai->ai_family == PF_UNSPEC /*?*/) {
> GET_AI(cur->ai_next, afd, pton);
> GET_PORT(cur->ai_next, servname);
> - if ((pai->ai_flags & AI_CANONNAME)) {
> - /*
> - * Set the numeric address itself as
> - * the canonical name, based on a
> - * clarification in rfc2553bis-03.
> - */
> - GET_CANONNAME(cur->ai_next, canonname);
> - }
> + /*
> + * Set the numeric address itself as
> + * the canonical name, based on a
> + * clarification in rfc2553bis-03.
> + */
> + GET_CANONNAME(cur->ai_next, canonname);
> +
> while (cur && cur->ai_next)
> cur = cur->ai_next;
> } else
> @@ -764,7 +765,7 @@ explore_numeric_scope(const struct addrinfo *pai, cons
> static int
> get_canonname(const struct addrinfo *pai, struct addrinfo *ai, const char
> *str)
> {
> - if ((pai->ai_flags & AI_CANONNAME) != 0) {
> + if ((pai->ai_flags & (AI_CANONNAME | AI_FQDN)) != 0) {
> ai->ai_canonname = strdup(str);
> if (ai->ai_canonname == NULL)
> return EAI_MEMORY;
> @@ -1129,7 +1130,7 @@ getanswer(const querybuf *answer, int anslen, const ch
> haveanswer++;
> }
> if (haveanswer) {
> - if (!canonname)
> + if (!canonname || (pai->ai_flags & AI_FQDN) != 0)
> (void)get_canonname(pai, sentinel.ai_next, qname);
> else
> (void)get_canonname(pai, sentinel.ai_next, canonname);
> @@ -1275,11 +1276,9 @@ found:
> /* cover it up */
> res->ai_flags = pai->ai_flags;
>
> - if (pai->ai_flags & AI_CANONNAME) {
> - if (get_canonname(pai, res, cname) != 0) {
> - freeaddrinfo(res0);
> - goto again;
> - }
> + if (get_canonname(pai, res, cname) != 0) {
> + freeaddrinfo(res0);
> + goto again;
> }
> }
> return res0;
> @@ -1369,8 +1368,7 @@ nextline:
> /* cover it up */
> res->ai_flags = pai->ai_flags;
>
> - if (pai->ai_flags & AI_CANONNAME)
> - (void)get_canonname(pai, res, canonname);
> + (void)get_canonname(pai, res, canonname);
> }
> } else
> res0 = NULL;