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.\" 19*4a3c598fSFernando 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