1 From: Werner Koch <wk@gnupg.org>
2 Date: Tue, 24 Jan 2017 18:41:43 +0100
3 Subject: dirmngr: Simplify error returning inside http.c.
5 * dirmngr/http.c (connect_server): Change to return an gpg_error_t
6 and to store socket at the passed address.
7 (http_raw_connect, send_request): Adjust accordingly.
10 This change removes cruft from the code and allows to return the error
11 code from the name lookup.
13 Signed-off-by: Werner Koch <wk@gnupg.org>
14 (cherry picked from commit 51e5a5e5a46279809848b4ab4419f35045336010)
16 dirmngr/http.c | 101 ++++++++++++++++++++++++++++-----------------------------
17 1 file changed, 50 insertions(+), 51 deletions(-)
19 diff --git a/dirmngr/http.c b/dirmngr/http.c
20 index 35877d241..fe9c3c734 100644
23 @@ -155,9 +155,9 @@ static gpg_error_t send_request (http_t hd, const char *httphost,
24 static char *build_rel_path (parsed_uri_t uri);
25 static gpg_error_t parse_response (http_t hd);
27 -static assuan_fd_t connect_server (const char *server, unsigned short port,
28 +static gpg_error_t connect_server (const char *server, unsigned short port,
29 unsigned int flags, const char *srvtag,
30 - int *r_host_not_found);
31 + assuan_fd_t *r_sock);
32 static gpg_error_t write_server (int sock, const char *data, size_t length);
34 static gpgrt_ssize_t cookie_read (void *cookie, void *buffer, size_t size);
35 @@ -924,7 +924,6 @@ http_raw_connect (http_t *r_hd, const char *server, unsigned short port,
43 @@ -950,12 +949,9 @@ http_raw_connect (http_t *r_hd, const char *server, unsigned short port,
47 - sock = connect_server (server, port, hd->flags, srvtag, &hnf);
48 - if (sock == ASSUAN_INVALID_FD)
49 + err = connect_server (server, port, hd->flags, srvtag, &sock);
52 - err = gpg_err_make (default_errsource,
53 - (hnf? GPG_ERR_UNKNOWN_HOST
54 - : gpg_err_code_from_syserror ()));
58 @@ -1643,7 +1639,6 @@ send_request (http_t hd, const char *httphost, const char *auth,
59 char *proxy_authstr = NULL;
64 if (hd->uri->use_tls && !hd->session)
66 @@ -1713,7 +1708,6 @@ send_request (http_t hd, const char *httphost, const char *auth,
74 @@ -1760,25 +1754,20 @@ send_request (http_t hd, const char *httphost, const char *auth,
78 - sock = connect_server (*uri->host ? uri->host : "localhost",
79 - uri->port ? uri->port : 80,
80 - hd->flags, srvtag, &hnf);
82 + err = connect_server (*uri->host ? uri->host : "localhost",
83 + uri->port ? uri->port : 80,
84 + hd->flags, srvtag, &sock);
85 http_release_parsed_uri (uri);
86 - if (sock == ASSUAN_INVALID_FD)
87 - gpg_err_set_errno (save_errno);
91 - sock = connect_server (server, port, hd->flags, srvtag, &hnf);
92 + err = connect_server (server, port, hd->flags, srvtag, &sock);
95 - if (sock == ASSUAN_INVALID_FD)
98 xfree (proxy_authstr);
99 - return gpg_err_make (default_errsource,
100 - (hnf? GPG_ERR_UNKNOWN_HOST
101 - : gpg_err_code_from_syserror ()));
104 hd->sock = my_socket_new (sock);
106 @@ -1788,7 +1777,6 @@ send_request (http_t hd, const char *httphost, const char *auth,
112 if (hd->uri->use_tls)
114 @@ -2476,11 +2464,13 @@ my_sock_new_for_addr (struct sockaddr *addr, int type, int proto)
118 -/* Actually connect to a server. Returns the file descriptor or -1 on
119 - error. ERRNO is set on error. */
121 +/* Actually connect to a server. On success 0 is returned and the
122 + * file descriptor for the socket is stored at R_SOCK; on error an
123 + * error code is returned and ASSUAN_INVALID_FD is stored at
126 connect_server (const char *server, unsigned short port,
127 - unsigned int flags, const char *srvtag, int *r_host_not_found)
128 + unsigned int flags, const char *srvtag, assuan_fd_t *r_sock)
131 assuan_fd_t sock = ASSUAN_INVALID_FD;
132 @@ -2488,11 +2478,11 @@ connect_server (const char *server, unsigned short port,
136 - int last_errno = 0;
137 + gpg_error_t last_err = 0;
138 struct srventry *serverlist = NULL;
141 - *r_host_not_found = 0;
142 + *r_sock = ASSUAN_INVALID_FD;
144 #if defined(HAVE_W32_SYSTEM) && !defined(HTTP_NO_WSASTARTUP)
147 @@ -2509,18 +2499,21 @@ connect_server (const char *server, unsigned short port,
149 if (sock == ASSUAN_INVALID_FD)
151 - if (errno == EHOSTUNREACH)
152 - *r_host_not_found = 1;
153 - log_error ("can't connect to '%s': %s\n", server, strerror (errno));
154 + err = gpg_err_make (default_errsource,
155 + (errno == EHOSTUNREACH)? GPG_ERR_UNKNOWN_HOST
156 + : gpg_err_code_from_syserror ());
157 + log_error ("can't connect to '%s': %s\n", server, gpg_strerror (err));
161 - notify_netactivity ();
164 + notify_netactivity ();
168 #else /*!ASSUAN_SOCK_TOR*/
170 - gpg_err_set_errno (ENETUNREACH);
171 - return -1; /* Out of core. */
172 + err = gpg_err_make (default_errsource, GPG_ERR_ENETUNREACH);
173 + return ASSUAN_INVALID_FD;
175 #endif /*!HASSUAN_SOCK_TOR*/
177 @@ -2533,6 +2526,7 @@ connect_server (const char *server, unsigned short port,
178 log_info ("getting '%s' SRV for '%s' failed: %s\n",
179 srvtag, server, gpg_strerror (err));
180 /* Note that on error SRVCOUNT is zero. */
185 @@ -2541,7 +2535,8 @@ connect_server (const char *server, unsigned short port,
186 up a fake SRV record. */
187 serverlist = xtrycalloc (1, sizeof *serverlist);
189 - return -1; /* Out of core. */
190 + return gpg_err_make (default_errsource, gpg_err_code_from_syserror ());
192 serverlist->port = port;
193 strncpy (serverlist->target, server, DIMof (struct srventry, target));
194 serverlist->target[DIMof (struct srventry, target)-1] = '\0';
195 @@ -2562,6 +2557,7 @@ connect_server (const char *server, unsigned short port,
197 log_info ("resolving '%s' failed: %s\n",
198 serverlist[srv].target, gpg_strerror (err));
200 continue; /* Not found - try next one. */
203 @@ -2578,18 +2574,20 @@ connect_server (const char *server, unsigned short port,
204 sock = my_sock_new_for_addr (ai->addr, ai->socktype, ai->protocol);
205 if (sock == ASSUAN_INVALID_FD)
207 - int save_errno = errno;
208 - log_error ("error creating socket: %s\n", strerror (errno));
209 + err = gpg_err_make (default_errsource,
210 + gpg_err_code_from_syserror ());
211 + log_error ("error creating socket: %s\n", gpg_strerror (err));
212 free_dns_addrinfo (aibuf);
214 - errno = save_errno;
215 - return ASSUAN_INVALID_FD;
220 - ret = assuan_sock_connect (sock, ai->addr, ai->addrlen);
222 - last_errno = errno;
223 + if (assuan_sock_connect (sock, ai->addr, ai->addrlen))
225 + last_err = gpg_err_make (default_errsource,
226 + gpg_err_code_from_syserror ());
231 @@ -2616,17 +2614,18 @@ connect_server (const char *server, unsigned short port,
232 server, (int)WSAGetLastError());
234 log_error ("can't connect to '%s': %s\n",
235 - server, strerror (last_errno));
236 + server, gpg_strerror (last_err));
239 - if (!hostfound || (hostfound && !anyhostaddr))
240 - *r_host_not_found = 1;
241 + err = last_err? last_err : gpg_err_make (default_errsource,
242 + GPG_ERR_UNKNOWN_HOST);
243 if (sock != ASSUAN_INVALID_FD)
244 assuan_sock_close (sock);
245 - gpg_err_set_errno (last_errno);
246 - return ASSUAN_INVALID_FD;