xref: /freebsd/lib/libc/net/getipnodebyname.3 (revision daf1cffce2e07931f27c6c6998652e90df6ba87e)
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