xref: /freebsd/lib/libc/net/getnameinfo.3 (revision fa9896e0)
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.\"
194a3c598fSFernando Apesteguía.Dd June 27, 2022
206617cf57SGeorge V. Neville-Neil.Dt GETNAMEINFO 3
216617cf57SGeorge V. Neville-Neil.Os
226617cf57SGeorge V. Neville-Neil.Sh NAME
236617cf57SGeorge V. Neville-Neil.Nm getnameinfo
246617cf57SGeorge V. Neville-Neil.Nd socket address structure to hostname and service name
256617cf57SGeorge V. Neville-Neil.Sh SYNOPSIS
26580dbd65SJoel Dahl.In sys/types.h
27580dbd65SJoel Dahl.In sys/socket.h
28580dbd65SJoel Dahl.In netdb.h
296617cf57SGeorge V. Neville-Neil.Ft int
30f789cb82SRuslan Ermilov.Fo getnameinfo
31f789cb82SRuslan Ermilov.Fa "const struct sockaddr *sa" "socklen_t salen" "char *host"
32f789cb82SRuslan Ermilov.Fa "size_t hostlen" "char *serv" "size_t servlen" "int flags"
33f789cb82SRuslan Ermilov.Fc
346617cf57SGeorge V. Neville-Neil.Sh DESCRIPTION
356617cf57SGeorge V. Neville-NeilThe
366617cf57SGeorge V. Neville-Neil.Fn getnameinfo
376617cf57SGeorge V. Neville-Neilfunction is used to convert a
386617cf57SGeorge V. Neville-Neil.Li sockaddr
396617cf57SGeorge V. Neville-Neilstructure to a pair of host name and service strings.
406617cf57SGeorge V. Neville-NeilIt is a replacement for and provides more flexibility than the
416617cf57SGeorge V. Neville-Neil.Xr gethostbyaddr 3
426617cf57SGeorge V. Neville-Neiland
436617cf57SGeorge V. Neville-Neil.Xr getservbyport 3
446617cf57SGeorge V. Neville-Neilfunctions and is the converse of the
456617cf57SGeorge V. Neville-Neil.Xr getaddrinfo 3
466617cf57SGeorge V. Neville-Neilfunction.
476617cf57SGeorge V. Neville-Neil.Pp
48bb957021SHiroki SatoIf a link-layer address or UNIX-domain address is passed to
49160a2e55SBruce M Simpson.Fn getnameinfo ,
50160a2e55SBruce M Simpsonits ASCII representation will be stored in
51160a2e55SBruce M Simpson.Fa host .
52160a2e55SBruce M SimpsonThe string pointed to by
53160a2e55SBruce M Simpson.Fa serv
54160a2e55SBruce M Simpsonwill be set to the empty string if non-NULL;
55160a2e55SBruce M Simpson.Fa flags
56160a2e55SBruce M Simpsonwill always be ignored.
57bb957021SHiroki SatoFor a link-layer address,
58bb957021SHiroki Satothis can be used as a replacement of the legacy
59160a2e55SBruce M Simpson.Xr link_ntoa 3
60160a2e55SBruce M Simpsonfunction.
61160a2e55SBruce M Simpson.Pp
626617cf57SGeorge V. Neville-NeilThe
636617cf57SGeorge V. Neville-Neil.Li sockaddr
646617cf57SGeorge V. Neville-Neilstructure
656617cf57SGeorge V. Neville-Neil.Fa sa
666617cf57SGeorge V. Neville-Neilshould point to either a
67160a2e55SBruce M Simpson.Li sockaddr_in ,
68bb957021SHiroki Sato.Li sockaddr_in6 ,
69bb957021SHiroki Sato.Li sockaddr_dl ,
70160a2e55SBruce M Simpsonor
71bb957021SHiroki Sato.Li sockaddr_un
72bb957021SHiroki Satostructure
73bb957021SHiroki Sato.Po for IPv4 ,
74bb957021SHiroki SatoIPv6,
75bb957021SHiroki Satolink-layer,
76bb957021SHiroki Satoor UNIX-domain respectively
77bb957021SHiroki Sato.Pc
78bb957021SHiroki Satothat is
796617cf57SGeorge V. Neville-Neil.Fa salen
806617cf57SGeorge V. Neville-Neilbytes long.
8120d96999SHiroki SatoIf
8220d96999SHiroki Sato.Fa salen
8320d96999SHiroki Satois shorter than the length corresponding to the specified
8420d96999SHiroki Satoaddress family or longer than
8520d96999SHiroki Sato.Fn sizeof "struct sockaddr_storage" ,
8620d96999SHiroki Satoit returns
8720d96999SHiroki Sato.Er EAI_FAMILY .
8820d96999SHiroki SatoNote that
8920d96999SHiroki Sato.Va sa->sa_len
9020d96999SHiroki Satoshould be consistent with
9120d96999SHiroki Sato.Fa salen
9220d96999SHiroki Satothough the value of
9320d96999SHiroki Sato.Va sa->sa_len
9420d96999SHiroki Satois not directly used in this function.
956617cf57SGeorge V. Neville-Neil.Pp
966617cf57SGeorge V. Neville-NeilThe host and service names associated with
976617cf57SGeorge V. Neville-Neil.Fa sa
986617cf57SGeorge V. Neville-Neilare stored in
996617cf57SGeorge V. Neville-Neil.Fa host
1006617cf57SGeorge V. Neville-Neiland
1016617cf57SGeorge V. Neville-Neil.Fa serv
1026617cf57SGeorge V. Neville-Neilwhich have length parameters
1036617cf57SGeorge V. Neville-Neil.Fa hostlen
1046617cf57SGeorge V. Neville-Neiland
1056617cf57SGeorge V. Neville-Neil.Fa servlen .
1066617cf57SGeorge V. Neville-NeilThe maximum value for
1076617cf57SGeorge V. Neville-Neil.Fa hostlen
1086617cf57SGeorge V. Neville-Neilis
1096617cf57SGeorge V. Neville-Neil.Dv NI_MAXHOST
1106617cf57SGeorge V. Neville-Neiland
1116617cf57SGeorge V. Neville-Neilthe maximum value for
1126617cf57SGeorge V. Neville-Neil.Fa servlen
1136617cf57SGeorge V. Neville-Neilis
1146617cf57SGeorge V. Neville-Neil.Dv NI_MAXSERV ,
1156617cf57SGeorge V. Neville-Neilas defined by
1166617cf57SGeorge V. Neville-Neil.Aq Pa netdb.h .
1176617cf57SGeorge V. Neville-NeilIf a length parameter is zero, no string will be stored.
1186617cf57SGeorge V. Neville-NeilOtherwise, enough space must be provided to store the
1196617cf57SGeorge V. Neville-Neilhost name or service string plus a byte for the NUL terminator.
1206617cf57SGeorge V. Neville-Neil.Pp
1216617cf57SGeorge V. Neville-NeilThe
1226617cf57SGeorge V. Neville-Neil.Fa flags
1236617cf57SGeorge V. Neville-Neilargument is formed by
1246617cf57SGeorge V. Neville-Neil.Tn OR Ns 'ing
1256617cf57SGeorge V. Neville-Neilthe following values:
126b4a395a4SEd Schouten.Bl -tag -width "NI_NUMERICSCOPEXX"
1276617cf57SGeorge V. Neville-Neil.It Dv NI_NOFQDN
1286617cf57SGeorge V. Neville-NeilA fully qualified domain name is not required for local hosts.
1296617cf57SGeorge V. Neville-NeilThe local part of the fully qualified domain name is returned instead.
1306617cf57SGeorge V. Neville-Neil.It Dv NI_NUMERICHOST
1316617cf57SGeorge V. Neville-NeilReturn the address in numeric form, as if calling
1326617cf57SGeorge V. Neville-Neil.Xr inet_ntop 3 ,
1336617cf57SGeorge V. Neville-Neilinstead of a host name.
1346617cf57SGeorge V. Neville-Neil.It Dv NI_NAMEREQD
1356617cf57SGeorge V. Neville-NeilA name is required.
1366617cf57SGeorge V. Neville-NeilIf the host name cannot be found in DNS and this flag is set,
1376617cf57SGeorge V. Neville-Neila non-zero error code is returned.
1386617cf57SGeorge V. Neville-NeilIf the host name is not found and the flag is not set, the
1396617cf57SGeorge V. Neville-Neiladdress is returned in numeric form.
1406617cf57SGeorge V. Neville-Neil.It NI_NUMERICSERV
1416617cf57SGeorge V. Neville-NeilThe service name is returned as a digit string representing the port number.
142b4a395a4SEd Schouten.It NI_NUMERICSCOPE
143b4a395a4SEd SchoutenThe scope identifier is returned as a digit string.
1446617cf57SGeorge V. Neville-Neil.It NI_DGRAM
1456617cf57SGeorge V. Neville-NeilSpecifies that the service being looked up is a datagram
1466617cf57SGeorge V. Neville-Neilservice, and causes
1476617cf57SGeorge V. Neville-Neil.Xr getservbyport 3
1486617cf57SGeorge V. Neville-Neilto be called with a second argument of
1496617cf57SGeorge V. Neville-Neil.Dq udp
1506617cf57SGeorge V. Neville-Neilinstead of its default of
1516617cf57SGeorge V. Neville-Neil.Dq tcp .
1526617cf57SGeorge V. Neville-NeilThis is required for the few ports (512\-514) that have different services
1536617cf57SGeorge V. Neville-Neilfor
1546617cf57SGeorge V. Neville-Neil.Tn UDP
1556617cf57SGeorge V. Neville-Neiland
1566617cf57SGeorge V. Neville-Neil.Tn TCP .
1576617cf57SGeorge V. Neville-Neil.El
1586617cf57SGeorge V. Neville-Neil.Pp
1596617cf57SGeorge V. Neville-NeilThis implementation allows numeric IPv6 address notation with scope identifier,
16062101061SEitan Adleras documented in chapter 11 of RFC 4007.
1616617cf57SGeorge V. Neville-NeilIPv6 link-local address will appear as a string like
1626617cf57SGeorge V. Neville-Neil.Dq Li fe80::1%ne0 .
1636617cf57SGeorge V. Neville-NeilRefer to
1646617cf57SGeorge V. Neville-Neil.Xr getaddrinfo 3
1656617cf57SGeorge V. Neville-Neilfor more information.
1666617cf57SGeorge V. Neville-Neil.Sh RETURN VALUES
1676617cf57SGeorge V. Neville-Neil.Fn getnameinfo
1686617cf57SGeorge V. Neville-Neilreturns zero on success or one of the error codes listed in
1696617cf57SGeorge V. Neville-Neil.Xr gai_strerror 3
1706617cf57SGeorge V. Neville-Neilif an error occurs.
1716617cf57SGeorge V. Neville-Neil.Sh EXAMPLES
1726617cf57SGeorge V. Neville-NeilThe following code tries to get a numeric host name, and service name,
1736617cf57SGeorge V. Neville-Neilfor a given socket address.
1746617cf57SGeorge V. Neville-NeilObserve that there is no hardcoded reference to a particular address family.
1756617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent
1766617cf57SGeorge V. Neville-Neilstruct sockaddr *sa;	/* input */
1776617cf57SGeorge V. Neville-Neilchar hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
1786617cf57SGeorge V. Neville-Neil
1796617cf57SGeorge V. Neville-Neilif (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), sbuf,
1806617cf57SGeorge V. Neville-Neil    sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) {
1816617cf57SGeorge V. Neville-Neil	errx(1, "could not get numeric hostname");
1826617cf57SGeorge V. Neville-Neil	/* NOTREACHED */
1836617cf57SGeorge V. Neville-Neil}
1846617cf57SGeorge V. Neville-Neilprintf("host=%s, serv=%s\en", hbuf, sbuf);
1856617cf57SGeorge V. Neville-Neil.Ed
1866617cf57SGeorge V. Neville-Neil.Pp
1876617cf57SGeorge V. Neville-NeilThe following version checks if the socket address has a reverse address mapping:
1886617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent
1896617cf57SGeorge V. Neville-Neilstruct sockaddr *sa;	/* input */
1906617cf57SGeorge V. Neville-Neilchar hbuf[NI_MAXHOST];
1916617cf57SGeorge V. Neville-Neil
1926617cf57SGeorge V. Neville-Neilif (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), NULL, 0,
1936617cf57SGeorge V. Neville-Neil    NI_NAMEREQD)) {
1946617cf57SGeorge V. Neville-Neil	errx(1, "could not resolve hostname");
1956617cf57SGeorge V. Neville-Neil	/* NOTREACHED */
1966617cf57SGeorge V. Neville-Neil}
1976617cf57SGeorge V. Neville-Neilprintf("host=%s\en", hbuf);
1986617cf57SGeorge V. Neville-Neil.Ed
1996617cf57SGeorge V. Neville-Neil.Sh SEE ALSO
2006617cf57SGeorge V. Neville-Neil.Xr gai_strerror 3 ,
2016617cf57SGeorge V. Neville-Neil.Xr getaddrinfo 3 ,
2026617cf57SGeorge V. Neville-Neil.Xr gethostbyaddr 3 ,
2036617cf57SGeorge V. Neville-Neil.Xr getservbyport 3 ,
2046617cf57SGeorge V. Neville-Neil.Xr inet_ntop 3 ,
205160a2e55SBruce M Simpson.Xr link_ntoa 3 ,
2066617cf57SGeorge V. Neville-Neil.Xr resolver 3 ,
207bb957021SHiroki Sato.Xr inet 4 ,
208bb957021SHiroki Sato.Xr inet6 4 ,
209bb957021SHiroki Sato.Xr unix 4 ,
2106617cf57SGeorge V. Neville-Neil.Xr hosts 5 ,
2116617cf57SGeorge V. Neville-Neil.Xr resolv.conf 5 ,
2126617cf57SGeorge V. Neville-Neil.Xr services 5 ,
213942e234dSFernando Apesteguía.Xr hostname 7
2146617cf57SGeorge V. Neville-Neil.Rs
2156617cf57SGeorge V. Neville-Neil.%A R. Gilligan
2166617cf57SGeorge V. Neville-Neil.%A S. Thomson
2176617cf57SGeorge V. Neville-Neil.%A J. Bound
2184e4f91b8SHiroki Sato.%A J. McCann
2196617cf57SGeorge V. Neville-Neil.%A W. Stevens
2206617cf57SGeorge V. Neville-Neil.%T Basic Socket Interface Extensions for IPv6
2214e4f91b8SHiroki Sato.%R RFC 3493
2224e4f91b8SHiroki Sato.%D February 2003
2236617cf57SGeorge V. Neville-Neil.Re
2246617cf57SGeorge V. Neville-Neil.Rs
2256617cf57SGeorge V. Neville-Neil.%A S. Deering
2266617cf57SGeorge V. Neville-Neil.%A B. Haberman
2276617cf57SGeorge V. Neville-Neil.%A T. Jinmei
2286617cf57SGeorge V. Neville-Neil.%A E. Nordmark
2296617cf57SGeorge V. Neville-Neil.%A B. Zill
2306617cf57SGeorge V. Neville-Neil.%T "IPv6 Scoped Address Architecture"
2314e4f91b8SHiroki Sato.%R RFC 4007
2324e4f91b8SHiroki Sato.%D March 2005
2336617cf57SGeorge V. Neville-Neil.Re
2346617cf57SGeorge V. Neville-Neil.Rs
2356617cf57SGeorge V. Neville-Neil.%A Craig Metz
2366617cf57SGeorge V. Neville-Neil.%T Protocol Independence Using the Sockets API
2376617cf57SGeorge V. Neville-Neil.%B "Proceedings of the freenix track: 2000 USENIX annual technical conference"
2386617cf57SGeorge V. Neville-Neil.%D June 2000
2396617cf57SGeorge V. Neville-Neil.Re
2406617cf57SGeorge V. Neville-Neil.Sh STANDARDS
2416617cf57SGeorge V. Neville-NeilThe
2426617cf57SGeorge V. Neville-Neil.Fn getnameinfo
2436617cf57SGeorge V. Neville-Neilfunction is defined by the
2444e4f91b8SHiroki Sato.St -p1003.1-2004
2454e4f91b8SHiroki Satospecification and documented in
2464e4f91b8SHiroki Sato.Tn "RFC 3493" ,
2476617cf57SGeorge V. Neville-Neil.Dq Basic Socket Interface Extensions for IPv6 .
2486617cf57SGeorge V. Neville-Neil.Sh CAVEATS
2496617cf57SGeorge V. Neville-Neil.Fn getnameinfo
2506617cf57SGeorge V. Neville-Neilcan return both numeric and FQDN forms of the address specified in
2516617cf57SGeorge V. Neville-Neil.Fa sa .
2526617cf57SGeorge V. Neville-NeilThere is no return value that indicates whether the string returned in
2536617cf57SGeorge V. Neville-Neil.Fa host
2546617cf57SGeorge V. Neville-Neilis a result of binary to numeric-text translation (like
2556617cf57SGeorge V. Neville-Neil.Xr inet_ntop 3 ) ,
2566617cf57SGeorge V. Neville-Neilor is the result of a DNS reverse lookup.
2576617cf57SGeorge V. Neville-NeilBecause of this, malicious parties could set up a PTR record as follows:
2586617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent
2596617cf57SGeorge V. Neville-Neil1.0.0.127.in-addr.arpa. IN PTR  10.1.1.1
2606617cf57SGeorge V. Neville-Neil.Ed
2616617cf57SGeorge V. Neville-Neil.Pp
2626617cf57SGeorge V. Neville-Neiland trick the caller of
2636617cf57SGeorge V. Neville-Neil.Fn getnameinfo
2646617cf57SGeorge V. Neville-Neilinto believing that
2656617cf57SGeorge V. Neville-Neil.Fa sa
2666617cf57SGeorge V. Neville-Neilis
2676617cf57SGeorge V. Neville-Neil.Li 10.1.1.1
2686617cf57SGeorge V. Neville-Neilwhen it is actually
2696617cf57SGeorge V. Neville-Neil.Li 127.0.0.1 .
2706617cf57SGeorge V. Neville-Neil.Pp
2716617cf57SGeorge V. Neville-NeilTo prevent such attacks, the use of
2726617cf57SGeorge V. Neville-Neil.Dv NI_NAMEREQD
2736617cf57SGeorge V. Neville-Neilis recommended when the result of
2746617cf57SGeorge V. Neville-Neil.Fn getnameinfo
2756617cf57SGeorge V. Neville-Neilis used
2766617cf57SGeorge V. Neville-Neilfor access control purposes:
2776617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent
2786617cf57SGeorge V. Neville-Neilstruct sockaddr *sa;
2796617cf57SGeorge V. Neville-Neilsocklen_t salen;
2806617cf57SGeorge V. Neville-Neilchar addr[NI_MAXHOST];
2816617cf57SGeorge V. Neville-Neilstruct addrinfo hints, *res;
2826617cf57SGeorge V. Neville-Neilint error;
2836617cf57SGeorge V. Neville-Neil
2846617cf57SGeorge V. Neville-Neilerror = getnameinfo(sa, salen, addr, sizeof(addr),
2856617cf57SGeorge V. Neville-Neil    NULL, 0, NI_NAMEREQD);
2866617cf57SGeorge V. Neville-Neilif (error == 0) {
2876617cf57SGeorge V. Neville-Neil	memset(&hints, 0, sizeof(hints));
2886617cf57SGeorge V. Neville-Neil	hints.ai_socktype = SOCK_DGRAM;	/*dummy*/
2896617cf57SGeorge V. Neville-Neil	hints.ai_flags = AI_NUMERICHOST;
2906617cf57SGeorge V. Neville-Neil	if (getaddrinfo(addr, "0", &hints, &res) == 0) {
2916617cf57SGeorge V. Neville-Neil		/* malicious PTR record */
2926617cf57SGeorge V. Neville-Neil		freeaddrinfo(res);
2936617cf57SGeorge V. Neville-Neil		printf("bogus PTR record\en");
2946617cf57SGeorge V. Neville-Neil		return -1;
2956617cf57SGeorge V. Neville-Neil	}
2966617cf57SGeorge V. Neville-Neil	/* addr is FQDN as a result of PTR lookup */
2976617cf57SGeorge V. Neville-Neil} else {
2986617cf57SGeorge V. Neville-Neil	/* addr is numeric string */
2996617cf57SGeorge V. Neville-Neil	error = getnameinfo(sa, salen, addr, sizeof(addr),
3006617cf57SGeorge V. Neville-Neil	    NULL, 0, NI_NUMERICHOST);
3016617cf57SGeorge V. Neville-Neil}
3026617cf57SGeorge V. Neville-Neil.Ed
3036617cf57SGeorge V. Neville-Neil.\".Pp
3046617cf57SGeorge V. Neville-Neil.\".Ox
3056617cf57SGeorge V. Neville-Neil.\"intentionally uses a different
3066617cf57SGeorge V. Neville-Neil.\".Dv NI_MAXHOST
3076617cf57SGeorge V. Neville-Neil.\"value from what
3086617cf57SGeorge V. Neville-Neil.\".Tn "RFC 2553"
3096617cf57SGeorge V. Neville-Neil.\"suggests, to avoid buffer length handling mistakes.
310