* Updating common/lib * Updating lib/csu * Updating lib/libc * Updating libexec/ld.elf_so * Corrected test on __minix in featuretest to actually follow the meaning of the comment. * Cleaned up _REENTRANT-related defintions. * Disabled -D_REENTRANT for libfetch * Removing some unneeded __NBSD_LIBC defines and tests Change-Id: Ic1394baef74d11b9f86b312f5ff4bbc3cbf72ce2
		
			
				
	
	
		
			277 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			277 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
.\"	$NetBSD: getnameinfo.3,v 1.39 2012/09/26 23:13:00 christos Exp $
 | 
						|
.\"	$KAME: getnameinfo.3,v 1.37 2005/01/05 03:23:05 itojun Exp $
 | 
						|
.\"	$OpenBSD: getnameinfo.3,v 1.36 2004/12/21 09:48:20 jmc Exp $
 | 
						|
.\"
 | 
						|
.\" Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC")
 | 
						|
.\" Copyright (C) 2000, 2001  Internet Software Consortium.
 | 
						|
.\"
 | 
						|
.\" Permission to use, copy, modify, and distribute this software for any
 | 
						|
.\" purpose with or without fee is hereby granted, provided that the above
 | 
						|
.\" copyright notice and this permission notice appear in all copies.
 | 
						|
.\"
 | 
						|
.\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
 | 
						|
.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
						|
.\" AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
 | 
						|
.\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 | 
						|
.\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
 | 
						|
.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
						|
.\" PERFORMANCE OF THIS SOFTWARE.
 | 
						|
.\"
 | 
						|
.Dd September 26, 2012
 | 
						|
.Dt GETNAMEINFO 3
 | 
						|
.Os
 | 
						|
.Sh NAME
 | 
						|
.Nm getnameinfo
 | 
						|
.Nd socket address structure to hostname and service name
 | 
						|
.Sh SYNOPSIS
 | 
						|
.In netdb.h
 | 
						|
.Ft int
 | 
						|
.Fn getnameinfo "const struct sockaddr * restrict sa" "socklen_t salen" \
 | 
						|
    "char * restrict host" "socklen_t hostlen" "char * restrict serv" \
 | 
						|
    "socklen_t servlen" "int flags"
 | 
						|
.Sh DESCRIPTION
 | 
						|
The
 | 
						|
.Fn getnameinfo
 | 
						|
function is used to convert a
 | 
						|
.Li sockaddr
 | 
						|
structure to a pair of host name and service strings.
 | 
						|
It is a replacement for and provides more flexibility than the
 | 
						|
.Xr gethostbyaddr 3
 | 
						|
and
 | 
						|
.Xr getservbyport 3
 | 
						|
functions and is the converse of the
 | 
						|
.Xr getaddrinfo 3
 | 
						|
function.
 | 
						|
.Pp
 | 
						|
The
 | 
						|
.Li sockaddr
 | 
						|
structure
 | 
						|
.Fa sa
 | 
						|
should point to a
 | 
						|
.Li sockaddr_in
 | 
						|
(for IPv4),
 | 
						|
.Li sockaddr_in6
 | 
						|
(for IPv6),
 | 
						|
.Li sockaddr_atalk
 | 
						|
(for AppleTalk),
 | 
						|
.Li sockaddr_link
 | 
						|
(for link layer),
 | 
						|
or
 | 
						|
.Li sockaddr_local
 | 
						|
(for local/unix)
 | 
						|
structures that are
 | 
						|
.Fa salen
 | 
						|
bytes long.
 | 
						|
.Pp
 | 
						|
The host and service names associated with
 | 
						|
.Fa sa
 | 
						|
are stored in
 | 
						|
.Fa host
 | 
						|
and
 | 
						|
.Fa serv
 | 
						|
which have length parameters
 | 
						|
.Fa hostlen
 | 
						|
and
 | 
						|
.Fa servlen .
 | 
						|
The maximum value for
 | 
						|
.Fa hostlen
 | 
						|
is
 | 
						|
.Dv NI_MAXHOST
 | 
						|
and the maximum value for
 | 
						|
.Fa servlen
 | 
						|
is
 | 
						|
.Dv NI_MAXSERV ,
 | 
						|
as defined by
 | 
						|
.In netdb.h .
 | 
						|
If a length parameter is zero, no string will be stored.
 | 
						|
Otherwise, enough space must be provided to store the
 | 
						|
host name or service string plus a byte for the NUL terminator.
 | 
						|
.Pp
 | 
						|
The
 | 
						|
.Fa flags
 | 
						|
argument is formed by
 | 
						|
