1748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/*
2748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat This file is part of libmicrohttpd
3748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat Copyright (C) 2007 Christian Grothoff
4748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
5748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat libmicrohttpd is free software; you can redistribute it and/or modify
6748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat it under the terms of the GNU General Public License as published
7748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat by the Free Software Foundation; either version 2, or (at your
8748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat option) any later version.
9748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
10748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat libmicrohttpd is distributed in the hope that it will be useful, but
11748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat WITHOUT ANY WARRANTY; without even the implied warranty of
12748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat General Public License for more details.
14748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
15748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat You should have received a copy of the GNU General Public License
16748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat along with libmicrohttpd; see the file COPYING.  If not, write to the
17748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat Boston, MA 02111-1307, USA.
19748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
20748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
21748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat/**
22748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @file test_https_get_select.c
23748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @brief  Testcase for libmicrohttpd HTTPS GET operations
24748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat * @author Sagie Amir
25748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat */
26748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
27748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "platform.h"
28748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "microhttpd.h"
29748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <limits.h>
30748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <sys/stat.h>
31748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <curl/curl.h>
32748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include <gcrypt.h>
33748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#include "tls_test_common.h"
34748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
35748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratextern const char srv_key_pem[];
36748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratextern const char srv_self_signed_cert_pem[];
37748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratextern const char srv_signed_cert_pem[];
38748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratextern const char srv_signed_key_pem[];
39748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
40748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int oneone;
41748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
42748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int
43748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratahc_echo (void *cls,
44748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          struct MHD_Connection *connection,
45748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          const char *url,
46748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          const char *method,
47748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          const char *version,
48748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          const char *upload_data, size_t *upload_data_size,
49748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          void **unused)
50748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
51748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  static int ptr;
52748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  const char *me = cls;
53748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct MHD_Response *response;
54748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  int ret;
55748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
56748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (0 != strcmp (me, method))
57748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return MHD_NO;              /* unexpected method */
58748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (&ptr != *unused)
59748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
60748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      *unused = &ptr;
61748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      return MHD_YES;
62748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
63748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  *unused = NULL;
64748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  response = MHD_create_response_from_buffer (strlen (url),
65748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat					      (void *) url,
66748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat					      MHD_RESPMEM_MUST_COPY);
67748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  ret = MHD_queue_response (connection, MHD_HTTP_OK, response);
68748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  MHD_destroy_response (response);
69748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (ret == MHD_NO)
70748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    abort ();
71748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return ret;
72748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
73748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
74748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
75748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratstatic int
76748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel ErattestExternalGet (int flags)
77748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
78748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct MHD_Daemon *d;
79748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  CURL *c;
80748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  char buf[2048];
81748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct CBC cbc;
82748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  CURLM *multi;
83748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  CURLMcode mret;
84748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  fd_set rs;
85748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  fd_set ws;
86748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  fd_set es;
87748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  MHD_socket max;
88748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  int running;
89748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct CURLMsg *msg;
90748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  time_t start;
91748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  struct timeval tv;
92748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  const char *aes256_sha = "AES256-SHA";
93748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
94748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  multi = NULL;
95748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  cbc.buf = buf;
96748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  cbc.size = 2048;
97748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  cbc.pos = 0;
98748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  d = MHD_start_daemon (MHD_USE_DEBUG | MHD_USE_SSL | flags,
99748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        1082, NULL, NULL, &ahc_echo, "GET",
100748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
101748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
102748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat			MHD_OPTION_END);
103748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (d == NULL)
104748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return 256;
105748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
106748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (curl_uses_nss_ssl() == 0)
107748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    aes256_sha = "rsa_aes_256_sha";
108748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
109748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  c = curl_easy_init ();
110748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  curl_easy_setopt (c, CURLOPT_URL, "https://127.0.0.1:1082/hello_world");
111748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer);
112748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc);
113748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  /* TLS options */
114748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  curl_easy_setopt (c, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
115748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  curl_easy_setopt (c, CURLOPT_SSL_CIPHER_LIST, aes256_sha);
116748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  curl_easy_setopt (c, CURLOPT_SSL_VERIFYPEER, 0);
117748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  curl_easy_setopt (c, CURLOPT_SSL_VERIFYHOST, 0);
118748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  curl_easy_setopt (c, CURLOPT_FAILONERROR, 1);
119748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (oneone)
120748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
121748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  else
122748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
123748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L);
124748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 150L);
125748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  /* NOTE: use of CONNECTTIMEOUT without also
126748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     setting NOSIGNAL results in really weird
127748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat     crashes on my system! */
128748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1);
129748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
130748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
131748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  multi = curl_multi_init ();
132748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (multi == NULL)
133748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
134748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      curl_easy_cleanup (c);
135748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      MHD_stop_daemon (d);
136748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      return 512;
137748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
138748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  mret = curl_multi_add_handle (multi, c);
139748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (mret != CURLM_OK)
140748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
141748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      curl_multi_cleanup (multi);
142748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      curl_easy_cleanup (c);
143748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      MHD_stop_daemon (d);
144748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      return 1024;
145748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
146748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  start = time (NULL);
147748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  while ((time (NULL) - start < 5) && (multi != NULL))
148748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
149748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      max = 0;
150748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      FD_ZERO (&rs);
151748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      FD_ZERO (&ws);
152748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      FD_ZERO (&es);
153748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      mret = curl_multi_fdset (multi, &rs, &ws, &es, &max);
154748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (mret != CURLM_OK)
155748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        {
156748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          curl_multi_remove_handle (multi, c);
157748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          curl_multi_cleanup (multi);
158748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          curl_easy_cleanup (c);
159748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          MHD_stop_daemon (d);
160748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          return 2048;
161748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        }
162748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (MHD_YES != MHD_get_fdset (d, &rs, &ws, &es, &max))
163748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        {
164748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          curl_multi_remove_handle (multi, c);
165748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          curl_multi_cleanup (multi);
166748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          curl_easy_cleanup (c);
167748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          MHD_stop_daemon (d);
168748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          return 4096;
169748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        }
170748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      tv.tv_sec = 0;
171748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      tv.tv_usec = 1000;
172748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      select (max + 1, &rs, &ws, &es, &tv);
173748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      curl_multi_perform (multi, &running);
174748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      if (running == 0)
175748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        {
176748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          msg = curl_multi_info_read (multi, &running);
177748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          if (msg == NULL)
178748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat            break;
179748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat          if (msg->msg == CURLMSG_DONE)
180748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat            {
181748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              if (msg->data.result != CURLE_OK)
182748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                printf ("%s failed at %s:%d: `%s'\n",
183748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        "curl_multi_perform",
184748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        __FILE__,
185748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat                        __LINE__, curl_easy_strerror (msg->data.result));
186748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              curl_multi_remove_handle (multi, c);
187748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              curl_multi_cleanup (multi);
188748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              curl_easy_cleanup (c);
189748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              c = NULL;
190748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat              multi = NULL;
191748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat            }
192748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat        }
193748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      MHD_run (d);
194748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
195748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (multi != NULL)
196748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
197748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      curl_multi_remove_handle (multi, c);
198748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      curl_easy_cleanup (c);
199748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      curl_multi_cleanup (multi);
200748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
201748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  MHD_stop_daemon (d);
202748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (cbc.pos != strlen ("/hello_world"))
203748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return 8192;
204748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world")))
205748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    return 16384;
206748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return 0;
207748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
208748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
209748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
210748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratint
211748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Eratmain (int argc, char *const *argv)
212748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat{
213748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  unsigned int errorCount = 0;
214748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat
215748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (0 != curl_global_init (CURL_GLOBAL_ALL))
216748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    {
217748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      fprintf (stderr, "Error: %s\n", strerror (errno));
218748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat      return -1;
219748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    }
220748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#if EPOLL_SUPPORT
221748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (0 != (errorCount = testExternalGet (MHD_USE_EPOLL_LINUX_ONLY)))
222748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    fprintf (stderr, "Fail: %d\n", errorCount);
223748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat#endif
224748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  if (0 != (errorCount = testExternalGet (0)))
225748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat    fprintf (stderr, "Fail: %d\n", errorCount);
226748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  curl_global_cleanup ();
227748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat  return errorCount != 0;
228748945ec6f1c67b7efc934ab0808e1d32f2fb98dDaniel Erat}
229