X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=dirmngr%2Fks-engine-hkp.c;h=2b90441e2d14408e665fdf0e1f8017fb7e5e147b;hb=39963d75a770141060dd104f54c1fdc0cf12bbd6;hp=57e7529f33f6acb1bceae5ff1e34fb4dfc78dcf1;hpb=fe6a1536eac3296341777a40ecb9ad6f8bf3c1d1;p=gnupg2.git diff --git a/dirmngr/ks-engine-hkp.c b/dirmngr/ks-engine-hkp.c index 57e7529..2b90441 100644 --- a/dirmngr/ks-engine-hkp.c +++ b/dirmngr/ks-engine-hkp.c @@ -203,6 +203,25 @@ host_in_pool_p (int *pool, int tblidx) } +static int +host_is_alive (hostinfo_t hi, time_t curtime) +{ + if (!hi) + return 0; + if (!hi->dead) + return 1; + if (!hi->died_at) + return 0; /* manually marked dead */ + if (hi->died_at + RESURRECT_INTERVAL <= curtime + || hi->died_at > curtime) + { + hi->dead = 0; + log_info ("resurrected host '%s'", hi->name); + return 1; + } + return 0; +} + /* Select a random host. Consult TABLE which indices into the global hosttable. Returns index into TABLE or -1 if no host could be selected. */ @@ -212,11 +231,13 @@ select_random_host (int *table) int *tbl = NULL; size_t tblsize = 0; int pidx, idx; + time_t curtime; + curtime = gnupg_get_time (); /* We create a new table so that we randomly select only from currently alive hosts. */ for (idx=0; (pidx = table[idx]) != -1; idx++) - if (hosttable[pidx] && !hosttable[pidx]->dead) + if (hosttable[pidx] && host_is_alive (hosttable[pidx], curtime)) { tblsize++; tbl = xtryrealloc(tbl, tblsize * sizeof *tbl); @@ -395,6 +416,7 @@ map_host (ctrl_t ctrl, const char *name, const char *srvtag, int force_reselect, gpg_error_t err = 0; hostinfo_t hi; int idx; + time_t curtime; *r_host = NULL; if (r_httpflags) @@ -531,6 +553,7 @@ map_host (ctrl_t ctrl, const char *name, const char *srvtag, int force_reselect, xfree (reftbl); } + curtime = gnupg_get_time (); hi = hosttable[idx]; if (hi->pool) { @@ -547,7 +570,7 @@ map_host (ctrl_t ctrl, const char *name, const char *srvtag, int force_reselect, if (force_reselect) hi->poolidx = -1; else if (hi->poolidx >= 0 && hi->poolidx < hosttable_size - && hosttable[hi->poolidx] && hosttable[hi->poolidx]->dead) + && hosttable[hi->poolidx] && !host_is_alive (hosttable[hi->poolidx], curtime)) hi->poolidx = -1; /* Select a host if needed. */ @@ -599,7 +622,7 @@ map_host (ctrl_t ctrl, const char *name, const char *srvtag, int force_reselect, free_dns_addrinfo (aibuf); } - if (hi->dead) + if (!host_is_alive (hi, curtime)) { log_error ("host '%s' marked as dead\n", hi->name); if (r_httphost) @@ -704,7 +727,8 @@ ks_hkp_mark_host (ctrl_t ctrl, const char *name, int alive) { gpg_error_t err = 0; hostinfo_t hi, hi2; - int idx, idx2, idx3, n; + int idx, idx2, idx3, n, is_alive; + time_t curtime; if (!name || !*name || !strcmp (name, "localhost")) return 0; @@ -713,13 +737,15 @@ ks_hkp_mark_host (ctrl_t ctrl, const char *name, int alive) if (idx == -1) return gpg_error (GPG_ERR_NOT_FOUND); + curtime = gnupg_get_time (); hi = hosttable[idx]; - if (alive && hi->dead) + is_alive = host_is_alive (hi, curtime); + if (alive && !is_alive) { hi->dead = 0; err = ks_printf_help (ctrl, "marking '%s' as alive", name); } - else if (!alive && !hi->dead) + else if (!alive && is_alive) { hi->dead = 1; hi->died_at = 0; /* Manually set dead. */ @@ -751,14 +777,15 @@ ks_hkp_mark_host (ctrl_t ctrl, const char *name, int alive) hi2 = hosttable[n]; if (!hi2) - ; - else if (alive && hi2->dead) + continue; + is_alive = host_is_alive (hi2, curtime); + if (alive && !is_alive) { hi2->dead = 0; err = ks_printf_help (ctrl, "marking '%s' as alive", hi2->name); } - else if (!alive && !hi2->dead) + else if (!alive && is_alive) { hi2->dead = 1; hi2->died_at = 0; /* Manually set dead. */ @@ -974,34 +1001,6 @@ ks_hkp_resolve (ctrl_t ctrl, parsed_uri_t uri) } -/* Housekeeping function called from the housekeeping thread. It is - used to mark dead hosts alive so that they may be tried again after - some time. */ -void -ks_hkp_housekeeping (time_t curtime) -{ - int idx; - hostinfo_t hi; - - for (idx=0; idx < hosttable_size; idx++) - { - hi = hosttable[idx]; - if (!hi) - continue; - if (!hi->dead) - continue; - if (!hi->died_at) - continue; /* Do not resurrect manually shot hosts. */ - if (hi->died_at + RESURRECT_INTERVAL <= curtime - || hi->died_at > curtime) - { - hi->dead = 0; - log_info ("resurrected host '%s'", hi->name); - } - } -} - - /* Reload (SIGHUP) action for this module. We mark all host alive * even those which have been manually shot. */ void