1 /* Test the getaddrinfo module.
3 Copyright (C) 2006-2011 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 (freeaddrinfo
, void, (struct addrinfo
*));
26 SIGNATURE_CHECK (gai_strerror
, char const *, (int));
27 SIGNATURE_CHECK (getaddrinfo
, int, (char const *, char const *,
28 struct addrinfo
const *,
31 #include <arpa/inet.h>
33 #include <netinet/in.h>
37 /* Whether to print debugging messages. */
38 #define ENABLE_DEBUGGING 0
41 # define dbgprintf printf
43 # define dbgprintf if (0) printf
46 /* BeOS does not have AF_UNSPEC. */
52 # define EAI_SERVICE 0
56 simple (char const *host
, char const *service
)
60 struct addrinfo hints
;
61 struct addrinfo
*ai0
, *ai
;
65 /* Once we skipped the test, do not try anything else */
69 dbgprintf ("Finding %s service %s...\n", host
, service
);
71 /* This initializes "hints" but does not use it. Is there a reason
72 for this? If so, please fix this comment. */
73 memset (&hints
, 0, sizeof (hints
));
74 hints
.ai_flags
= AI_CANONNAME
;
75 hints
.ai_family
= AF_UNSPEC
;
76 hints
.ai_socktype
= SOCK_STREAM
;
78 res
= getaddrinfo (host
, service
, 0, &ai0
);
81 dbgprintf ("res %d: %s\n", res
, gai_strerror (res
));
85 /* EAI_AGAIN is returned if no network is available. Don't fail
86 the test merely because someone is down the country on their
91 fprintf (stderr
, "skipping getaddrinfo test: no network?\n");
94 /* IRIX reports EAI_NONAME for "https". Don't fail the test
95 merely because of this. */
96 if (res
== EAI_NONAME
)
98 /* Solaris reports EAI_SERVICE for "http" and "https". Don't
99 fail the test merely because of this. */
100 if (res
== EAI_SERVICE
)
103 /* AIX reports EAI_NODATA for "https". Don't fail the test
104 merely because of this. */
105 if (res
== EAI_NODATA
)
108 /* Provide details if errno was set. */
109 if (res
== EAI_SYSTEM
)
110 dbgprintf ("system error: %s\n", strerror (err
));
115 for (ai
= ai0
; ai
; ai
= ai
->ai_next
)
117 dbgprintf ("\tflags %x\n", ai
->ai_flags
);
118 dbgprintf ("\tfamily %x\n", ai
->ai_family
);
119 dbgprintf ("\tsocktype %x\n", ai
->ai_socktype
);
120 dbgprintf ("\tprotocol %x\n", ai
->ai_protocol
);
121 dbgprintf ("\taddrlen %ld: ", (unsigned long) ai
->ai_addrlen
);
122 dbgprintf ("\tFound %s\n",
123 inet_ntop (ai
->ai_family
,
124 &((struct sockaddr_in
*)
125 ai
->ai_addr
)->sin_addr
,
126 buf
, sizeof (buf
) - 1));
127 if (ai
->ai_canonname
)
128 dbgprintf ("\tFound %s...\n", ai
->ai_canonname
);
132 char portbuf
[BUFSIZ
];
134 res
= getnameinfo (ai
->ai_addr
, ai
->ai_addrlen
,
135 ipbuf
, sizeof (ipbuf
) - 1,
136 portbuf
, sizeof (portbuf
) - 1,
137 NI_NUMERICHOST
|NI_NUMERICSERV
);
138 dbgprintf ("\t\tgetnameinfo %d: %s\n", res
, gai_strerror (res
));
141 dbgprintf ("\t\tip %s\n", ipbuf
);
142 dbgprintf ("\t\tport %s\n", portbuf
);
153 #define HOST1 "www.gnu.org"
155 #define HOST2 "www.ibm.com"
156 #define SERV2 "https"
157 #define HOST3 "microsoft.com"
159 #define HOST4 "google.org"
164 return simple (HOST1
, SERV1
)
165 + simple (HOST2
, SERV2
)
166 + simple (HOST3
, SERV3
)
167 + simple (HOST4
, SERV4
);