xref: /freebsd/lib/libc/net/getaddrinfo.3 (revision bb957021d768ec7b0770f25c36ad01a1439f585c)
16617cf57SGeorge V. Neville-Neil.\"	$KAME: getaddrinfo.3,v 1.36 2005/01/05 03:23:05 itojun Exp $
26617cf57SGeorge V. Neville-Neil.\"	$OpenBSD: getaddrinfo.3,v 1.35 2004/12/21 03:40:31 jaredy 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*bb957021SHiroki Sato.Dd September 20, 2015
226617cf57SGeorge V. Neville-Neil.Dt GETADDRINFO 3
236617cf57SGeorge V. Neville-Neil.Os
246617cf57SGeorge V. Neville-Neil.Sh NAME
256617cf57SGeorge V. Neville-Neil.Nm getaddrinfo ,
266617cf57SGeorge V. Neville-Neil.Nm freeaddrinfo
276617cf57SGeorge V. Neville-Neil.Nd socket address structure to host and service name
286617cf57SGeorge V. Neville-Neil.Sh SYNOPSIS
29580dbd65SJoel Dahl.In sys/types.h
30580dbd65SJoel Dahl.In sys/socket.h
31580dbd65SJoel Dahl.In netdb.h
326617cf57SGeorge V. Neville-Neil.Ft int
33f789cb82SRuslan Ermilov.Fo getaddrinfo
34f789cb82SRuslan Ermilov.Fa "const char *hostname" "const char *servname"
35f789cb82SRuslan Ermilov.Fa "const struct addrinfo *hints" "struct addrinfo **res"
36f789cb82SRuslan Ermilov.Fc
376617cf57SGeorge V. Neville-Neil.Ft void
386617cf57SGeorge V. Neville-Neil.Fn freeaddrinfo "struct addrinfo *ai"
396617cf57SGeorge V. Neville-Neil.Sh DESCRIPTION
406617cf57SGeorge V. Neville-NeilThe
416617cf57SGeorge V. Neville-Neil.Fn getaddrinfo
426617cf57SGeorge V. Neville-Neilfunction is used to get a list of
436617cf57SGeorge V. Neville-Neiladdresses and port numbers for host
446617cf57SGeorge V. Neville-Neil.Fa hostname
456617cf57SGeorge V. Neville-Neiland service
466617cf57SGeorge V. Neville-Neil.Fa servname .
476617cf57SGeorge V. Neville-NeilIt is a replacement for and provides more flexibility than the
486617cf57SGeorge V. Neville-Neil.Xr gethostbyname 3
496617cf57SGeorge V. Neville-Neiland
506617cf57SGeorge V. Neville-Neil.Xr getservbyname 3
516617cf57SGeorge V. Neville-Neilfunctions.
526617cf57SGeorge V. Neville-Neil.Pp
536617cf57SGeorge V. Neville-NeilThe
546617cf57SGeorge V. Neville-Neil.Fa hostname
556617cf57SGeorge V. Neville-Neiland
566617cf57SGeorge V. Neville-Neil.Fa servname
576617cf57SGeorge V. Neville-Neilarguments are either pointers to NUL-terminated strings or the null pointer.
586617cf57SGeorge V. Neville-NeilAn acceptable value for
596617cf57SGeorge V. Neville-Neil.Fa hostname
606617cf57SGeorge V. Neville-Neilis either a valid host name or a numeric host address string consisting
61*bb957021SHiroki Satoof a dotted decimal IPv4 address,
62*bb957021SHiroki Satoan IPv6 address,
63*bb957021SHiroki Satoor a UNIX-domain address.
646617cf57SGeorge V. Neville-NeilThe
656617cf57SGeorge V. Neville-Neil.Fa servname
666617cf57SGeorge V. Neville-Neilis either a decimal port number or a service name listed in
676617cf57SGeorge V. Neville-Neil.Xr services 5 .
686617cf57SGeorge V. Neville-NeilAt least one of
696617cf57SGeorge V. Neville-Neil.Fa hostname
706617cf57SGeorge V. Neville-Neiland
716617cf57SGeorge V. Neville-Neil.Fa servname
726617cf57SGeorge V. Neville-Neilmust be non-null.
736617cf57SGeorge V. Neville-Neil.Pp
746617cf57SGeorge V. Neville-Neil.Fa hints
756617cf57SGeorge V. Neville-Neilis an optional pointer to a
766617cf57SGeorge V. Neville-Neil.Li struct addrinfo ,
776617cf57SGeorge V. Neville-Neilas defined by
786617cf57SGeorge V. Neville-Neil.Aq Pa netdb.h :
796617cf57SGeorge V. Neville-Neil.Bd -literal
806617cf57SGeorge V. Neville-Neilstruct addrinfo {
816617cf57SGeorge V. Neville-Neil	int ai_flags;		/* input flags */
826617cf57SGeorge V. Neville-Neil	int ai_family;		/* protocol family for socket */
836617cf57SGeorge V. Neville-Neil	int ai_socktype;	/* socket type */
846617cf57SGeorge V. Neville-Neil	int ai_protocol;	/* protocol for socket */
856617cf57SGeorge V. Neville-Neil	socklen_t ai_addrlen;	/* length of socket-address */
866617cf57SGeorge V. Neville-Neil	struct sockaddr *ai_addr; /* socket-address for socket */
876617cf57SGeorge V. Neville-Neil	char *ai_canonname;	/* canonical name for service location */
886617cf57SGeorge V. Neville-Neil	struct addrinfo *ai_next; /* pointer to next in list */
896617cf57SGeorge V. Neville-Neil};
906617cf57SGeorge V. Neville-Neil.Ed
916617cf57SGeorge V. Neville-Neil.Pp
926617cf57SGeorge V. Neville-NeilThis structure can be used to provide hints concerning the type of socket
936617cf57SGeorge V. Neville-Neilthat the caller supports or wishes to use.
946617cf57SGeorge V. Neville-NeilThe caller can supply the following structure elements in
956617cf57SGeorge V. Neville-Neil.Fa hints :
966617cf57SGeorge V. Neville-Neil.Bl -tag -width "ai_socktypeXX"
976617cf57SGeorge V. Neville-Neil.It Fa ai_family
986617cf57SGeorge V. Neville-NeilThe protocol family that should be used.
996617cf57SGeorge V. Neville-NeilWhen
1006617cf57SGeorge V. Neville-Neil.Fa ai_family
1016617cf57SGeorge V. Neville-Neilis set to
1026617cf57SGeorge V. Neville-Neil.Dv PF_UNSPEC ,
1036617cf57SGeorge V. Neville-Neilit means the caller will accept any protocol family supported by the
1046617cf57SGeorge V. Neville-Neiloperating system.
1056617cf57SGeorge V. Neville-Neil.It Fa ai_socktype
1066617cf57SGeorge V. Neville-NeilDenotes the type of socket that is wanted:
1076617cf57SGeorge V. Neville-Neil.Dv SOCK_STREAM ,
1086617cf57SGeorge V. Neville-Neil.Dv SOCK_DGRAM ,
109*bb957021SHiroki Sato.Dv SOCK_SEQPACKET ,
1106617cf57SGeorge V. Neville-Neilor
1116617cf57SGeorge V. Neville-Neil.Dv SOCK_RAW .
1126617cf57SGeorge V. Neville-NeilWhen
1136617cf57SGeorge V. Neville-Neil.Fa ai_socktype
1146617cf57SGeorge V. Neville-Neilis zero the caller will accept any socket type.
1156617cf57SGeorge V. Neville-Neil.It Fa ai_protocol
1166617cf57SGeorge V. Neville-NeilIndicates which transport protocol is desired,
117*bb957021SHiroki Sato.Dv IPPROTO_UDP ,
118*bb957021SHiroki Sato.Dv IPPROTO_TCP ,
119*bb957021SHiroki Sato.Dv IPPROTO_SCTP ,
1206617cf57SGeorge V. Neville-Neilor
121*bb957021SHiroki Sato.Dv IPPROTO_UDPLITE .
1226617cf57SGeorge V. Neville-NeilIf
1236617cf57SGeorge V. Neville-Neil.Fa ai_protocol
1246617cf57SGeorge V. Neville-Neilis zero the caller will accept any protocol.
1256617cf57SGeorge V. Neville-Neil.It Fa ai_flags
126eb1db428SRemko LodderThe
1276617cf57SGeorge V. Neville-Neil.Fa ai_flags
128eb1db428SRemko Lodderfield to which the
129eb1db428SRemko Lodder.Fa hints
130eb1db428SRemko Lodderparameter points shall be set to zero
131eb1db428SRemko Lodderor be the bitwise-inclusive OR of one or more of the values
132eb1db428SRemko Lodder.Dv AI_ADDRCONFIG ,
133eb1db428SRemko Lodder.Dv AI_CANONNAME ,
134eb1db428SRemko Lodder.Dv AI_NUMERICHOST ,
1357cfc1e32SDaniel Gerzo.Dv AI_NUMERICSERV
136eb1db428SRemko Lodderand
1377cfc1e32SDaniel Gerzo.Dv AI_PASSIVE .
138*bb957021SHiroki SatoFor a UNIX-domain address,
139*bb957021SHiroki Sato.Fa ai_flags
140*bb957021SHiroki Satois ignored.
1416617cf57SGeorge V. Neville-Neil.Bl -tag -width "AI_CANONNAMEXX"
142eb1db428SRemko Lodder.It Dv AI_ADDRCONFIG
143eb1db428SRemko LodderIf the
144eb1db428SRemko Lodder.Dv AI_ADDRCONFIG
145eb1db428SRemko Lodderbit is set, IPv4 addresses shall be returned only if
146eb1db428SRemko Lodderan IPv4 address is configured on the local system,
147eb1db428SRemko Lodderand IPv6 addresses shall be returned only if
148eb1db428SRemko Lodderan IPv6 address is configured on the local system.
1496617cf57SGeorge V. Neville-Neil.It Dv AI_CANONNAME
1506617cf57SGeorge V. Neville-NeilIf the
1516617cf57SGeorge V. Neville-Neil.Dv AI_CANONNAME
1526617cf57SGeorge V. Neville-Neilbit is set, a successful call to
1536617cf57SGeorge V. Neville-Neil.Fn getaddrinfo
1546617cf57SGeorge V. Neville-Neilwill return a NUL-terminated string containing the canonical name
1556617cf57SGeorge V. Neville-Neilof the specified hostname in the
1566617cf57SGeorge V. Neville-Neil.Fa ai_canonname
1576617cf57SGeorge V. Neville-Neilelement of the first
1586617cf57SGeorge V. Neville-Neil.Li addrinfo
1596617cf57SGeorge V. Neville-Neilstructure returned.
1606617cf57SGeorge V. Neville-Neil.It Dv AI_NUMERICHOST
1616617cf57SGeorge V. Neville-NeilIf the
1626617cf57SGeorge V. Neville-Neil.Dv AI_NUMERICHOST
1636617cf57SGeorge V. Neville-Neilbit is set, it indicates that
1646617cf57SGeorge V. Neville-Neil.Fa hostname
1656617cf57SGeorge V. Neville-Neilshould be treated as a numeric string defining an IPv4 or IPv6 address
1666617cf57SGeorge V. Neville-Neiland no name resolution should be attempted.
167eb1db428SRemko Lodder.It Dv AI_NUMERICSERV
168eb1db428SRemko LodderIf the
169eb1db428SRemko Lodder.Dv AI_NUMERICSERV
170eb1db428SRemko Lodderbit is set,
171eb1db428SRemko Lodderthen a non-null
172eb1db428SRemko Lodder.Fa servname
173eb1db428SRemko Lodderstring supplied shall be a numeric port string.
174eb1db428SRemko LodderOtherwise, an
175eb1db428SRemko Lodder.Dv EAI_NONAME
176eb1db428SRemko Loddererror shall be returned.
177eb1db428SRemko LodderThis bit shall prevent any type of name resolution service
178eb1db428SRemko Lodder(for example, NIS+) from being invoked.
1796617cf57SGeorge V. Neville-Neil.It Dv AI_PASSIVE
1806617cf57SGeorge V. Neville-NeilIf the
1816617cf57SGeorge V. Neville-Neil.Dv AI_PASSIVE
1826617cf57SGeorge V. Neville-Neilbit is set it indicates that the returned socket address structure
1836617cf57SGeorge V. Neville-Neilis intended for use in a call to
1846617cf57SGeorge V. Neville-Neil.Xr bind 2 .
1856617cf57SGeorge V. Neville-NeilIn this case, if the
1866617cf57SGeorge V. Neville-Neil.Fa hostname
1876617cf57SGeorge V. Neville-Neilargument is the null pointer, then the IP address portion of the
1886617cf57SGeorge V. Neville-Neilsocket address structure will be set to
1896617cf57SGeorge V. Neville-Neil.Dv INADDR_ANY
1906617cf57SGeorge V. Neville-Neilfor an IPv4 address or
1916617cf57SGeorge V. Neville-Neil.Dv IN6ADDR_ANY_INIT
1926617cf57SGeorge V. Neville-Neilfor an IPv6 address.
1936617cf57SGeorge V. Neville-Neil.Pp
1946617cf57SGeorge V. Neville-NeilIf the
1956617cf57SGeorge V. Neville-Neil.Dv AI_PASSIVE
1966617cf57SGeorge V. Neville-Neilbit is not set, the returned socket address structure will be ready
1976617cf57SGeorge V. Neville-Neilfor use in a call to
1986617cf57SGeorge V. Neville-Neil.Xr connect 2
1996617cf57SGeorge V. Neville-Neilfor a connection-oriented protocol or
2006617cf57SGeorge V. Neville-Neil.Xr connect 2 ,
2016617cf57SGeorge V. Neville-Neil.Xr sendto 2 ,
2026617cf57SGeorge V. Neville-Neilor
2036617cf57SGeorge V. Neville-Neil.Xr sendmsg 2
2046617cf57SGeorge V. Neville-Neilif a connectionless protocol was chosen.
2056617cf57SGeorge V. Neville-NeilThe
2066617cf57SGeorge V. Neville-Neil.Tn IP
2076617cf57SGeorge V. Neville-Neiladdress portion of the socket address structure will be set to the
2086617cf57SGeorge V. Neville-Neilloopback address if
2096617cf57SGeorge V. Neville-Neil.Fa hostname
2106617cf57SGeorge V. Neville-Neilis the null pointer and
2116617cf57SGeorge V. Neville-Neil.Dv AI_PASSIVE
2126617cf57SGeorge V. Neville-Neilis not set.
2136617cf57SGeorge V. Neville-Neil.El
2146617cf57SGeorge V. Neville-Neil.El
2156617cf57SGeorge V. Neville-Neil.Pp
2166617cf57SGeorge V. Neville-NeilAll other elements of the
2176617cf57SGeorge V. Neville-Neil.Li addrinfo
2186617cf57SGeorge V. Neville-Neilstructure passed via
2196617cf57SGeorge V. Neville-Neil.Fa hints
2206617cf57SGeorge V. Neville-Neilmust be zero or the null pointer.
2216617cf57SGeorge V. Neville-Neil.Pp
2226617cf57SGeorge V. Neville-NeilIf
2236617cf57SGeorge V. Neville-Neil.Fa hints
2246617cf57SGeorge V. Neville-Neilis the null pointer,
2256617cf57SGeorge V. Neville-Neil.Fn getaddrinfo
2266617cf57SGeorge V. Neville-Neilbehaves as if the caller provided a
2276617cf57SGeorge V. Neville-Neil.Li struct addrinfo
2286617cf57SGeorge V. Neville-Neilwith
2296617cf57SGeorge V. Neville-Neil.Fa ai_family
2306617cf57SGeorge V. Neville-Neilset to
2316617cf57SGeorge V. Neville-Neil.Dv PF_UNSPEC
2326617cf57SGeorge V. Neville-Neiland all other elements set to zero or
2336617cf57SGeorge V. Neville-Neil.Dv NULL .
2346617cf57SGeorge V. Neville-Neil.Pp
2356617cf57SGeorge V. Neville-NeilAfter a successful call to
2366617cf57SGeorge V. Neville-Neil.Fn getaddrinfo ,
2376617cf57SGeorge V. Neville-Neil.Fa *res
2386617cf57SGeorge V. Neville-Neilis a pointer to a linked list of one or more
2396617cf57SGeorge V. Neville-Neil.Li addrinfo
2406617cf57SGeorge V. Neville-Neilstructures.
2416617cf57SGeorge V. Neville-NeilThe list can be traversed by following the
2426617cf57SGeorge V. Neville-Neil.Fa ai_next
2436617cf57SGeorge V. Neville-Neilpointer in each
2446617cf57SGeorge V. Neville-Neil.Li addrinfo
2456617cf57SGeorge V. Neville-Neilstructure until a null pointer is encountered.
2466617cf57SGeorge V. Neville-NeilThe three members
2476617cf57SGeorge V. Neville-Neil.Fa ai_family ,
2486617cf57SGeorge V. Neville-Neil.Fa ai_socktype ,
2496617cf57SGeorge V. Neville-Neiland
2506617cf57SGeorge V. Neville-Neil.Fa ai_protocol
2516617cf57SGeorge V. Neville-Neilin each returned
2526617cf57SGeorge V. Neville-Neil.Li addrinfo
2536617cf57SGeorge V. Neville-Neilstructure are suitable for a call to
2546617cf57SGeorge V. Neville-Neil.Xr socket 2 .
2556617cf57SGeorge V. Neville-NeilFor each
2566617cf57SGeorge V. Neville-Neil.Li addrinfo
2576617cf57SGeorge V. Neville-Neilstructure in the list, the
2586617cf57SGeorge V. Neville-Neil.Fa ai_addr
2596617cf57SGeorge V. Neville-Neilmember points to a filled-in socket address structure of length
2606617cf57SGeorge V. Neville-Neil.Fa ai_addrlen .
2616617cf57SGeorge V. Neville-Neil.Pp
2626617cf57SGeorge V. Neville-NeilThis implementation of
2636617cf57SGeorge V. Neville-Neil.Fn getaddrinfo
2646617cf57SGeorge V. Neville-Neilallows numeric IPv6 address notation with scope identifier,
2654e4f91b8SHiroki Satoas documented in chapter 11 of RFC 4007.
2666617cf57SGeorge V. Neville-NeilBy appending the percent character and scope identifier to addresses,
2676617cf57SGeorge V. Neville-Neilone can fill the
2686617cf57SGeorge V. Neville-Neil.Li sin6_scope_id
2696617cf57SGeorge V. Neville-Neilfield for addresses.
2706617cf57SGeorge V. Neville-NeilThis would make management of scoped addresses easier
2716617cf57SGeorge V. Neville-Neiland allows cut-and-paste input of scoped addresses.
2726617cf57SGeorge V. Neville-Neil.Pp
2736617cf57SGeorge V. Neville-NeilAt this moment the code supports only link-local addresses with the format.
2746617cf57SGeorge V. Neville-NeilThe scope identifier is hardcoded to the name of the hardware interface
2756617cf57SGeorge V. Neville-Neilassociated
2766617cf57SGeorge V. Neville-Neilwith the link
2776617cf57SGeorge V. Neville-Neil.Po
2786617cf57SGeorge V. Neville-Neilsuch as
2796617cf57SGeorge V. Neville-Neil.Li ne0
2806617cf57SGeorge V. Neville-Neil.Pc .
2816617cf57SGeorge V. Neville-NeilAn example is
2826617cf57SGeorge V. Neville-Neil.Dq Li fe80::1%ne0 ,
2836617cf57SGeorge V. Neville-Neilwhich means
2846617cf57SGeorge V. Neville-Neil.Do
2856617cf57SGeorge V. Neville-Neil.Li fe80::1
2866617cf57SGeorge V. Neville-Neilon the link associated with the
2876617cf57SGeorge V. Neville-Neil.Li ne0
2886617cf57SGeorge V. Neville-Neilinterface
2896617cf57SGeorge V. Neville-Neil.Dc .
2906617cf57SGeorge V. Neville-Neil.Pp
2916617cf57SGeorge V. Neville-NeilThe current implementation assumes a one-to-one relationship between
2926617cf57SGeorge V. Neville-Neilthe interface and link, which is not necessarily true from the specification.
2936617cf57SGeorge V. Neville-Neil.Pp
2946617cf57SGeorge V. Neville-NeilAll of the information returned by
2956617cf57SGeorge V. Neville-Neil.Fn getaddrinfo
2966617cf57SGeorge V. Neville-Neilis dynamically allocated: the
2976617cf57SGeorge V. Neville-Neil.Li addrinfo
2986617cf57SGeorge V. Neville-Neilstructures themselves as well as the socket address structures and
2996617cf57SGeorge V. Neville-Neilthe canonical host name strings included in the
3006617cf57SGeorge V. Neville-Neil.Li addrinfo
3016617cf57SGeorge V. Neville-Neilstructures.
3026617cf57SGeorge V. Neville-Neil.Pp
3036617cf57SGeorge V. Neville-NeilMemory allocated for the dynamically allocated structures created by
3046617cf57SGeorge V. Neville-Neila successful call to
3056617cf57SGeorge V. Neville-Neil.Fn getaddrinfo
3066617cf57SGeorge V. Neville-Neilis released by the
3076617cf57SGeorge V. Neville-Neil.Fn freeaddrinfo
3086617cf57SGeorge V. Neville-Neilfunction.
3096617cf57SGeorge V. Neville-NeilThe
3106617cf57SGeorge V. Neville-Neil.Fa ai
3116617cf57SGeorge V. Neville-Neilpointer should be a
3126617cf57SGeorge V. Neville-Neil.Li addrinfo
3136617cf57SGeorge V. Neville-Neilstructure created by a call to
3146617cf57SGeorge V. Neville-Neil.Fn getaddrinfo .
3156617cf57SGeorge V. Neville-Neil.Sh RETURN VALUES
3166617cf57SGeorge V. Neville-Neil.Fn getaddrinfo
3176617cf57SGeorge V. Neville-Neilreturns zero on success or one of the error codes listed in
3186617cf57SGeorge V. Neville-Neil.Xr gai_strerror 3
3196617cf57SGeorge V. Neville-Neilif an error occurs.
3206617cf57SGeorge V. Neville-Neil.Sh EXAMPLES
3216617cf57SGeorge V. Neville-NeilThe following code tries to connect to
3226617cf57SGeorge V. Neville-Neil.Dq Li www.kame.net
3236617cf57SGeorge V. Neville-Neilservice
3246617cf57SGeorge V. Neville-Neil.Dq Li http
3256617cf57SGeorge V. Neville-Neilvia a stream socket.
3266617cf57SGeorge V. Neville-NeilIt loops through all the addresses available, regardless of address family.
3276617cf57SGeorge V. Neville-NeilIf the destination resolves to an IPv4 address, it will use an
3286617cf57SGeorge V. Neville-Neil.Dv AF_INET
3296617cf57SGeorge V. Neville-Neilsocket.
3306617cf57SGeorge V. Neville-NeilSimilarly, if it resolves to IPv6, an
3316617cf57SGeorge V. Neville-Neil.Dv AF_INET6
3326617cf57SGeorge V. Neville-Neilsocket is used.
3336617cf57SGeorge V. Neville-NeilObserve that there is no hardcoded reference to a particular address family.
3346617cf57SGeorge V. Neville-NeilThe code works even if
3356617cf57SGeorge V. Neville-Neil.Fn getaddrinfo
3366617cf57SGeorge V. Neville-Neilreturns addresses that are not IPv4/v6.
3376617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent
3386617cf57SGeorge V. Neville-Neilstruct addrinfo hints, *res, *res0;
3396617cf57SGeorge V. Neville-Neilint error;
3406617cf57SGeorge V. Neville-Neilint s;
3416617cf57SGeorge V. Neville-Neilconst char *cause = NULL;
3426617cf57SGeorge V. Neville-Neil
3436617cf57SGeorge V. Neville-Neilmemset(&hints, 0, sizeof(hints));
3446617cf57SGeorge V. Neville-Neilhints.ai_family = PF_UNSPEC;
3456617cf57SGeorge V. Neville-Neilhints.ai_socktype = SOCK_STREAM;
3466617cf57SGeorge V. Neville-Neilerror = getaddrinfo("www.kame.net", "http", &hints, &res0);
3476617cf57SGeorge V. Neville-Neilif (error) {
3486617cf57SGeorge V. Neville-Neil	errx(1, "%s", gai_strerror(error));
3496617cf57SGeorge V. Neville-Neil	/* NOTREACHED */
3506617cf57SGeorge V. Neville-Neil}
3516617cf57SGeorge V. Neville-Neils = -1;
3526617cf57SGeorge V. Neville-Neilfor (res = res0; res; res = res->ai_next) {
3536617cf57SGeorge V. Neville-Neil	s = socket(res->ai_family, res->ai_socktype,
3546617cf57SGeorge V. Neville-Neil	    res->ai_protocol);
3556617cf57SGeorge V. Neville-Neil	if (s < 0) {
3566617cf57SGeorge V. Neville-Neil		cause = "socket";
3576617cf57SGeorge V. Neville-Neil		continue;
3586617cf57SGeorge V. Neville-Neil	}
3596617cf57SGeorge V. Neville-Neil
3606617cf57SGeorge V. Neville-Neil	if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
3616617cf57SGeorge V. Neville-Neil		cause = "connect";
3626617cf57SGeorge V. Neville-Neil		close(s);
3636617cf57SGeorge V. Neville-Neil		s = -1;
3646617cf57SGeorge V. Neville-Neil		continue;
3656617cf57SGeorge V. Neville-Neil	}
3666617cf57SGeorge V. Neville-Neil
3676617cf57SGeorge V. Neville-Neil	break;	/* okay we got one */
3686617cf57SGeorge V. Neville-Neil}
3696617cf57SGeorge V. Neville-Neilif (s < 0) {
3706617cf57SGeorge V. Neville-Neil	err(1, "%s", cause);
3716617cf57SGeorge V. Neville-Neil	/* NOTREACHED */
3726617cf57SGeorge V. Neville-Neil}
3736617cf57SGeorge V. Neville-Neilfreeaddrinfo(res0);
3746617cf57SGeorge V. Neville-Neil.Ed
3756617cf57SGeorge V. Neville-Neil.Pp
3766617cf57SGeorge V. Neville-NeilThe following example tries to open a wildcard listening socket onto service
3776617cf57SGeorge V. Neville-Neil.Dq Li http ,
3786617cf57SGeorge V. Neville-Neilfor all the address families available.
3796617cf57SGeorge V. Neville-Neil.Bd -literal -offset indent
3806617cf57SGeorge V. Neville-Neilstruct addrinfo hints, *res, *res0;
3816617cf57SGeorge V. Neville-Neilint error;
3826617cf57SGeorge V. Neville-Neilint s[MAXSOCK];
3836617cf57SGeorge V. Neville-Neilint nsock;
3846617cf57SGeorge V. Neville-Neilconst char *cause = NULL;
3856617cf57SGeorge V. Neville-Neil
3866617cf57SGeorge V. Neville-Neilmemset(&hints, 0, sizeof(hints));
3876617cf57SGeorge V. Neville-Neilhints.ai_family = PF_UNSPEC;
3886617cf57SGeorge V. Neville-Neilhints.ai_socktype = SOCK_STREAM;
3896617cf57SGeorge V. Neville-Neilhints.ai_flags = AI_PASSIVE;
3906617cf57SGeorge V. Neville-Neilerror = getaddrinfo(NULL, "http", &hints, &res0);
3916617cf57SGeorge V. Neville-Neilif (error) {
3926617cf57SGeorge V. Neville-Neil	errx(1, "%s", gai_strerror(error));
3936617cf57SGeorge V. Neville-Neil	/* NOTREACHED */
3946617cf57SGeorge V. Neville-Neil}
3956617cf57SGeorge V. Neville-Neilnsock = 0;
3966617cf57SGeorge V. Neville-Neilfor (res = res0; res && nsock < MAXSOCK; res = res->ai_next) {
3976617cf57SGeorge V. Neville-Neil	s[nsock] = socket(res->ai_family, res->ai_socktype,
3986617cf57SGeorge V. Neville-Neil	    res->ai_protocol);
3996617cf57SGeorge V. Neville-Neil	if (s[nsock] < 0) {
4006617cf57SGeorge V. Neville-Neil		cause = "socket";
4016617cf57SGeorge V. Neville-Neil		continue;
4026617cf57SGeorge V. Neville-Neil	}
4036617cf57SGeorge V. Neville-Neil
4046617cf57SGeorge V. Neville-Neil	if (bind(s[nsock], res->ai_addr, res->ai_addrlen) < 0) {
4056617cf57SGeorge V. Neville-Neil		cause = "bind";
4066617cf57SGeorge V. Neville-Neil		close(s[nsock]);
4076617cf57SGeorge V. Neville-Neil		continue;
4086617cf57SGeorge V. Neville-Neil	}
4096617cf57SGeorge V. Neville-Neil	(void) listen(s[nsock], 5);
4106617cf57SGeorge V. Neville-Neil
4116617cf57SGeorge V. Neville-Neil	nsock++;
4126617cf57SGeorge V. Neville-Neil}
4136617cf57SGeorge V. Neville-Neilif (nsock == 0) {
4146617cf57SGeorge V. Neville-Neil	err(1, "%s", cause);
4156617cf57SGeorge V. Neville-Neil	/* NOTREACHED */
4166617cf57SGeorge V. Neville-Neil}
4176617cf57SGeorge V. Neville-Neilfreeaddrinfo(res0);
4186617cf57SGeorge V. Neville-Neil.Ed
4196617cf57SGeorge V. Neville-Neil.Sh SEE ALSO
4206617cf57SGeorge V. Neville-Neil.Xr bind 2 ,
4216617cf57SGeorge V. Neville-Neil.Xr connect 2 ,
4226617cf57SGeorge V. Neville-Neil.Xr send 2 ,
4236617cf57SGeorge V. Neville-Neil.Xr socket 2 ,
4246617cf57SGeorge V. Neville-Neil.Xr gai_strerror 3 ,
4256617cf57SGeorge V. Neville-Neil.Xr gethostbyname 3 ,
4266617cf57SGeorge V. Neville-Neil.Xr getnameinfo 3 ,
4276617cf57SGeorge V. Neville-Neil.Xr getservbyname 3 ,
4286617cf57SGeorge V. Neville-Neil.Xr resolver 3 ,
429*bb957021SHiroki Sato.Xr inet 4 ,
430*bb957021SHiroki Sato.Xr inet6 4 ,
431*bb957021SHiroki Sato.Xr unix 4 ,
4326617cf57SGeorge V. Neville-Neil.Xr hosts 5 ,
4336617cf57SGeorge V. Neville-Neil.Xr resolv.conf 5 ,
4346617cf57SGeorge V. Neville-Neil.Xr services 5 ,
4356617cf57SGeorge V. Neville-Neil.Xr hostname 7 ,
4366617cf57SGeorge V. Neville-Neil.Xr named 8
4376617cf57SGeorge V. Neville-Neil.Rs
4386617cf57SGeorge V. Neville-Neil.%A R. Gilligan
4396617cf57SGeorge V. Neville-Neil.%A S. Thomson
4406617cf57SGeorge V. Neville-Neil.%A J. Bound
4416617cf57SGeorge V. Neville-Neil.%A J. McCann
4426617cf57SGeorge V. Neville-Neil.%A W. Stevens
4436617cf57SGeorge V. Neville-Neil.%T Basic Socket Interface Extensions for IPv6
4446617cf57SGeorge V. Neville-Neil.%R RFC 3493
4456617cf57SGeorge V. Neville-Neil.%D February 2003
4466617cf57SGeorge V. Neville-Neil.Re
4476617cf57SGeorge V. Neville-Neil.Rs
4486617cf57SGeorge V. Neville-Neil.%A S. Deering
4496617cf57SGeorge V. Neville-Neil.%A B. Haberman
4506617cf57SGeorge V. Neville-Neil.%A T. Jinmei
4516617cf57SGeorge V. Neville-Neil.%A E. Nordmark
4526617cf57SGeorge V. Neville-Neil.%A B. Zill
4536617cf57SGeorge V. Neville-Neil.%T "IPv6 Scoped Address Architecture"
4544e4f91b8SHiroki Sato.%R RFC 4007
4554e4f91b8SHiroki Sato.%D March 2005
4566617cf57SGeorge V. Neville-Neil.Re
4576617cf57SGeorge V. Neville-Neil.Rs
4586617cf57SGeorge V. Neville-Neil.%A Craig Metz
4596617cf57SGeorge V. Neville-Neil.%T Protocol Independence Using the Sockets API
4606617cf57SGeorge V. Neville-Neil.%B "Proceedings of the freenix track: 2000 USENIX annual technical conference"
4616617cf57SGeorge V. Neville-Neil.%D June 2000
4626617cf57SGeorge V. Neville-Neil.Re
4636617cf57SGeorge V. Neville-Neil.Sh STANDARDS
4646617cf57SGeorge V. Neville-NeilThe
4656617cf57SGeorge V. Neville-Neil.Fn getaddrinfo
4666617cf57SGeorge V. Neville-Neilfunction is defined by the
467eb1db428SRemko Lodder.St -p1003.1-2004
468eb1db428SRemko Lodderspecification and documented in
4696617cf57SGeorge V. Neville-Neil.Dv "RFC 3493" ,
4706617cf57SGeorge V. Neville-Neil.Dq Basic Socket Interface Extensions for IPv6 .
471