diff options
author | Werner Koch <[email protected]> | 2014-03-12 13:32:34 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2014-03-12 13:33:51 +0000 |
commit | fb56a273b1f2b3a99dc1d1a0850378ab7625e6b9 (patch) | |
tree | 84bb489088b737fccafc5fec5d9fd07a8ce7ac4c /dirmngr/ks-action.c | |
parent | Comment typo fixes (diff) | |
download | gnupg-fb56a273b1f2b3a99dc1d1a0850378ab7625e6b9.tar.gz gnupg-fb56a273b1f2b3a99dc1d1a0850378ab7625e6b9.zip |
dirmngr: Detect dead keyservers and try another one.
* dirmngr/ks-action.c (ks_action_resolve): Rename var for clarity.
(ks_action_search, ks_action_put): Ditto.
(ks_action_get): Consult only the first server which retruned some
data.
* dirmngr/ks-engine-hkp.c (SEND_REQUEST_RETRIES): New.
(map_host): Add arg CTRL and call dirmngr_tick.
(make_host_part): Add arg CTRL.
(mark_host_dead): Allow the use of an URL.
(handle_send_request_error): New.
(ks_hkp_search, ks_hkp_get, ks_hkp_put): Mark host dead and retry on
error.
Diffstat (limited to 'dirmngr/ks-action.c')
-rw-r--r-- | dirmngr/ks-action.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/dirmngr/ks-action.c b/dirmngr/ks-action.c index dfeb862f6..495f7fa93 100644 --- a/dirmngr/ks-action.c +++ b/dirmngr/ks-action.c @@ -120,21 +120,21 @@ gpg_error_t ks_action_resolve (ctrl_t ctrl) { gpg_error_t err = 0; - int any = 0; + int any_server = 0; uri_item_t uri; for (uri = ctrl->keyservers; !err && uri; uri = uri->next) { if (uri->parsed_uri->is_http) { - any = 1; + any_server = 1; err = ks_hkp_resolve (ctrl, uri->parsed_uri); if (err) break; } } - if (!any) + if (!any_server) err = gpg_error (GPG_ERR_NO_KEYSERVER); return err; } @@ -146,7 +146,7 @@ gpg_error_t ks_action_search (ctrl_t ctrl, strlist_t patterns, estream_t outfp) { gpg_error_t err = 0; - int any = 0; + int any_server = 0; uri_item_t uri; estream_t infp; @@ -163,7 +163,7 @@ ks_action_search (ctrl_t ctrl, strlist_t patterns, estream_t outfp) { if (uri->parsed_uri->is_http) { - any = 1; + any_server = 1; err = ks_hkp_search (ctrl, uri->parsed_uri, patterns->d, &infp); if (!err) { @@ -174,7 +174,7 @@ ks_action_search (ctrl_t ctrl, strlist_t patterns, estream_t outfp) } } - if (!any) + if (!any_server) err = gpg_error (GPG_ERR_NO_KEYSERVER); return err; } @@ -187,7 +187,8 @@ ks_action_get (ctrl_t ctrl, strlist_t patterns, estream_t outfp) { gpg_error_t err = 0; gpg_error_t first_err = 0; - int any = 0; + int any_server = 0; + int any_data = 0; strlist_t sl; uri_item_t uri; estream_t infp; @@ -205,7 +206,7 @@ ks_action_get (ctrl_t ctrl, strlist_t patterns, estream_t outfp) { if (uri->parsed_uri->is_http) { - any = 1; + any_server = 1; for (sl = patterns; !err && sl; sl = sl->next) { err = ks_hkp_get (ctrl, uri->parsed_uri, sl->d, &infp); @@ -224,17 +225,21 @@ ks_action_get (ctrl_t ctrl, strlist_t patterns, estream_t outfp) err = copy_stream (infp, outfp); /* Reading from the keyserver should never fail, thus return this error. */ + if (!err) + any_data = 1; es_fclose (infp); infp = NULL; } } } + if (any_data) + break; /* Stop loop after a keyserver returned something. */ } - if (!any) + if (!any_server) err = gpg_error (GPG_ERR_NO_KEYSERVER); - else if (!err && first_err) - err = first_err; /* fixme: Do we really want to do that? */ + else if (!err && first_err && !any_data) + err = first_err; return err; } @@ -302,14 +307,14 @@ ks_action_put (ctrl_t ctrl, const void *data, size_t datalen) { gpg_error_t err = 0; gpg_error_t first_err = 0; - int any = 0; + int any_server = 0; uri_item_t uri; for (uri = ctrl->keyservers; !err && uri; uri = uri->next) { if (uri->parsed_uri->is_http) { - any = 1; + any_server = 1; err = ks_hkp_put (ctrl, uri->parsed_uri, data, datalen); if (err) { @@ -319,9 +324,9 @@ ks_action_put (ctrl_t ctrl, const void *data, size_t datalen) } } - if (!any) + if (!any_server) err = gpg_error (GPG_ERR_NO_KEYSERVER); else if (!err && first_err) - err = first_err; /* fixme: Do we really want to do that? */ + err = first_err; return err; } |