61
/* whether this entry is a positive (successful DNS lookup) or negative (failed DNS lookup, contains an IP address) match */
62
static GHashTable *cache;
63
static DNSCacheEntry cache_first, cache_last, persist_first, persist_last;
69
DNSCacheEntry cache_first;
70
DNSCacheEntry cache_last;
71
DNSCacheEntry persist_first;
72
DNSCacheEntry persist_last;
76
#define cache __tls_deref(cache)
77
#define cache_first __tls_deref(cache_first)
78
#define cache_last __tls_deref(cache_last)
79
#define persist_first __tls_deref(persist_first)
80
#define persist_last __tls_deref(persist_last)
64
82
static gint dns_cache_size = 1007;
65
83
static gint dns_cache_expire = 3600;
66
84
static gint dns_cache_expire_failed = 60;
220
237
inet_pton(family, ip, &ia);
221
dns_cache_store(TRUE, family, &ia, p);
238
dns_cache_store(TRUE, family, &ia, p, TRUE);
254
* @hostname is set to the stored hostname,
255
* @positive is set whether the match was a DNS match or failure
257
* Returns TRUE if the cache was able to serve the request (e.g. had a
258
* matching entry at all).
237
dns_cache_lookup(gint family, void *addr, const gchar **hostname)
261
dns_cache_lookup(gint family, void *addr, const gchar **hostname, gboolean *positive)
240
264
DNSCacheEntry *entry;
243
dns_cache_check_hosts();
267
now = cached_g_current_time_sec();
268
dns_cache_check_hosts(now);
245
270
dns_cache_fill_key(&key, family, addr);
246
271
entry = g_hash_table_lookup(cache, &key);
250
274
if (entry->resolved &&
251
((entry->hostname && entry->resolved < now - dns_cache_expire) ||
252
(!entry->hostname && entry->resolved < now - dns_cache_expire_failed)))
275
((entry->positive && entry->resolved < now - dns_cache_expire) ||
276
(!entry->positive && entry->resolved < now - dns_cache_expire_failed)))
254
278
/* the entry is not persistent and is too old */
258
282
*hostname = entry->hostname;
283
*positive = entry->positive;
266
dns_cache_store(gboolean persistent, gint family, void *addr, const gchar *hostname)
293
dns_cache_store(gboolean persistent, gint family, void *addr, const gchar *hostname, gboolean positive)
268
295
DNSCacheEntry *entry;
273
300
dns_cache_fill_key(&entry->key, family, addr);
274
301
entry->hostname = hostname ? g_strdup(hostname) : NULL;
302
entry->positive = positive;
277
entry->resolved = time(NULL);
305
entry->resolved = cached_g_current_time_sec();
278
306
dns_cache_entry_insert_before(&cache_last, entry);