1.\" Copyright (c) 1983, 1987, 1991, 1993 2.\" The Regents of the University of California. All rights reserved. 3.\" 4.\" Redistribution and use in source and binary forms, with or without 5.\" modification, are permitted provided that the following conditions 6.\" are met: 7.\" 1. Redistributions of source code must retain the above copyright 8.\" notice, this list of conditions and the following disclaimer. 9.\" 2. Redistributions in binary form must reproduce the above copyright 10.\" notice, this list of conditions and the following disclaimer in the 11.\" documentation and/or other materials provided with the distribution. 12.\" 3. All advertising materials mentioning features or use of this software 13.\" must display the following acknowledgement: 14.\" This product includes software developed by the University of 15.\" California, Berkeley and its contributors. 16.\" 4. Neither the name of the University nor the names of its contributors 17.\" may be used to endorse or promote products derived from this software 18.\" without specific prior written permission. 19.\" 20.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30.\" SUCH DAMAGE. 31.\" 32.\" From: @(#)gethostbyname.3 8.4 (Berkeley) 5/25/95 33.\" $Id: getipnodebyname.3,v 1.2 1999/09/13 16:04:51 itojun Exp $ 34.\ $FreeBSD$ 35.\" 36.Dd May 25, 1995 37.Dt GETIPNODEBYNAME 3 38.Os KAME 39.\" 40.Sh NAME 41.Nm getipnodebyname , 42.Nm getipnodebyaddr , 43.Nm freehostent 44.Nd nodename-to-address and address-to-nodename translation 45.\" 46.Sh SYNOPSIS 47.Fd #include <sys/types.h> 48.Fd #include <sys/socket.h> 49.Fd #include <netdb.h> 50.Ft "struct hostent *" 51.Fn getipnodebyname "const char *name" "int af" "int flags" "int *error_num" 52.Ft "struct hostent *" 53.Fn getipnodebyaddr "const void *src" "size_t len" "int af" "int *error_num" 54.Ft void 55.Fn freehostent "struct hostent *ptr" 56.\" 57.Sh DESCRIPTION 58.Fn getipnodebyname 59and 60.Fn getipnodebyaddr 61functions are very similar to 62.Xr gethostbyname 3 , 63.Xr gethostbyname2 3 64and 65.Xr gethostbyaddr 3 . 66The functions cover all the functionalities provided by the older ones, 67and provide better interface to programmers. 68The functions require additional arguments, 69.Ar af , 70and 71.Ar flags , 72for specifying address family and operation mode. 73The additional arguments allow programmer to get address for a nodename, 74for specific address family 75.Po 76such as 77.Dv AF_INET 78or 79.Dv AF_INET6 80.Pc . 81The functions also require an additional pointer argument, 82.Ar error_num 83to return the appropriate error code, 84to support thread safe error code returns. 85.Pp 86The type and usage of the return value, 87.Li "struct hostent" 88is described in 89.Xr gethostbyname 3 . 90.Pp 91For 92.Fn getipnodebyname , 93the 94.Ar name 95argument can be either a node name or a numeric address 96string 97.Po 98i.e., a dotted-decimal IPv4 address or an IPv6 hex address 99.Pc . 100The 101.Ar af 102argument specifies the address family, either 103.Dv AF_INET 104or 105.Dv AF_INET6 . 106The 107.Ar flags 108argument specifies the types of addresses that are searched for, 109and the types of addresses that are returned. 110We note that a special flags value of 111.Dv AI_DEFAULT 112.Pq defined below 113should handle most applications. 114That is, porting simple applications to use IPv6 replaces the call 115.Bd -literal -offset 116 hptr = gethostbyname(name); 117.Ed 118.Pp 119with 120.Bd -literal -offset 121 hptr = getipnodebyname(name, AF_INET6, AI_DEFAULT, &error_num); 122.Ed 123.Pp 124Applications desiring finer control over the types of addresses 125searched for and returned, can specify other combinations of the 126.Ar flags 127argument. 128.Pp 129A 130.Ar flags 131of 132.Li 0 133implies a strict interpretation of the 134.Ar af 135argument: 136.Bl -bullet 137.It 138If 139.Ar flags 140is 0 and 141.Ar af 142is 143.Dv AF_INET , 144then the caller wants only IPv4 addresses. 145A query is made for 146.Li A 147records. 148If successful, the IPv4 addresses are returned and the 149.Li h_length 150member of the 151.Li hostent 152structure will be 4, else the function returns a 153.Dv NULL 154pointer. 155.It 156If 157.Ar flags 158is 0 and if 159.Ar af 160is 161.Li AF_INET6 , 162then the caller wants only IPv6 addresses. 163A query is made for 164.Li AAAA 165records. 166If successful, the IPv6 addresses are returned and the 167.Li h_length 168member of the 169.Li hostent 170structure will be 16, else the function returns a 171.Dv NULL 172pointer. 173.El 174.Pp 175Other constants can be logically-ORed into the 176.Ar flags 177argument, to modify the behavior of the function. 178.Bl -bullet 179.It 180If the 181.Dv AI_V4MAPPED 182flag is specified along with an 183.Ar af 184of 185.Dv AF_INET6 , 186then the caller will accept IPv4-mapped IPv6 addresses. 187That is, if no 188.Li AAAA 189records are found then a query is made for 190.Li A 191records and any found are returned as IPv4-mapped IPv6 addresses 192.Po 193.Li h_length 194will be 16 195.Pc . 196The 197.Dv AI_V4MAPPED 198flag is ignored unless 199.Ar af 200equals 201.Dv AF_INET6 . 202.It 203The 204.Dv AI_V4MAPPED_CFG 205flag is exact same as the 206.Dv AI_V4MAPPED 207flag only if the kernel supports IPv4-mapped IPv6 address. 208.It 209If the 210.Dv AI_ALL 211flag is used in conjunction with the 212.Dv AI_V4MAPPED 213flag, and only used with the IPv6 address family. 214When 215.Dv AI_ALL 216is logically or'd with 217.Dv AI_V4MAPPED 218flag then the caller wants all addresses: IPv6 and IPv4-mapped IPv6. 219A query is first made for 220.Li AAAA 221records and if successful, the 222IPv6 addresses are returned. Another query is then made for 223.Li A 224records and any found are returned as IPv4-mapped IPv6 addresses. 225.Li h_length 226will be 16. Only if both queries fail does the function 227return a 228.Dv NULL 229pointer. This flag is ignored unless af equals 230AF_INET6. If both 231.Dv AI_ALL 232and 233.Dv AI_V4MAPPED 234are specified, 235.Dv AI_ALL 236takes precedence. 237.It 238The 239.Dv AI_ADDRCONFIG 240flag specifies that a query for 241.Li AAAA 242records 243should occur only if the node has at least one IPv6 source 244address configured and a query for 245.Li A 246records should occur only if the node has at least one IPv4 source address 247configured. 248.Pp 249For example, if the node has no IPv6 source addresses configured, 250and 251.Ar af 252equals AF_INET6, and the node name being looked up has both 253.Li AAAA 254and 255.Li A 256records, then: 257(a) if only 258.Dv AI_ADDRCONFIG 259is 260specified, the function returns a 261.Dv NULL 262pointer; 263(b) if 264.Dv AI_ADDRCONFIG 265| 266.Dv AI_V4MAPPED 267is specified, the 268.Li A 269records are returned as IPv4-mapped IPv6 addresses; 270.El 271.Pp 272The special flags value of 273.Dv AI_DEFAULT 274is defined as 275.Bd -literal -offset 276 #define AI_DEFAULT (AI_V4MAPPED_CFG | AI_ADDRCONFIG) 277.Ed 278.Pp 279We noted that the 280.Fn getipnodebyname 281function must allow the 282.Ar name 283argument to be either a node name or a literal address string 284.Po 285i.e., a dotted-decimal IPv4 address or an IPv6 hex address 286.Pc . 287This saves applications from having to call 288.Xr inet_pton 3 289to handle literal address strings. 290When the 291.Ar name 292argument is a literal address string, 293the 294.Ar flags 295argument is always ignored. 296.Pp 297There are four scenarios based on the type of literal address string 298and the value of the 299.Ar af 300argument. 301The two simple cases are when 302.Ar name 303is a dotted-decimal IPv4 address and 304.Ar af 305equals 306.Dv AF_INET , 307or when 308.Ar name 309is an IPv6 hex address and 310.Ar af 311equals 312.Dv AF_INET6 . 313The members of the 314returned hostent structure are: 315.Li h_name 316points to a copy of the 317.Ar name 318argument, 319.Li h_aliases 320is a 321.Dv NULL 322pointer, 323.Li h_addrtype 324is a copy of the 325.Ar af 326argument, 327.Li h_length 328is either 4 329.Po 330for 331.Dv AF_INET 332.Pc 333or 16 334.Po 335for 336.Dv AF_INET6 337.Pc , 338.Li h_addr_list[0] 339is a pointer to the 4-byte or 16-byte binary address, 340and 341.Li h_addr_list[1] 342is a 343.Dv NULL 344pointer. 345.Pp 346When 347.Ar name 348is a dotted-decimal IPv4 address and 349.Ar af 350equals 351.Dv AF_INET6 , 352and 353.Dv AI_V4MAPPED 354is specified, 355an IPv4-mapped IPv6 address is returned: 356.Li h_name 357points to an IPv6 hex address containing the IPv4-mapped IPv6 address, 358.Li h_aliases 359is a 360.Dv NULL 361pointer, 362.Li h_addrtype 363is 364.Dv AF_INET6 , 365.Li h_length 366is 16, 367.Li h_addr_list[0] 368is a pointer to the 16-byte binary address, and 369.Li h_addr_list[1] 370is a 371.Dv NULL 372pointer. 373.Pp 374It is an error when 375.Ar name 376is an IPv6 hex address and 377.Ar af 378equals 379.Dv AF_INET . 380The function's return value is a 381.Dv NULL 382pointer and the value pointed to by 383.Ar error_num 384equals 385.Dv HOST_NOT_FOUND . 386.Pp 387.Fn getipnodebyaddr 388takes almost the same argument as 389.Xr gethostbyaddr 3 , 390but adds a pointer to return an error number. 391Additionally it takes care of IPv4-mapped IPv6 addresses, 392and IPv4-compatible IPv6 addresses. 393.Pp 394.Fn getipnodebyname 395and 396.Fn getipnodebyaddr 397dynamically allocate the structure to be returned to the caller. 398.Fn freehostent 399reclaims memory region allocated and returned by 400.Fn getipnodebyname 401or 402.Fn getipnodebyaddr . 403.\" 404.Sh FILES 405.Bl -tag -width /etc/resolv.conf -compact 406.It Pa /etc/hosts 407.It Pa /etc/host.conf 408.It Pa /etc/resolv.conf 409.El 410.\" 411.Sh DIAGNOSTICS 412.Nm getipnodebyname 413and 414.Nm getipnodebyaddr 415returns 416.Dv NULL 417on errors. 418The integer values pointed to by 419.Ar error_num 420may then be checked to see whether this is a temporary failure 421or an invalid or unknown host. 422The meanings of each error code are described in 423.Xr gethostbyname 3 . 424.\" 425.Sh SEE ALSO 426.Xr gethostbyname 3 , 427.Xr gethostbyaddr 3 , 428.Xr hosts 5 , 429.Xr services 5 , 430.Xr hostname 7 , 431.Xr named 8 432.Pp 433R. Gilligan, S. Thomson, J. Bound, and W. Stevens, 434``Basic Socket Interface Extensions for IPv6,'' RFC2553, March 1999. 435.\" 436.Sh HISTORY 437The implementation first appeared in KAME advanced networking kit. 438.\" 439.Sh STANDARDS 440.Fn getipnodebyname 441and 442.Fn getipnodebyaddr 443are documented in ``Basic Socket Interface Extensions for IPv6'' 444.Pq RFC2553 . 445.\" 446.Sh BUGS 447The text was shamelessly copied from RFC2553. 448