xref: /freebsd/lib/libc/net/getnameinfo.3 (revision 942e234d868ddc64a11b6af0ee78d47ccb44de1f)
16617cf57SGeorge V. Neville-Neil.\"	$KAME: getnameinfo.3,v 1.37 2005/01/05 03:23:05 itojun Exp $
26617cf57SGeorge V. Neville-Neil.\"	$OpenBSD: getnameinfo.3,v 1.36 2004/12/21 09:48:20 jmc Exp $
36617cf57SGeorge V. Neville-Neil.\"
46617cf57SGeorge V. Neville-Neil.\" Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC")
56617cf57SGeorge V. Neville-Neil.\" Copyright (C) 2000, 2001  Internet Software Consortium.
66617cf57SGeorge V. Neville-Neil.\"
76617cf57SGeorge V. Neville-Neil.\" Permission to use, copy, modify, and distribute this software for any
86617cf57SGeorge V. Neville-Neil.\" purpose with or without fee is hereby granted, provided that the above
96617cf57SGeorge V. Neville-Neil.\" copyright notice and this permission notice appear in all copies.
106617cf57SGeorge V. Neville-Neil.\"
116617cf57SGeorge V. Neville-Neil.\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
126617cf57SGeorge V. Neville-Neil.\" REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
136617cf57SGeorge V. Neville-Neil.\" AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
146617cf57SGeorge V. Neville-Neil.\" INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
156617cf57SGeorge V. Neville-Neil.\" LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
166617cf57SGeorge V. Neville-Neil.\" OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
176617cf57SGeorge V. Neville-Neil.\" PERFORMANCE OF THIS SOFTWARE.
186617cf57SGeorge V. Neville-Neil.\"
196b806d21SRuslan Ermilov.\" $FreeBSD$
206b806d21SRuslan Ermilov.\"
2120d96999SHiroki Sato.Dd March 15, 2018
226617cf57SGeorge V. Neville-Neil.Dt GETNAMEINFO 3
236617cf57SGeorge V. Neville-Neil.Os
246617cf57SGeorge V. Neville-Neil.Sh NAME
256617cf57SGeorge V. Neville-Neil.Nm getnameinfo
266617cf57SGeorge V. Neville-Neil.Nd socket address structure to hostname and service name
276617cf57SGeorge V. Neville-Neil.Sh SYNOPSIS
28580dbd65SJoel Dahl.In sys/types.h
29580dbd65SJoel Dahl.In sys/socket.h
30580dbd65SJoel Dahl.In netdb.h
316617cf57SGeorge V. Neville-Neil.Ft int
32f789cb82SRuslan Ermilov.Fo getnameinfo
33f789cb82SRuslan Ermilov.Fa "const struct sockaddr *sa" "socklen_t salen" "char *host"
34f789cb82SRuslan Ermilov.Fa "size_t hostlen" "char *serv" "size_t servlen" "int flags"
35f789cb82SRuslan Ermilov.Fc
366617cf57SGeorge V. Neville-Neil.Sh DESCRIPTION
376617cf57SGeorge V. Neville-NeilThe
386617cf57SGeorge V. Neville-Neil.Fn getnameinfo
396617cf57SGeorge V. Neville-Neilfunction is used to convert a
406617cf57SGeorge V. Neville-Neil.Li sockaddr
416617cf57SGeorge V. Neville-Neilstructure to a pair of host name and service strings.
426617cf57SGeorge V. Neville-NeilIt is a replacement for and provides more flexibility than the
436617cf57SGeorge V. Neville-Neil.Xr gethostbyaddr 3
446617cf57SGeorge V. Neville-Neiland
456617cf57SGeorge V. Neville-Neil.Xr getservbyport 3
466617cf57SGeorge V. Neville-Neilfunctions and is the converse of the
476617cf57SGeorge V. Neville-Neil.Xr getaddrinfo 3
486617cf57SGeorge V. Neville-Neilfunction.
496617cf57SGeorge V. Neville-Neil.Pp
50bb957021SHiroki SatoIf a link-layer address or UNIX-domain address is passed to
51160a2e55SBruce M Simpson.Fn getnameinfo ,
52160a2e55SBruce M Simpsonits ASCII representation will be stored in
53160a2e55SBruce M Simpson.Fa host .
54160a2e55SBruce M SimpsonThe string pointed to by
55160a2e55SBruce M Simpson.Fa serv
56160a2e55SBruce M Simpsonwill be set to the empty string if non-NULL;
57160a2e55SBruce M Simpson.Fa flags
58160a2e55SBruce M Simpsonwill always be ignored.
59bb957021SHiroki SatoFor a link-layer address,
60bb957021SHiroki Satothis can be used as a replacement of the legacy
61160a2e55SBruce M Simpson.Xr link_ntoa 3
62160a2e55SBruce M Simpsonfunction.
63160a2e55SBruce M Simpson.Pp
646617cf57SGeorge V. Neville-NeilThe
656617cf57SGeorge V. Neville-Neil.Li sockaddr
666617cf57SGeorge V. Neville-Neilstructure
676617cf57SGeorge V. Neville-Neil.Fa sa
686617cf57SGeorge V. Neville-Neilshould point to either a
69160a2e55SBruce M Simpson.Li sockaddr_in ,
70bb957021SHiroki Sato.Li sockaddr_in6 ,
71bb957021SHiroki Sato.Li sockaddr_dl ,
72160a2e55SBruce M Simpsonor
73bb957021SHiroki Sato.Li sockaddr_un
74bb957021SHiroki Satostructure
75bb957021SHiroki Sato.Po for IPv4 ,
76bb957021SHiroki SatoIPv6,
77bb957021SHiroki Satolink-layer,
78bb957021SHiroki Satoor UNIX-domain respectively
79bb957021SHiroki Sato.Pc
80bb957021SHiroki Satothat is
816617cf57SGeorge V. Neville-Neil.Fa salen
826617cf57SGeorge V. Neville-Neilbytes long.
8320d96999SHiroki SatoIf
8420d96999SHiroki Sato.Fa salen
8520d96999SHiroki Satois shorter than the length corresponding to the specified
8620d96999SHiroki Satoaddress family or longer than
8720d96999SHiroki Sato.Fn sizeof "struct sockaddr_storage" ,
8820d96999SHiroki Satoit returns
8920d96999SHiroki Sato.Er EAI_FAMILY .
9020d96999SHiroki SatoNote that
9120d96999SHiroki Sato.Va sa->sa_len
9220d96999SHiroki Satoshould be consistent with
9320d96999SHiroki Sato.Fa salen
9420d96999SHiroki Satothough the value of
9520d96999SHiroki Sato.Va sa->sa_len
9620d96999SHiroki Satois not directly used in this function.
976617cf57SGeorge V. Neville-Neil.Pp
986617cf57SGeorge V. Neville-NeilThe host and service names associated with
996617cf57SGeorge V. Neville-Neil.Fa sa
1006617cf57SGeorge V. Neville-Neilare stored in
1016617cf57SGeorge V. Neville-Neil.Fa host
1026617cf57SGeorge V. Neville-Neiland
1036617cf57SGeorge V. Neville-Neil.Fa serv
1046617cf57SGeorge V. Neville-Neilwhich have length parameters
1056617cf57SGeorge V. Neville-Neil.Fa hostlen
1066617cf57SGeorge V. Neville-Neiland
1076617cf57SGeorge V. Neville-Neil.Fa servlen .
1086617cf57SGeorge V. Neville-NeilThe maximum value for
1096617cf57SGeorge V. Neville-Neil.Fa hostlen
1106617cf57SGeorge V. Neville-Neilis
1116617cf57SGeorge V. Neville-Neil.Dv NI_MAXHOST
1126617cf57SGeorge V. Neville-Neiland
1136617cf57SGeorge V. Neville-Neilthe maximum value for
1146617cf57SGeorge V. Neville-Neil.Fa servlen
1156617cf57SGeorge V. Neville-Neilis
1166617cf57SGeorge V. Neville-Neil.Dv NI_MAXSERV ,
1176617cf57SGeorge V. Neville-Neilas defined by
1186617cf57SGeorge V. Neville-Neil.Aq Pa netdb.h .
1196617cf57SGeorge V. Neville-NeilIf a length parameter is zero, no string will be stored.
1206617cf57SGeorge V. Neville-NeilOtherwise, enough space must be provided to store the
1216617cf57SGeorge V. Neville-Neilhost name or service string plus a byte for the NUL terminator.
1226617cf57SGeorge V. Neville-Neil.Pp
1236617cf57SGeorge V. Neville-NeilThe
1246617cf57SGeorge V. Neville-Neil.Fa flags
1256617cf57SGeorge V. Neville-Neilargument is formed by
1266617cf57SGeorge V. Neville-Neil.Tn OR Ns 'ing
1276617cf57SGeorge V. Neville-Neilthe following values:
128b4a395a4SEd Schouten.Bl -tag -width "NI_NUMERICSCOPEXX"
1296617cf57SGeorge V. Neville-Neil.It Dv NI_NOFQDN
1306617cf57SGeorge V. Neville-NeilA fully qualified domain name is not required for local hosts.
1316617cf57SGeorge V. Neville-NeilThe local part of the fully qualified domain name is returned instead.
1326617cf57SGeorge V. Neville-Neil.It Dv NI_NUMERICHOST
1336617cf57SGeorge V. Neville-NeilReturn the address in numeric form, as if calling
1346617cf57SGeorge V. Neville-Neil.Xr inet_ntop 3 ,
1356617cf57SGeorge V. Neville-Neilinstead of a host name.
1366617cf57SGeorge V. Neville-Neil.It Dv NI_NAMEREQD
1376617cf57SGeorge V. Neville-NeilA name is required.
1386617cf57SGeorge V. Neville-NeilIf the host name cannot be found in DNS and this flag is set,
1396617cf57SGeorge V. Neville-Neila non-zero error code is returned.
1406617cf57SGeorge V. Neville-NeilIf the host name is not found and the flag is not set, the
1416617cf57SGeorge V. Neville-Neiladdress is returned in numeric form.
1426617cf57SGeorge V. Neville-Neil.It NI_NUMERICSERV
1436617cf57SGeorge V. Neville-NeilThe service name is returned as a digit string representing the port number.
144b4a395a4SEd Schouten.It NI_NUMERICSCOPE
145b4a395a4SEd SchoutenThe scope identifier is returned as a digit string.
1466617cf57SGeorge V. Neville-Neil.It NI_DGRAM
1476617cf57SGeorge V. Neville-NeilSpecifies that the service being looked up is a datagram
1486617cf57SGeorge V. Neville-Neilservice, and causes
1496617cf57SGeorge V. Neville-Neil.Xr getservbyport 3
1506617cf57SGeorge V. Neville-Neilto be called with a second argument of
1516617cf57SGeorge V. Neville-Neil.Dq udp
1526617cf57SGeorge V. Neville-Neilinstead of its default of
1536617cf57SGeorge V. Neville-Neil.Dq tcp .
1546617cf57SGeorge V. Neville-NeilThis is required for the few ports (512\-514) that have different services
1556617cf57SGeorge V. Neville-Neilfor
1566617cf57SGeorge V. Neville-Neil.Tn UDP
1576617cf57SGeorge V. Neville-Neiland
1586617cf57SGeorge V. Neville-Neil.Tn TCP .
1596617cf57SGeorge V. Neville-Neil.El
1606617cf57SGeorge V. Neville-Neil.Pp
1616617cf57SGeorge V. Neville-NeilThis implementation allows numeric IPv6 address notation with scope identifier,
16262101061SEitan Adleras documented in chapter 11 of RFC 4007.
1636617cf57SGeorge V. Neville-NeilIPv6 link-local address will appear as a string like
1646617cf57SGeorge V. Neville-Neil.Dq Li fe80::1%ne0 .
1656617cf57SGeorge V. Neville-NeilRefer to
1666617cf57SGeorge V. Neville-Neil.Xr getaddrinfo 3
1676617cf57SGeorge V. Neville-Neilfor more information.
1686617cf57SGeorge V. Neville-Neil.Sh RETURN VALUES
1696617cf57SGeorge V. Neville-Neil.Fn getnameinfo
1706617cf57SGeorge V. Neville-Neilreturns zero on success or one of the error codes listed in
1716617cf57SGeorge V. Neville-Neil.Xr gai_strerror 3
1726617cf57SGeorge V. Neville-Neilif an error occurs.
1736617cf57SGeorge V. Neville-Neil.Sh EXAMPLES
1746617cf57SGeorge V. Neville-NeilThe following code tries to get a numeric host name, and service name,
1756617cf57SGeorge V. Neville-Neilfor a given socket address.
1766617cf57SGeorge V. Neville-NeilObserve that there is no hardcoded reference to a particular address family.
1776617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent
1786617cf57SGeorge V. Neville-Neilstruct sockaddr *sa;	/* input */
1796617cf57SGeorge V. Neville-Neilchar hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
1806617cf57SGeorge V. Neville-Neil
1816617cf57SGeorge V. Neville-Neilif (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), sbuf,
1826617cf57SGeorge V. Neville-Neil    sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) {
1836617cf57SGeorge V. Neville-Neil	errx(1, "could not get numeric hostname");
1846617cf57SGeorge V. Neville-Neil	/* NOTREACHED */
1856617cf57SGeorge V. Neville-Neil}
1866617cf57SGeorge V. Neville-Neilprintf("host=%s, serv=%s\en", hbuf, sbuf);
1876617cf57SGeorge V. Neville-Neil.Ed
1886617cf57SGeorge V. Neville-Neil.Pp
1896617cf57SGeorge V. Neville-NeilThe following version checks if the socket address has a reverse address mapping:
1906617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent
1916617cf57SGeorge V. Neville-Neilstruct sockaddr *sa;	/* input */
1926617cf57SGeorge V. Neville-Neilchar hbuf[NI_MAXHOST];
1936617cf57SGeorge V. Neville-Neil
1946617cf57SGeorge V. Neville-Neilif (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), NULL, 0,
1956617cf57SGeorge V. Neville-Neil    NI_NAMEREQD)) {
1966617cf57SGeorge V. Neville-Neil	errx(1, "could not resolve hostname");
1976617cf57SGeorge V. Neville-Neil	/* NOTREACHED */
1986617cf57SGeorge V. Neville-Neil}
1996617cf57SGeorge V. Neville-Neilprintf("host=%s\en", hbuf);
2006617cf57SGeorge V. Neville-Neil.Ed
2016617cf57SGeorge V. Neville-Neil.Sh SEE ALSO
2026617cf57SGeorge V. Neville-Neil.Xr gai_strerror 3 ,
2036617cf57SGeorge V. Neville-Neil.Xr getaddrinfo 3 ,
2046617cf57SGeorge V. Neville-Neil.Xr gethostbyaddr 3 ,
2056617cf57SGeorge V. Neville-Neil.Xr getservbyport 3 ,
2066617cf57SGeorge V. Neville-Neil.Xr inet_ntop 3 ,
207160a2e55SBruce M Simpson.Xr link_ntoa 3 ,
2086617cf57SGeorge V. Neville-Neil.Xr resolver 3 ,
209bb957021SHiroki Sato.Xr inet 4 ,
210bb957021SHiroki Sato.Xr inet6 4 ,
211bb957021SHiroki Sato.Xr unix 4 ,
2126617cf57SGeorge V. Neville-Neil.Xr hosts 5 ,
2136617cf57SGeorge V. Neville-Neil.Xr resolv.conf 5 ,
2146617cf57SGeorge V. Neville-Neil.Xr services 5 ,
215*942e234dSFernando Apesteguía.Xr hostname 7
2166617cf57SGeorge V. Neville-Neil.Rs
2176617cf57SGeorge V. Neville-Neil.%A R. Gilligan
2186617cf57SGeorge V. Neville-Neil.%A S. Thomson
2196617cf57SGeorge V. Neville-Neil.%A J. Bound
2204e4f91b8SHiroki Sato.%A J. McCann
2216617cf57SGeorge V. Neville-Neil.%A W. Stevens
2226617cf57SGeorge V. Neville-Neil.%T Basic Socket Interface Extensions for IPv6
2234e4f91b8SHiroki Sato.%R RFC 3493
2244e4f91b8SHiroki Sato.%D February 2003
2256617cf57SGeorge V. Neville-Neil.Re
2266617cf57SGeorge V. Neville-Neil.Rs
2276617cf57SGeorge V. Neville-Neil.%A S. Deering
2286617cf57SGeorge V. Neville-Neil.%A B. Haberman
2296617cf57SGeorge V. Neville-Neil.%A T. Jinmei
2306617cf57SGeorge V. Neville-Neil.%A E. Nordmark
2316617cf57SGeorge V. Neville-Neil.%A B. Zill
2326617cf57SGeorge V. Neville-Neil.%T "IPv6 Scoped Address Architecture"
2334e4f91b8SHiroki Sato.%R RFC 4007
2344e4f91b8SHiroki Sato.%D March 2005
2356617cf57SGeorge V. Neville-Neil.Re
2366617cf57SGeorge V. Neville-Neil.Rs
2376617cf57SGeorge V. Neville-Neil.%A Craig Metz
2386617cf57SGeorge V. Neville-Neil.%T Protocol Independence Using the Sockets API
2396617cf57SGeorge V. Neville-Neil.%B "Proceedings of the freenix track: 2000 USENIX annual technical conference"
2406617cf57SGeorge V. Neville-Neil.%D June 2000
2416617cf57SGeorge V. Neville-Neil.Re
2426617cf57SGeorge V. Neville-Neil.Sh STANDARDS
2436617cf57SGeorge V. Neville-NeilThe
2446617cf57SGeorge V. Neville-Neil.Fn getnameinfo
2456617cf57SGeorge V. Neville-Neilfunction is defined by the
2464e4f91b8SHiroki Sato.St -p1003.1-2004
2474e4f91b8SHiroki Satospecification and documented in
2484e4f91b8SHiroki Sato.Tn "RFC 3493" ,
2496617cf57SGeorge V. Neville-Neil.Dq Basic Socket Interface Extensions for IPv6 .
2506617cf57SGeorge V. Neville-Neil.Sh CAVEATS
2516617cf57SGeorge V. Neville-Neil.Fn getnameinfo
2526617cf57SGeorge V. Neville-Neilcan return both numeric and FQDN forms of the address specified in
2536617cf57SGeorge V. Neville-Neil.Fa sa .
2546617cf57SGeorge V. Neville-NeilThere is no return value that indicates whether the string returned in
2556617cf57SGeorge V. Neville-Neil.Fa host
2566617cf57SGeorge V. Neville-Neilis a result of binary to numeric-text translation (like
2576617cf57SGeorge V. Neville-Neil.Xr inet_ntop 3 ) ,
2586617cf57SGeorge V. Neville-Neilor is the result of a DNS reverse lookup.
2596617cf57SGeorge V. Neville-NeilBecause of this, malicious parties could set up a PTR record as follows:
2606617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent
2616617cf57SGeorge V. Neville-Neil1.0.0.127.in-addr.arpa. IN PTR  10.1.1.1
2626617cf57SGeorge V. Neville-Neil.Ed
2636617cf57SGeorge V. Neville-Neil.Pp
2646617cf57SGeorge V. Neville-Neiland trick the caller of
2656617cf57SGeorge V. Neville-Neil.Fn getnameinfo
2666617cf57SGeorge V. Neville-Neilinto believing that
2676617cf57SGeorge V. Neville-Neil.Fa sa
2686617cf57SGeorge V. Neville-Neilis
2696617cf57SGeorge V. Neville-Neil.Li 10.1.1.1
2706617cf57SGeorge V. Neville-Neilwhen it is actually
2716617cf57SGeorge V. Neville-Neil.Li 127.0.0.1 .
2726617cf57SGeorge V. Neville-Neil.Pp
2736617cf57SGeorge V. Neville-NeilTo prevent such attacks, the use of
2746617cf57SGeorge V. Neville-Neil.Dv NI_NAMEREQD
2756617cf57SGeorge V. Neville-Neilis recommended when the result of
2766617cf57SGeorge V. Neville-Neil.Fn getnameinfo
2776617cf57SGeorge V. Neville-Neilis used
2786617cf57SGeorge V. Neville-Neilfor access control purposes:
2796617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent
2806617cf57SGeorge V. Neville-Neilstruct sockaddr *sa;
2816617cf57SGeorge V. Neville-Neilsocklen_t salen;
2826617cf57SGeorge V. Neville-Neilchar addr[NI_MAXHOST];
2836617cf57SGeorge V. Neville-Neilstruct addrinfo hints, *res;
2846617cf57SGeorge V. Neville-Neilint error;
2856617cf57SGeorge V. Neville-Neil
2866617cf57SGeorge V. Neville-Neilerror = getnameinfo(sa, salen, addr, sizeof(addr),
2876617cf57SGeorge V. Neville-Neil    NULL, 0, NI_NAMEREQD);
2886617cf57SGeorge V. Neville-Neilif (error == 0) {
2896617cf57SGeorge V. Neville-Neil	memset(&hints, 0, sizeof(hints));
2906617cf57SGeorge V. Neville-Neil	hints.ai_socktype = SOCK_DGRAM;	/*dummy*/
2916617cf57SGeorge V. Neville-Neil	hints.ai_flags = AI_NUMERICHOST;
2926617cf57SGeorge V. Neville-Neil	if (getaddrinfo(addr, "0", &hints, &res) == 0) {
2936617cf57SGeorge V. Neville-Neil		/* malicious PTR record */
2946617cf57SGeorge V. Neville-Neil		freeaddrinfo(res);
2956617cf57SGeorge V. Neville-Neil		printf("bogus PTR record\en");
2966617cf57SGeorge V. Neville-Neil		return -1;
2976617cf57SGeorge V. Neville-Neil	}
2986617cf57SGeorge V. Neville-Neil	/* addr is FQDN as a result of PTR lookup */
2996617cf57SGeorge V. Neville-Neil} else {
3006617cf57SGeorge V. Neville-Neil	/* addr is numeric string */
3016617cf57SGeorge V. Neville-Neil	error = getnameinfo(sa, salen, addr, sizeof(addr),
3026617cf57SGeorge V. Neville-Neil	    NULL, 0, NI_NUMERICHOST);
3036617cf57SGeorge V. Neville-Neil}
3046617cf57SGeorge V. Neville-Neil.Ed
3056617cf57SGeorge V. Neville-Neil.\".Pp
3066617cf57SGeorge V. Neville-Neil.\".Ox
3076617cf57SGeorge V. Neville-Neil.\"intentionally uses a different
3086617cf57SGeorge V. Neville-Neil.\".Dv NI_MAXHOST
3096617cf57SGeorge V. Neville-Neil.\"value from what
3106617cf57SGeorge V. Neville-Neil.\".Tn "RFC 2553"
3116617cf57SGeorge V. Neville-Neil.\"suggests, to avoid buffer length handling mistakes.
312