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.\" 21*b4a395a4SEd Schouten.Dd July 28, 2016 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. 836617cf57SGeorge V. Neville-Neil.Pp 846617cf57SGeorge V. Neville-NeilThe host and service names associated with 856617cf57SGeorge V. Neville-Neil.Fa sa 866617cf57SGeorge V. Neville-Neilare stored in 876617cf57SGeorge V. Neville-Neil.Fa host 886617cf57SGeorge V. Neville-Neiland 896617cf57SGeorge V. Neville-Neil.Fa serv 906617cf57SGeorge V. Neville-Neilwhich have length parameters 916617cf57SGeorge V. Neville-Neil.Fa hostlen 926617cf57SGeorge V. Neville-Neiland 936617cf57SGeorge V. Neville-Neil.Fa servlen . 946617cf57SGeorge V. Neville-NeilThe maximum value for 956617cf57SGeorge V. Neville-Neil.Fa hostlen 966617cf57SGeorge V. Neville-Neilis 976617cf57SGeorge V. Neville-Neil.Dv NI_MAXHOST 986617cf57SGeorge V. Neville-Neiland 996617cf57SGeorge V. Neville-Neilthe maximum value for 1006617cf57SGeorge V. Neville-Neil.Fa servlen 1016617cf57SGeorge V. Neville-Neilis 1026617cf57SGeorge V. Neville-Neil.Dv NI_MAXSERV , 1036617cf57SGeorge V. Neville-Neilas defined by 1046617cf57SGeorge V. Neville-Neil.Aq Pa netdb.h . 1056617cf57SGeorge V. Neville-NeilIf a length parameter is zero, no string will be stored. 1066617cf57SGeorge V. Neville-NeilOtherwise, enough space must be provided to store the 1076617cf57SGeorge V. Neville-Neilhost name or service string plus a byte for the NUL terminator. 1086617cf57SGeorge V. Neville-Neil.Pp 1096617cf57SGeorge V. Neville-NeilThe 1106617cf57SGeorge V. Neville-Neil.Fa flags 1116617cf57SGeorge V. Neville-Neilargument is formed by 1126617cf57SGeorge V. Neville-Neil.Tn OR Ns 'ing 1136617cf57SGeorge V. Neville-Neilthe following values: 114*b4a395a4SEd Schouten.Bl -tag -width "NI_NUMERICSCOPEXX" 1156617cf57SGeorge V. Neville-Neil.It Dv NI_NOFQDN 1166617cf57SGeorge V. Neville-NeilA fully qualified domain name is not required for local hosts. 1176617cf57SGeorge V. Neville-NeilThe local part of the fully qualified domain name is returned instead. 1186617cf57SGeorge V. Neville-Neil.It Dv NI_NUMERICHOST 1196617cf57SGeorge V. Neville-NeilReturn the address in numeric form, as if calling 1206617cf57SGeorge V. Neville-Neil.Xr inet_ntop 3 , 1216617cf57SGeorge V. Neville-Neilinstead of a host name. 1226617cf57SGeorge V. Neville-Neil.It Dv NI_NAMEREQD 1236617cf57SGeorge V. Neville-NeilA name is required. 1246617cf57SGeorge V. Neville-NeilIf the host name cannot be found in DNS and this flag is set, 1256617cf57SGeorge V. Neville-Neila non-zero error code is returned. 1266617cf57SGeorge V. Neville-NeilIf the host name is not found and the flag is not set, the 1276617cf57SGeorge V. Neville-Neiladdress is returned in numeric form. 1286617cf57SGeorge V. Neville-Neil.It NI_NUMERICSERV 1296617cf57SGeorge V. Neville-NeilThe service name is returned as a digit string representing the port number. 130*b4a395a4SEd Schouten.It NI_NUMERICSCOPE 131*b4a395a4SEd SchoutenThe scope identifier is returned as a digit string. 1326617cf57SGeorge V. Neville-Neil.It NI_DGRAM 1336617cf57SGeorge V. Neville-NeilSpecifies that the service being looked up is a datagram 1346617cf57SGeorge V. Neville-Neilservice, and causes 1356617cf57SGeorge V. Neville-Neil.Xr getservbyport 3 1366617cf57SGeorge V. Neville-Neilto be called with a second argument of 1376617cf57SGeorge V. Neville-Neil.Dq udp 1386617cf57SGeorge V. Neville-Neilinstead of its default of 1396617cf57SGeorge V. Neville-Neil.Dq tcp . 1406617cf57SGeorge V. Neville-NeilThis is required for the few ports (512\-514) that have different services 1416617cf57SGeorge V. Neville-Neilfor 1426617cf57SGeorge V. Neville-Neil.Tn UDP 1436617cf57SGeorge V. Neville-Neiland 1446617cf57SGeorge V. Neville-Neil.Tn TCP . 1456617cf57SGeorge V. Neville-Neil.El 1466617cf57SGeorge V. Neville-Neil.Pp 1476617cf57SGeorge V. Neville-NeilThis implementation allows numeric IPv6 address notation with scope identifier, 14862101061SEitan Adleras documented in chapter 11 of RFC 4007. 1496617cf57SGeorge V. Neville-NeilIPv6 link-local address will appear as a string like 1506617cf57SGeorge V. Neville-Neil.Dq Li fe80::1%ne0 . 1516617cf57SGeorge V. Neville-NeilRefer to 1526617cf57SGeorge V. Neville-Neil.Xr getaddrinfo 3 1536617cf57SGeorge V. Neville-Neilfor more information. 1546617cf57SGeorge V. Neville-Neil.Sh RETURN VALUES 1556617cf57SGeorge V. Neville-Neil.Fn getnameinfo 1566617cf57SGeorge V. Neville-Neilreturns zero on success or one of the error codes listed in 1576617cf57SGeorge V. Neville-Neil.Xr gai_strerror 3 1586617cf57SGeorge V. Neville-Neilif an error occurs. 1596617cf57SGeorge V. Neville-Neil.Sh EXAMPLES 1606617cf57SGeorge V. Neville-NeilThe following code tries to get a numeric host name, and service name, 1616617cf57SGeorge V. Neville-Neilfor a given socket address. 1626617cf57SGeorge V. Neville-NeilObserve that there is no hardcoded reference to a particular address family. 1636617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent 1646617cf57SGeorge V. Neville-Neilstruct sockaddr *sa; /* input */ 1656617cf57SGeorge V. Neville-Neilchar hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; 1666617cf57SGeorge V. Neville-Neil 1676617cf57SGeorge V. Neville-Neilif (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), sbuf, 1686617cf57SGeorge V. Neville-Neil sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) { 1696617cf57SGeorge V. Neville-Neil errx(1, "could not get numeric hostname"); 1706617cf57SGeorge V. Neville-Neil /* NOTREACHED */ 1716617cf57SGeorge V. Neville-Neil} 1726617cf57SGeorge V. Neville-Neilprintf("host=%s, serv=%s\en", hbuf, sbuf); 1736617cf57SGeorge V. Neville-Neil.Ed 1746617cf57SGeorge V. Neville-Neil.Pp 1756617cf57SGeorge V. Neville-NeilThe following version checks if the socket address has a reverse address mapping: 1766617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent 1776617cf57SGeorge V. Neville-Neilstruct sockaddr *sa; /* input */ 1786617cf57SGeorge V. Neville-Neilchar hbuf[NI_MAXHOST]; 1796617cf57SGeorge V. Neville-Neil 1806617cf57SGeorge V. Neville-Neilif (getnameinfo(sa, sa->sa_len, hbuf, sizeof(hbuf), NULL, 0, 1816617cf57SGeorge V. Neville-Neil NI_NAMEREQD)) { 1826617cf57SGeorge V. Neville-Neil errx(1, "could not resolve hostname"); 1836617cf57SGeorge V. Neville-Neil /* NOTREACHED */ 1846617cf57SGeorge V. Neville-Neil} 1856617cf57SGeorge V. Neville-Neilprintf("host=%s\en", hbuf); 1866617cf57SGeorge V. Neville-Neil.Ed 1876617cf57SGeorge V. Neville-Neil.Sh SEE ALSO 1886617cf57SGeorge V. Neville-Neil.Xr gai_strerror 3 , 1896617cf57SGeorge V. Neville-Neil.Xr getaddrinfo 3 , 1906617cf57SGeorge V. Neville-Neil.Xr gethostbyaddr 3 , 1916617cf57SGeorge V. Neville-Neil.Xr getservbyport 3 , 1926617cf57SGeorge V. Neville-Neil.Xr inet_ntop 3 , 193160a2e55SBruce M Simpson.Xr link_ntoa 3 , 1946617cf57SGeorge V. Neville-Neil.Xr resolver 3 , 195bb957021SHiroki Sato.Xr inet 4 , 196bb957021SHiroki Sato.Xr inet6 4 , 197bb957021SHiroki Sato.Xr unix 4 , 1986617cf57SGeorge V. Neville-Neil.Xr hosts 5 , 1996617cf57SGeorge V. Neville-Neil.Xr resolv.conf 5 , 2006617cf57SGeorge V. Neville-Neil.Xr services 5 , 2016617cf57SGeorge V. Neville-Neil.Xr hostname 7 , 2026617cf57SGeorge V. Neville-Neil.Xr named 8 2036617cf57SGeorge V. Neville-Neil.Rs 2046617cf57SGeorge V. Neville-Neil.%A R. Gilligan 2056617cf57SGeorge V. Neville-Neil.%A S. Thomson 2066617cf57SGeorge V. Neville-Neil.%A J. Bound 2074e4f91b8SHiroki Sato.%A J. McCann 2086617cf57SGeorge V. Neville-Neil.%A W. Stevens 2096617cf57SGeorge V. Neville-Neil.%T Basic Socket Interface Extensions for IPv6 2104e4f91b8SHiroki Sato.%R RFC 3493 2114e4f91b8SHiroki Sato.%D February 2003 2126617cf57SGeorge V. Neville-Neil.Re 2136617cf57SGeorge V. Neville-Neil.Rs 2146617cf57SGeorge V. Neville-Neil.%A S. Deering 2156617cf57SGeorge V. Neville-Neil.%A B. Haberman 2166617cf57SGeorge V. Neville-Neil.%A T. Jinmei 2176617cf57SGeorge V. Neville-Neil.%A E. Nordmark 2186617cf57SGeorge V. Neville-Neil.%A B. Zill 2196617cf57SGeorge V. Neville-Neil.%T "IPv6 Scoped Address Architecture" 2204e4f91b8SHiroki Sato.%R RFC 4007 2214e4f91b8SHiroki Sato.%D March 2005 2226617cf57SGeorge V. Neville-Neil.Re 2236617cf57SGeorge V. Neville-Neil.Rs 2246617cf57SGeorge V. Neville-Neil.%A Craig Metz 2256617cf57SGeorge V. Neville-Neil.%T Protocol Independence Using the Sockets API 2266617cf57SGeorge V. Neville-Neil.%B "Proceedings of the freenix track: 2000 USENIX annual technical conference" 2276617cf57SGeorge V. Neville-Neil.%D June 2000 2286617cf57SGeorge V. Neville-Neil.Re 2296617cf57SGeorge V. Neville-Neil.Sh STANDARDS 2306617cf57SGeorge V. Neville-NeilThe 2316617cf57SGeorge V. Neville-Neil.Fn getnameinfo 2326617cf57SGeorge V. Neville-Neilfunction is defined by the 2334e4f91b8SHiroki Sato.St -p1003.1-2004 2344e4f91b8SHiroki Satospecification and documented in 2354e4f91b8SHiroki Sato.Tn "RFC 3493" , 2366617cf57SGeorge V. Neville-Neil.Dq Basic Socket Interface Extensions for IPv6 . 2376617cf57SGeorge V. Neville-Neil.Sh CAVEATS 2386617cf57SGeorge V. Neville-Neil.Fn getnameinfo 2396617cf57SGeorge V. Neville-Neilcan return both numeric and FQDN forms of the address specified in 2406617cf57SGeorge V. Neville-Neil.Fa sa . 2416617cf57SGeorge V. Neville-NeilThere is no return value that indicates whether the string returned in 2426617cf57SGeorge V. Neville-Neil.Fa host 2436617cf57SGeorge V. Neville-Neilis a result of binary to numeric-text translation (like 2446617cf57SGeorge V. Neville-Neil.Xr inet_ntop 3 ) , 2456617cf57SGeorge V. Neville-Neilor is the result of a DNS reverse lookup. 2466617cf57SGeorge V. Neville-NeilBecause of this, malicious parties could set up a PTR record as follows: 2476617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent 2486617cf57SGeorge V. Neville-Neil1.0.0.127.in-addr.arpa. IN PTR 10.1.1.1 2496617cf57SGeorge V. Neville-Neil.Ed 2506617cf57SGeorge V. Neville-Neil.Pp 2516617cf57SGeorge V. Neville-Neiland trick the caller of 2526617cf57SGeorge V. Neville-Neil.Fn getnameinfo 2536617cf57SGeorge V. Neville-Neilinto believing that 2546617cf57SGeorge V. Neville-Neil.Fa sa 2556617cf57SGeorge V. Neville-Neilis 2566617cf57SGeorge V. Neville-Neil.Li 10.1.1.1 2576617cf57SGeorge V. Neville-Neilwhen it is actually 2586617cf57SGeorge V. Neville-Neil.Li 127.0.0.1 . 2596617cf57SGeorge V. Neville-Neil.Pp 2606617cf57SGeorge V. Neville-NeilTo prevent such attacks, the use of 2616617cf57SGeorge V. Neville-Neil.Dv NI_NAMEREQD 2626617cf57SGeorge V. Neville-Neilis recommended when the result of 2636617cf57SGeorge V. Neville-Neil.Fn getnameinfo 2646617cf57SGeorge V. Neville-Neilis used 2656617cf57SGeorge V. Neville-Neilfor access control purposes: 2666617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent 2676617cf57SGeorge V. Neville-Neilstruct sockaddr *sa; 2686617cf57SGeorge V. Neville-Neilsocklen_t salen; 2696617cf57SGeorge V. Neville-Neilchar addr[NI_MAXHOST]; 2706617cf57SGeorge V. Neville-Neilstruct addrinfo hints, *res; 2716617cf57SGeorge V. Neville-Neilint error; 2726617cf57SGeorge V. Neville-Neil 2736617cf57SGeorge V. Neville-Neilerror = getnameinfo(sa, salen, addr, sizeof(addr), 2746617cf57SGeorge V. Neville-Neil NULL, 0, NI_NAMEREQD); 2756617cf57SGeorge V. Neville-Neilif (error == 0) { 2766617cf57SGeorge V. Neville-Neil memset(&hints, 0, sizeof(hints)); 2776617cf57SGeorge V. Neville-Neil hints.ai_socktype = SOCK_DGRAM; /*dummy*/ 2786617cf57SGeorge V. Neville-Neil hints.ai_flags = AI_NUMERICHOST; 2796617cf57SGeorge V. Neville-Neil if (getaddrinfo(addr, "0", &hints, &res) == 0) { 2806617cf57SGeorge V. Neville-Neil /* malicious PTR record */ 2816617cf57SGeorge V. Neville-Neil freeaddrinfo(res); 2826617cf57SGeorge V. Neville-Neil printf("bogus PTR record\en"); 2836617cf57SGeorge V. Neville-Neil return -1; 2846617cf57SGeorge V. Neville-Neil } 2856617cf57SGeorge V. Neville-Neil /* addr is FQDN as a result of PTR lookup */ 2866617cf57SGeorge V. Neville-Neil} else { 2876617cf57SGeorge V. Neville-Neil /* addr is numeric string */ 2886617cf57SGeorge V. Neville-Neil error = getnameinfo(sa, salen, addr, sizeof(addr), 2896617cf57SGeorge V. Neville-Neil NULL, 0, NI_NUMERICHOST); 2906617cf57SGeorge V. Neville-Neil} 2916617cf57SGeorge V. Neville-Neil.Ed 2926617cf57SGeorge V. Neville-Neil.\".Pp 2936617cf57SGeorge V. Neville-Neil.\".Ox 2946617cf57SGeorge V. Neville-Neil.\"intentionally uses a different 2956617cf57SGeorge V. Neville-Neil.\".Dv NI_MAXHOST 2966617cf57SGeorge V. Neville-Neil.\"value from what 2976617cf57SGeorge V. Neville-Neil.\".Tn "RFC 2553" 2986617cf57SGeorge V. Neville-Neil.\"suggests, to avoid buffer length handling mistakes. 299