1 /* Test the getaddrinfo module.
3 Copyright (C) 2006-2017 Free Software Foundation, Inc.
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 /* Written by Simon Josefsson. */
24 #include "signature.h"
25 SIGNATURE_CHECK (gai_strerror
, char const *, (int));
26 /* On native Windows, these two functions may have the __stdcall calling
27 convention. But the SIGNATURE_CHECK works only for functions with __cdecl
28 calling convention. */
29 #if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
30 SIGNATURE_CHECK (freeaddrinfo
, void, (struct addrinfo
*));
31 SIGNATURE_CHECK (getaddrinfo
, int, (char const *, char const *,
32 struct addrinfo
const *,
36 #include <arpa/inet.h>
38 #include <netinet/in.h>
42 /* Whether to print debugging messages. */
43 #define ENABLE_DEBUGGING 0
46 # define dbgprintf printf
48 # define dbgprintf if (0) printf
51 /* BeOS does not have AF_UNSPEC. */
57 # define EAI_SERVICE 0
61 simple (char const *host
, char const *service
)
65 struct addrinfo hints
;
66 struct addrinfo
*ai0
, *ai
;
70 /* Once we skipped the test, do not try anything else */
74 dbgprintf ("Finding %s service %s...\n", host
, service
);
76 /* This initializes "hints" but does not use it. Is there a reason
77 for this? If so, please fix this comment. */
78 memset (&hints
, 0, sizeof (hints
));
79 hints
.ai_flags
= AI_CANONNAME
;
80 hints
.ai_family
= AF_UNSPEC
;
81 hints
.ai_socktype
= SOCK_STREAM
;
83 res
= getaddrinfo (host
, service
, 0, &ai0
);
86 dbgprintf ("res %d: %s\n", res
, gai_strerror (res
));
90 /* EAI_AGAIN is returned if no network is available. Don't fail
91 the test merely because someone is down the country on their
96 fprintf (stderr
, "skipping getaddrinfo test: no network?\n");
99 /* IRIX reports EAI_NONAME for "https". Don't fail the test
100 merely because of this. */
101 if (res
== EAI_NONAME
)
103 /* Solaris reports EAI_SERVICE for "http" and "https". Don't
104 fail the test merely because of this. */
105 if (res
== EAI_SERVICE
)
108 /* AIX reports EAI_NODATA for "https". Don't fail the test
109 merely because of this. */
110 if (res
== EAI_NODATA
)
113 /* Provide details if errno was set. */
114 if (res
== EAI_SYSTEM
)
115 fprintf (stderr
, "system error: %s\n", strerror (err
));
120 for (ai
= ai0
; ai
; ai
= ai
->ai_next
)
122 void *ai_addr
= ai
->ai_addr
;
123 struct sockaddr_in
*sock_addr
= ai_addr
;
124 dbgprintf ("\tflags %x\n", ai
->ai_flags
+ 0u);
125 dbgprintf ("\tfamily %x\n", ai
->ai_family
+ 0u);
126 dbgprintf ("\tsocktype %x\n", ai
->ai_socktype
+ 0u);
127 dbgprintf ("\tprotocol %x\n", ai
->ai_protocol
+ 0u);
128 dbgprintf ("\taddrlen %lu: ", (unsigned long) ai
->ai_addrlen
);
129 dbgprintf ("\tFound %s\n",
130 inet_ntop (ai
->ai_family
,
131 &sock_addr
->sin_addr
,
132 buf
, sizeof (buf
) - 1));
133 if (ai
->ai_canonname
)
134 dbgprintf ("\tFound %s...\n", ai
->ai_canonname
);
138 char portbuf
[BUFSIZ
];
140 res
= getnameinfo (ai
->ai_addr
, ai
->ai_addrlen
,
141 ipbuf
, sizeof (ipbuf
) - 1,
142 portbuf
, sizeof (portbuf
) - 1,
143 NI_NUMERICHOST
|NI_NUMERICSERV
);
144 dbgprintf ("\t\tgetnameinfo %d: %s\n", res
, gai_strerror (res
));
147 dbgprintf ("\t\tip %s\n", ipbuf
);
148 dbgprintf ("\t\tport %s\n", portbuf
);
159 #define HOST1 "www.gnu.org"
161 #define HOST2 "www.ibm.com"
162 #define SERV2 "https"
163 #define HOST3 "microsoft.com"
165 #define HOST4 "google.org"
170 return simple (HOST1
, SERV1
)
171 + simple (HOST2
, SERV2
)
172 + simple (HOST3
, SERV3
)
173 + simple (HOST4
, SERV4
);