Mercurial > hg > octave-jordi > gnulib-hg
annotate lib/getaddrinfo.c @ 7584:a88f85e4728f
* lib/arcfour.c: Assume config.h.
* lib/arctwo.c: Likewise.
* lib/base64.c: Likewise.
* lib/check-version.c: Likewise.
* lib/crc.c: Likewise.
* lib/des.c: Likewise.
* lib/gc-gnulib.c: Likewise.
* lib/gc-libgcrypt.c: Likewise.
* lib/gc-pbkdf2-sha1.c: Likewise.
* lib/getaddrinfo.c: Likewise.
* lib/getdelim.c: Likewise.
* lib/getline.c: Likewise.
* lib/hmac-md5.c: Likewise.
* lib/hmac-sha1.c: Likewise.
* lib/iconvme.c: Likewise.
* lib/md2.c: Likewise.
* lib/md4.c: Likewise.
* lib/memxor.c: Likewise.
* lib/read-file.c: Likewise.
* lib/readline.c: Likewise.
* lib/rijndael-alg-fst.c: Likewise.
* lib/rijndael-api-fst.c: Likewise.
* lib/xgetdomainname.c: Likewise.
author | Eric Blake <ebb9@byu.net> |
---|---|
date | Sun, 29 Oct 2006 21:52:55 +0000 (2006-10-29) |
parents | 0efdbb895e51 |
children | 337f51b0a896 |
rev | line source |
---|---|
5408 | 1 /* Get address information (partial implementation). |
7584
a88f85e4728f
* lib/arcfour.c: Assume config.h.
Eric Blake <ebb9@byu.net>
parents:
7551
diff
changeset
|
2 Copyright (C) 1997, 2001, 2002, 2004, 2005, 2006 Free Software |
a88f85e4728f
* lib/arcfour.c: Assume config.h.
Eric Blake <ebb9@byu.net>
parents:
7551
diff
changeset
|
3 Foundation, Inc. |
5408 | 4 Contributed by Simon Josefsson <simon@josefsson.org>. |
5 | |
6 This program is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
8 the Free Software Foundation; either version 2, or (at your option) | |
9 any later version. | |
10 | |
11 This program is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with this program; if not, write to the Free Software Foundation, | |
5848
a48fb0e98c8c
*** empty log message ***
Paul Eggert <eggert@cs.ucla.edu>
parents:
5833
diff
changeset
|
18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ |
5408 | 19 |
7584
a88f85e4728f
* lib/arcfour.c: Assume config.h.
Eric Blake <ebb9@byu.net>
parents:
7551
diff
changeset
|
20 #include <config.h> |
5408 | 21 |
6224
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
22 #include "getaddrinfo.h" |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
23 |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
24 #if HAVE_NETINET_IN_H |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
25 # include <netinet/in.h> |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
26 #endif |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
27 |
5408 | 28 /* Get calloc. */ |
29 #include <stdlib.h> | |
30 | |
31 /* Get memcpy. */ | |
32 #include <string.h> | |
33 | |
34 #include <stdbool.h> | |
35 | |
36 #include "gettext.h" | |
37 #define _(String) gettext (String) | |
38 #define N_(String) String | |
39 | |
6924
b63cb350d858
* getaddrinfo.h (NI_NUMERICHOST, NI_NUMERICSERV): Define if
Eric Blake <ebb9@byu.net>
parents:
6902
diff
changeset
|
40 #include "inet_ntop.h" |
7543
8c6aad2a3515
* lib/getaddrinfo.c (getnameinfo): Use new lightweight uinttostr,
Jim Meyering <jim@meyering.net>
parents:
7329
diff
changeset
|
41 #include "intprops.h" |
7551
0efdbb895e51
* lib/getaddrinfo.c (includes): Add missing include.
Eric Blake <ebb9@byu.net>
parents:
7543
diff
changeset
|
42 #include "inttostr.h" |
6224
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
43 #include "strdup.h" |
5408 | 44 |
7211 | 45 /* BeOS has AF_INET, but not PF_INET. */ |
46 #ifndef PF_INET | |
47 # define PF_INET AF_INET | |
48 #endif | |
49 /* BeOS also lacks PF_UNSPEC. */ | |
50 #ifndef PF_UNSPEC | |
51 # define PF_UNSPEC 0 | |
52 #endif | |
53 | |
6892 | 54 #if defined _WIN32 || defined __WIN32__ |
55 # define WIN32_NATIVE | |
56 #endif | |
57 | |
58 #ifdef WIN32_NATIVE | |
6936
6a9c52cb4144
2006-07-06 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
Simon Josefsson <simon@josefsson.org>
parents:
6924
diff
changeset
|
59 typedef int (WSAAPI *getaddrinfo_func) (const char*, const char*, |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
60 const struct addrinfo*, |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
61 struct addrinfo**); |
6936
6a9c52cb4144
2006-07-06 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
Simon Josefsson <simon@josefsson.org>
parents:
6924
diff
changeset
|
62 typedef void (WSAAPI *freeaddrinfo_func) (struct addrinfo*); |
6a9c52cb4144
2006-07-06 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
Simon Josefsson <simon@josefsson.org>
parents:
6924
diff
changeset
|
63 typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr*, |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
64 socklen_t, char*, DWORD, |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
65 char*, DWORD, int); |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
66 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
67 static getaddrinfo_func getaddrinfo_ptr = NULL; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
68 static freeaddrinfo_func freeaddrinfo_ptr = NULL; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
69 static getnameinfo_func getnameinfo_ptr = NULL; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
70 |
6892 | 71 static int |
72 use_win32_p (void) | |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
73 { |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
74 static int done = 0; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
75 HMODULE h; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
76 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
77 if (done) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
78 return getaddrinfo_ptr ? 1 : 0; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
79 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
80 done = 1; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
81 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
82 h = GetModuleHandle ("ws2_32.dll"); |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
83 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
84 if (h) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
85 { |
6936
6a9c52cb4144
2006-07-06 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
Simon Josefsson <simon@josefsson.org>
parents:
6924
diff
changeset
|
86 getaddrinfo_ptr = (getaddrinfo_func) GetProcAddress (h, "getaddrinfo"); |
6a9c52cb4144
2006-07-06 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
Simon Josefsson <simon@josefsson.org>
parents:
6924
diff
changeset
|
87 freeaddrinfo_ptr = (freeaddrinfo_func) GetProcAddress (h, "freeaddrinfo"); |
6a9c52cb4144
2006-07-06 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
Simon Josefsson <simon@josefsson.org>
parents:
6924
diff
changeset
|
88 getnameinfo_ptr = (getnameinfo_func) GetProcAddress (h, "getnameinfo"); |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
89 } |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
90 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
91 /* If either is missing, something is odd. */ |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
92 if (!getaddrinfo_ptr || !freeaddrinfo_ptr || !getnameinfo_ptr) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
93 { |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
94 getaddrinfo_ptr = NULL; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
95 freeaddrinfo_ptr = NULL; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
96 getnameinfo_ptr = NULL; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
97 return 0; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
98 } |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
99 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
100 return 1; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
101 } |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
102 #endif |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
103 |
5408 | 104 static inline bool |
105 validate_family (int family) | |
106 { | |
107 /* FIXME: Support more families. */ | |
108 #if HAVE_IPV4 | |
109 if (family == PF_INET) | |
110 return true; | |
111 #endif | |
112 #if HAVE_IPV6 | |
113 if (family == PF_INET6) | |
114 return true; | |
115 #endif | |
116 if (family == PF_UNSPEC) | |
117 return true; | |
118 return false; | |
119 } | |
120 | |
121 /* Translate name of a service location and/or a service name to set of | |
122 socket addresses. */ | |
123 int | |
124 getaddrinfo (const char *restrict nodename, | |
125 const char *restrict servname, | |
126 const struct addrinfo *restrict hints, | |
127 struct addrinfo **restrict res) | |
128 { | |
129 struct addrinfo *tmp; | |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
130 int port = 0; |
5408 | 131 struct hostent *he; |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
132 void *storage; |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
133 size_t size; |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
134 #if HAVE_IPV6 |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
135 struct v6_pair { |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
136 struct addrinfo addrinfo; |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
137 struct sockaddr_in6 sockaddr_in6; |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
138 }; |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
139 #endif |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
140 #if HAVE_IPV4 |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
141 struct v4_pair { |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
142 struct addrinfo addrinfo; |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
143 struct sockaddr_in sockaddr_in; |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
144 }; |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
145 #endif |
5408 | 146 |
6892 | 147 #ifdef WIN32_NATIVE |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
148 if (use_win32_p ()) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
149 return getaddrinfo_ptr (nodename, servname, hints, res); |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
150 #endif |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
151 |
7002
df869687851e
2006-07-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
Simon Josefsson <simon@josefsson.org>
parents:
6936
diff
changeset
|
152 if (hints && (hints->ai_flags & ~(AI_CANONNAME|AI_PASSIVE))) |
5408 | 153 /* FIXME: Support more flags. */ |
154 return EAI_BADFLAGS; | |
155 | |
156 if (hints && !validate_family (hints->ai_family)) | |
157 return EAI_FAMILY; | |
158 | |
159 if (hints && | |
5833
98c5aa5b3a1f
getaddrinfo.c: Don't fail when SOCK_STREAM or SOCK_DGRAM are
Simon Josefsson <simon@josefsson.org>
parents:
5408
diff
changeset
|
160 hints->ai_socktype != SOCK_STREAM && hints->ai_socktype != SOCK_DGRAM) |
98c5aa5b3a1f
getaddrinfo.c: Don't fail when SOCK_STREAM or SOCK_DGRAM are
Simon Josefsson <simon@josefsson.org>
parents:
5408
diff
changeset
|
161 /* FIXME: Support other socktype. */ |
98c5aa5b3a1f
getaddrinfo.c: Don't fail when SOCK_STREAM or SOCK_DGRAM are
Simon Josefsson <simon@josefsson.org>
parents:
5408
diff
changeset
|
162 return EAI_SOCKTYPE; /* FIXME: Better return code? */ |
5408 | 163 |
164 if (!nodename) | |
7002
df869687851e
2006-07-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
Simon Josefsson <simon@josefsson.org>
parents:
6936
diff
changeset
|
165 { |
df869687851e
2006-07-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
Simon Josefsson <simon@josefsson.org>
parents:
6936
diff
changeset
|
166 if (!(hints->ai_flags & AI_PASSIVE)) |
df869687851e
2006-07-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
Simon Josefsson <simon@josefsson.org>
parents:
6936
diff
changeset
|
167 return EAI_NONAME; |
df869687851e
2006-07-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
Simon Josefsson <simon@josefsson.org>
parents:
6936
diff
changeset
|
168 |
df869687851e
2006-07-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
Simon Josefsson <simon@josefsson.org>
parents:
6936
diff
changeset
|
169 #ifdef HAVE_IPV6 |
7329
c11bdf6103c7
* getaddrinfo.c (getaddrinfo) [defined HAVE_IPV6]: Fix typo
Paul Eggert <eggert@cs.ucla.edu>
parents:
7211
diff
changeset
|
170 nodename = (hints->ai_family == AF_INET6) ? "::" : "0.0.0.0"; |
7002
df869687851e
2006-07-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
Simon Josefsson <simon@josefsson.org>
parents:
6936
diff
changeset
|
171 #else |
df869687851e
2006-07-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
Simon Josefsson <simon@josefsson.org>
parents:
6936
diff
changeset
|
172 nodename = "0.0.0.0"; |
df869687851e
2006-07-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
Simon Josefsson <simon@josefsson.org>
parents:
6936
diff
changeset
|
173 #endif |
df869687851e
2006-07-22 Yoann Vandoorselaere <yoann.v@prelude-ids.com>
Simon Josefsson <simon@josefsson.org>
parents:
6936
diff
changeset
|
174 } |
5408 | 175 |
176 if (servname) | |
177 { | |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
178 struct servent *se = NULL; |
5408 | 179 const char *proto = |
5833
98c5aa5b3a1f
getaddrinfo.c: Don't fail when SOCK_STREAM or SOCK_DGRAM are
Simon Josefsson <simon@josefsson.org>
parents:
5408
diff
changeset
|
180 (hints && hints->ai_socktype == SOCK_DGRAM) ? "udp" : "tcp"; |
5408 | 181 |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
182 if (!(hints->ai_flags & AI_NUMERICSERV)) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
183 /* FIXME: Use getservbyname_r if available. */ |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
184 se = getservbyname (servname, proto); |
5408 | 185 |
186 if (!se) | |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
187 { |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
188 char *c; |
6902
44315634f193
Fix typo, from Jim Hyslop <jhyslop@dreampossible.ca>.
Simon Josefsson <simon@josefsson.org>
parents:
6892
diff
changeset
|
189 if (!(*servname >= '0' && *servname <= '9')) |
6892 | 190 return EAI_NONAME; |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
191 port = strtoul (servname, &c, 10); |
6892 | 192 if (*c || port > 0xffff) |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
193 return EAI_NONAME; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
194 port = htons (port); |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
195 } |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
196 else |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
197 port = se->s_port; |
5408 | 198 } |
199 | |
200 /* FIXME: Use gethostbyname_r if available. */ | |
201 he = gethostbyname (nodename); | |
202 if (!he || he->h_addr_list[0] == NULL) | |
203 return EAI_NONAME; | |
204 | |
205 switch (he->h_addrtype) | |
206 { | |
207 #if HAVE_IPV6 | |
208 case PF_INET6: | |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
209 size = sizeof (struct v6_pair); |
5408 | 210 break; |
211 #endif | |
212 | |
213 #if HAVE_IPV4 | |
214 case PF_INET: | |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
215 size = sizeof (struct v4_pair); |
5408 | 216 break; |
217 #endif | |
218 | |
219 default: | |
220 return EAI_NODATA; | |
221 } | |
222 | |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
223 storage = calloc (1, size); |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
224 if (!storage) |
5408 | 225 return EAI_MEMORY; |
226 | |
227 switch (he->h_addrtype) | |
228 { | |
229 #if HAVE_IPV6 | |
230 case PF_INET6: | |
231 { | |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
232 struct v6_pair *p = storage; |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
233 struct sockaddr_in6 *sinp = &p->sockaddr_in6; |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
234 tmp = &p->addrinfo; |
5408 | 235 |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
236 if (port) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
237 sinp->sin6_port = port; |
5408 | 238 |
239 if (he->h_length != sizeof (sinp->sin6_addr)) | |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
240 { |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
241 free (storage); |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
242 return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */ |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
243 } |
5408 | 244 |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
245 memcpy (&sinp->sin6_addr, he->h_addr_list[0], sizeof sinp->sin6_addr); |
5408 | 246 |
247 tmp->ai_addr = (struct sockaddr *) sinp; | |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
248 tmp->ai_addrlen = sizeof *sinp; |
5408 | 249 } |
250 break; | |
251 #endif | |
252 | |
253 #if HAVE_IPV4 | |
254 case PF_INET: | |
255 { | |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
256 struct v4_pair *p = storage; |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
257 struct sockaddr_in *sinp = &p->sockaddr_in; |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
258 tmp = &p->addrinfo; |
5408 | 259 |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
260 if (port) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
261 sinp->sin_port = port; |
5408 | 262 |
263 if (he->h_length != sizeof (sinp->sin_addr)) | |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
264 { |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
265 free (storage); |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
266 return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */ |
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
267 } |
5408 | 268 |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
269 memcpy (&sinp->sin_addr, he->h_addr_list[0], sizeof sinp->sin_addr); |
5408 | 270 |
271 tmp->ai_addr = (struct sockaddr *) sinp; | |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
272 tmp->ai_addrlen = sizeof *sinp; |
5408 | 273 } |
274 break; | |
275 #endif | |
276 | |
277 default: | |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
278 free (storage); |
5408 | 279 return EAI_NODATA; |
280 } | |
281 | |
6224
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
282 if (hints && hints->ai_flags & AI_CANONNAME) |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
283 { |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
284 const char *cn; |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
285 if (he->h_name) |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
286 cn = he->h_name; |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
287 else |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
288 cn = nodename; |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
289 |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
290 tmp->ai_canonname = strdup (cn); |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
291 if (!tmp->ai_canonname) |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
292 { |
6284
9500c37faeb5
* lib/getaddrinfo.c [HAVE_NETINET_IN_H]: Include <netinet/in.h>.
Paul Eggert <eggert@cs.ucla.edu>
parents:
6265
diff
changeset
|
293 free (storage); |
6224
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
294 return EAI_MEMORY; |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
295 } |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
296 } |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
297 |
5833
98c5aa5b3a1f
getaddrinfo.c: Don't fail when SOCK_STREAM or SOCK_DGRAM are
Simon Josefsson <simon@josefsson.org>
parents:
5408
diff
changeset
|
298 tmp->ai_protocol = (hints) ? hints->ai_protocol : 0; |
98c5aa5b3a1f
getaddrinfo.c: Don't fail when SOCK_STREAM or SOCK_DGRAM are
Simon Josefsson <simon@josefsson.org>
parents:
5408
diff
changeset
|
299 tmp->ai_socktype = (hints) ? hints->ai_socktype : 0; |
5408 | 300 tmp->ai_addr->sa_family = he->h_addrtype; |
6852
9582dd5af1a5
Fix getaddrinfo on Windows 2000.
Simon Josefsson <simon@josefsson.org>
parents:
6284
diff
changeset
|
301 tmp->ai_family = he->h_addrtype; |
5408 | 302 |
303 /* FIXME: If more than one address, create linked list of addrinfo's. */ | |
304 | |
305 *res = tmp; | |
306 | |
307 return 0; | |
308 } | |
309 | |
310 /* Free `addrinfo' structure AI including associated storage. */ | |
311 void | |
312 freeaddrinfo (struct addrinfo *ai) | |
313 { | |
6892 | 314 #ifdef WIN32_NATIVE |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
315 if (use_win32_p ()) |
6936
6a9c52cb4144
2006-07-06 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
Simon Josefsson <simon@josefsson.org>
parents:
6924
diff
changeset
|
316 { |
6a9c52cb4144
2006-07-06 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
Simon Josefsson <simon@josefsson.org>
parents:
6924
diff
changeset
|
317 freeaddrinfo_ptr (ai); |
6a9c52cb4144
2006-07-06 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
Simon Josefsson <simon@josefsson.org>
parents:
6924
diff
changeset
|
318 return; |
6a9c52cb4144
2006-07-06 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
Simon Josefsson <simon@josefsson.org>
parents:
6924
diff
changeset
|
319 } |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
320 #endif |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
321 |
5408 | 322 while (ai) |
323 { | |
324 struct addrinfo *cur; | |
325 | |
326 cur = ai; | |
327 ai = ai->ai_next; | |
6224
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
328 |
85d0a6143cc4
* modules/canon-host: Add canon-host.h. Depend on getaddrinfo. Make
Derek R. Price <derek@ximbiot.com>
parents:
5848
diff
changeset
|
329 if (cur->ai_canonname) free (cur->ai_canonname); |
5408 | 330 free (cur); |
331 } | |
332 } | |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
333 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
334 int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
335 char *restrict node, socklen_t nodelen, |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
336 char *restrict service, socklen_t servicelen, |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
337 int flags) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
338 { |
6936
6a9c52cb4144
2006-07-06 Jim Hyslop <jhyslop@dreampossible.ca> (tiny change)
Simon Josefsson <simon@josefsson.org>
parents:
6924
diff
changeset
|
339 #ifdef WIN32_NATIVE |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
340 if (use_win32_p ()) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
341 return getnameinfo_ptr (sa, salen, node, nodelen, |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
342 service, servicelen, flags); |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
343 #endif |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
344 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
345 /* FIXME: Support other flags. */ |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
346 if ((node && nodelen > 0 && !(flags & NI_NUMERICHOST)) || |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
347 (service && servicelen > 0 && !(flags & NI_NUMERICHOST)) || |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
348 (flags & ~(NI_NUMERICHOST|NI_NUMERICSERV))) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
349 return EAI_BADFLAGS; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
350 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
351 if (sa == NULL || salen < sizeof (sa->sa_family)) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
352 return EAI_FAMILY; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
353 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
354 switch (sa->sa_family) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
355 { |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
356 #if HAVE_IPV4 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
357 case AF_INET: |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
358 if (salen < sizeof (struct sockaddr_in)) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
359 return EAI_FAMILY; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
360 break; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
361 #endif |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
362 #if HAVE_IPV6 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
363 case AF_INET6: |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
364 if (salen < sizeof (struct sockaddr_in6)) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
365 return EAI_FAMILY; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
366 break; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
367 #endif |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
368 default: |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
369 return EAI_FAMILY; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
370 } |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
371 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
372 if (node && nodelen > 0 && flags & NI_NUMERICHOST) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
373 { |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
374 switch (sa->sa_family) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
375 { |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
376 #if HAVE_IPV4 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
377 case AF_INET: |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
378 if (!inet_ntop (AF_INET, |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
379 &(((const struct sockaddr_in *) sa)->sin_addr), |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
380 node, nodelen)) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
381 return EAI_SYSTEM; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
382 break; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
383 #endif |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
384 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
385 #if HAVE_IPV6 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
386 case AF_INET6: |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
387 if (!inet_ntop (AF_INET6, |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
388 &(((const struct sockaddr_in6 *) sa)->sin6_addr), |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
389 node, nodelen)) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
390 return EAI_SYSTEM; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
391 break; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
392 #endif |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
393 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
394 default: |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
395 return EAI_FAMILY; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
396 } |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
397 } |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
398 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
399 if (service && servicelen > 0 && flags & NI_NUMERICSERV) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
400 switch (sa->sa_family) |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
401 { |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
402 #if HAVE_IPV4 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
403 case AF_INET: |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
404 #endif |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
405 #if HAVE_IPV6 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
406 case AF_INET6: |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
407 #endif |
7543
8c6aad2a3515
* lib/getaddrinfo.c (getnameinfo): Use new lightweight uinttostr,
Jim Meyering <jim@meyering.net>
parents:
7329
diff
changeset
|
408 { |
8c6aad2a3515
* lib/getaddrinfo.c (getnameinfo): Use new lightweight uinttostr,
Jim Meyering <jim@meyering.net>
parents:
7329
diff
changeset
|
409 unsigned short int port |
8c6aad2a3515
* lib/getaddrinfo.c (getnameinfo): Use new lightweight uinttostr,
Jim Meyering <jim@meyering.net>
parents:
7329
diff
changeset
|
410 = ntohs (((const struct sockaddr_in *) sa)->sin_port); |
8c6aad2a3515
* lib/getaddrinfo.c (getnameinfo): Use new lightweight uinttostr,
Jim Meyering <jim@meyering.net>
parents:
7329
diff
changeset
|
411 char buf[INT_BUFSIZE_BOUND (port)]; |
8c6aad2a3515
* lib/getaddrinfo.c (getnameinfo): Use new lightweight uinttostr,
Jim Meyering <jim@meyering.net>
parents:
7329
diff
changeset
|
412 char const *s = uinttostr (port, buf); |
8c6aad2a3515
* lib/getaddrinfo.c (getnameinfo): Use new lightweight uinttostr,
Jim Meyering <jim@meyering.net>
parents:
7329
diff
changeset
|
413 if (strlen (s) + 1 > servicelen) |
8c6aad2a3515
* lib/getaddrinfo.c (getnameinfo): Use new lightweight uinttostr,
Jim Meyering <jim@meyering.net>
parents:
7329
diff
changeset
|
414 return EAI_OVERFLOW; |
8c6aad2a3515
* lib/getaddrinfo.c (getnameinfo): Use new lightweight uinttostr,
Jim Meyering <jim@meyering.net>
parents:
7329
diff
changeset
|
415 memcpy (service, s, strlen (s) + 1); |
8c6aad2a3515
* lib/getaddrinfo.c (getnameinfo): Use new lightweight uinttostr,
Jim Meyering <jim@meyering.net>
parents:
7329
diff
changeset
|
416 } |
6875
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
417 break; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
418 } |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
419 |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
420 return 0; |
41254433d288
Native win32 support for getaddrinfo. Add getnameinfo function.
Simon Josefsson <simon@josefsson.org>
parents:
6852
diff
changeset
|
421 } |