.Sy OR Ns 'ing
 | 
						|
the following values:
 | 
						|
.Bl -tag -width "NI_NUMERICHOSTXX"
 | 
						|
.It Dv NI_NOFQDN
 | 
						|
A fully qualified domain name is not required for local hosts.
 | 
						|
The local part of the fully qualified domain name is returned instead.
 | 
						|
.It Dv NI_NUMERICHOST
 | 
						|
Return the address in numeric form, as if calling
 | 
						|
.Xr inet_ntop 3 ,
 | 
						|
instead of a host name.
 | 
						|
.It Dv NI_NAMEREQD
 | 
						|
A name is required.
 | 
						|
If the host name cannot be found in DNS and this flag is set,
 | 
						|
a non-zero error code is returned.
 | 
						|
If the host name is not found and the flag is not set, the
 | 
						|
address is returned in numeric form.
 | 
						|
.It NI_NUMERICSERV
 | 
						|
The service name is returned as a digit string representing the port number.
 | 
						|
.It NI_DGRAM
 | 
						|
Specifies that the service being looked up is a datagram
 | 
						|
service, and causes
 | 
						|
.Xr getservbyport 3
 | 
						|
to be called with a second argument of
 | 
						|
.Dq udp
 | 
						|
instead of its default of
 | 
						|
.Dq tcp .
 | 
						|
This is required for the few ports (512\-514) that have different services
 | 
						|
for
 | 
						|
.Tn UDP
 | 
						|
and
 | 
						|
.Tn TCP .
 | 
						|
.El
 | 
						|
.Pp
 | 
						|
This implementation allows numeric IPv6 address notation with scope identifier,
 | 
						|
as documented in chapter 11 of draft-ietf-ipv6-scoping-arch-02.txt.
 | 
						|
IPv6 link-local address will appear as a string like
 | 
						|
.Dq Li fe80::1%ne0 .
 | 
						|
Refer to
 | 
						|
.Xr getaddrinfo 3
 | 
						|
for more information.
 | 
						|
.Sh RETURN VALUES
 | 
						|
.Fn getnameinfo
 | 
						|
returns zero on success or one of the error codes listed in
 | 
						|
.Xr gai_strerror 3
 | 
						|
if an error occurs.
 | 
						|
.Sh EXAMPLES
 | 
						|
The following code tries to get a numeric host name, and service name,
 | 
						|
for a given socket address.
 | 
						|
Observe that there is no hardcoded reference to a particular address family.
 | 
						|
.Bd -literal -offset indent
 | 
						|
struct sockaddr *sa;	/* input */
 | 
						|
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
 | 
						|
 | 
						|
if (getnameinfo(sa, sa-\*[Gt]sa_len, hbuf, sizeof(hbuf), sbuf,
 | 
						|
    sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) {
 | 
						|
	errx(1, "could not get numeric hostname");
 | 
						|
	/*NOTREACHED*/
 | 
						|
}
 | 
						|
printf("host=%s, serv=%s\en", hbuf, sbuf);
 | 
						|
.Ed
 | 
						|
.Pp
 | 
						|
The following version checks if the socket address has a reverse address mapping:
 | 
						|
.Bd -literal -offset indent
 | 
						|
struct sockaddr *sa;	/* input */
 | 
						|
char hbuf[NI_MAXHOST];
 | 
						|
 | 
						|
if (getnameinfo(sa, sa-\*[Gt]sa_len, hbuf, sizeof(hbuf), NULL, 0,
 | 
						|
    NI_NAMEREQD)) {
 | 
						|
	errx(1, "could not resolve hostname");
 | 
						|
	/*NOTREACHED*/
 | 
						|
}
 | 
						|
printf("host=%s\en", hbuf);
 | 
						|
.Ed
 | 
						|
.Sh SEE ALSO
 | 
						|
.Xr gai_strerror 3 ,
 | 
						|
.Xr getaddrinfo 3 ,
 | 
						|
.Xr gethostbyaddr 3 ,
 | 
						|
.Xr getservbyport 3 ,
 | 
						|
.Xr inet_ntop 3 ,
 | 
						|
.Xr resolver 3 ,
 | 
						|
.Xr hosts 5 ,
 | 
						|
.Xr resolv.conf 5 ,
 | 
						|
.Xr services 5 ,
 | 
						|
.Xr hostname 7 ,
 | 
						|
.Xr named 8
 | 
						|
.Rs
 | 
						|
.%A R. Gilligan
 | 
						|
.%A S. Thomson
 | 
						|
.%A J. Bound
 | 
						|
.%A W. Stevens
 | 
						|
.%T Basic Socket Interface Extensions for IPv6
 | 
						|
.%R RFC 2553
 | 
						|
.%D March 1999
 | 
						|
.Re
 | 
						|
.Rs
 | 
						|
.%A S. Deering
 | 
						|
.%A B. Haberman
 | 
						|
.%A T. Jinmei
 | 
						|
.%A E. Nordmark
 | 
						|
.%A B. Zill
 | 
						|
.%T "IPv6 Scoped Address Architecture"
 | 
						|
.%R internet draft
 | 
						|
.%N draft-ietf-ipv6-scoping-arch-02.txt
 | 
						|
.%O work in progress material
 | 
						|
.Re
 | 
						|
.Rs
 | 
						|
.%A Craig Metz
 | 
						|
.%T Protocol Independence Using the Sockets API
 | 
						|
.%B "Proceedings of the FREENIX track: 2000 USENIX annual technical conference"
 | 
						|
.%D June 2000
 | 
						|
.Re
 | 
						|
.Sh STANDARDS
 | 
						|
The
 | 
						|
.Fn getnameinfo
 | 
						|
function is defined by the
 | 
						|
.St -p1003.1g-2000
 | 
						|
draft specification and documented in
 | 
						|
.Sy "RFC 2553" ,
 | 
						|
.Dq Basic Socket Interface Extensions for IPv6 .
 | 
						|
.Sh CAVEATS
 | 
						|
.Fn getnameinfo
 | 
						|
can return both numeric and FQDN forms of the address specified in
 | 
						|
.Fa sa .
 | 
						|
There is no return value that indicates whether the string returned in
 | 
						|
.Fa host
 | 
						|
is a result of binary to numeric-text translation (like
 | 
						|
.Xr inet_ntop 3 ) ,
 | 
						|
or is the result of a DNS reverse lookup.
 | 
						|
Because of this, malicious parties could set up a PTR record as follows:
 | 
						|
.Bd -literal -offset indent
 | 
						|
1.0.0.127.in-addr.arpa. IN PTR  10.1.1.1
 | 
						|
.Ed
 | 
						|
.Pp
 | 
						|
and trick the caller of
 | 
						|
.Fn getnameinfo
 | 
						|
into believing that
 | 
						|
.Fa sa
 | 
						|
is
 | 
						|
.Li 10.1.1.1
 | 
						|
when it is actually
 | 
						|
.Li 127.0.0.1 .
 | 
						|
.Pp
 | 
						|
To prevent such attacks, the use of
 | 
						|
.Dv NI_NAMEREQD
 | 
						|
is recommended when the result of
 | 
						|
.Fn getnameinfo
 | 
						|
is used for access control purposes:
 | 
						|
.Bd -literal -offset indent
 | 
						|
struct sockaddr *sa;
 | 
						|
socklen_t salen;
 | 
						|
char addr[NI_MAXHOST];
 | 
						|
struct addrinfo hints, *res;
 | 
						|
int error;
 | 
						|
 | 
						|
error = getnameinfo(sa, salen, addr, sizeof(addr),
 | 
						|
    NULL, 0, NI_NAMEREQD);
 | 
						|
if (error == 0) {
 | 
						|
	memset(\*[Am]hints, 0, sizeof(hints));
 | 
						|
	hints.ai_socktype = SOCK_DGRAM;	/*dummy*/
 | 
						|
	hints.ai_flags = AI_NUMERICHOST;
 | 
						|
	if (getaddrinfo(addr, "0", \*[Am]hints, \*[Am]res) == 0) {
 | 
						|
		/* malicious PTR record */
 | 
						|
		freeaddrinfo(res);
 | 
						|
		printf("bogus PTR record\en");
 | 
						|
		return -1;
 | 
						|
	}
 | 
						|
	/* addr is FQDN as a result of PTR lookup */
 | 
						|
} else {
 | 
						|
	/* addr is numeric string */
 | 
						|
	error = getnameinfo(sa, salen, addr, sizeof(addr),
 | 
						|
	    NULL, 0, NI_NUMERICHOST);
 | 
						|
}
 | 
						|
.Ed
 | 
						|
.Sh BUGS
 | 
						|
The implementation of
 | 
						|
.Fn getnameinfo
 | 
						|
is not thread-safe.
 | 
						|
.\".Pp
 | 
						|
.\".Ox
 | 
						|
.\"intentionally uses a different
 | 
						|
.\".Dv NI_MAXHOST
 | 
						|
.\"value from what
 | 
						|
.\".Tn "RFC 2553"
 | 
						|
.\"suggests, to avoid buffer length handling mistakes.
 |