code to do DNS resolution More...
#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_protocols.h"
#include "../../lib/util/resolver.h"
Go to the source code of this file.
Data Structures | |
struct | RecordListEntry |
Entry in list of cached DNS records for a hostname. More... | |
struct | ResolveCache |
A cached DNS lookup result. More... | |
struct | ActiveLookup |
Information about pending lookups. More... | |
Macros | |
#define | DNS_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) |
How long do we wait for DNS answers? More... | |
#define | MAX_CACHE 1024 |
Maximum number of hostnames we cache results for. More... | |
Functions | |
static void | free_cache_entry (struct ResolveCache *rc) |
Remove entry from cache. More... | |
static void | free_hosts_entry (struct ResolveCache *rc) |
Remove entry from cache. More... | |
static void | free_active_lookup (struct ActiveLookup *al) |
Release resources associated with al. More... | |
static char * | extract_dns_server (const char *line, size_t line_len) |
Find out if the configuration file line contains a string starting with "nameserver ", and if so, return a copy of the nameserver's IP. More... | |
static char * | extract_search_domain (const char *line, size_t line_len) |
Find out if the configuration file line contains a string starting with "search ", and if so, return a copy of the machine's search domain. More... | |
static int | lookup_dns_servers (char ***server_addrs) |
Reads the list of nameservers from /etc/resolve.conf. More... | |
static char * | make_reverse_hostname (const void *ip, int af) |
Compute name to use for DNS reverse lookups from ip. More... | |
static int | send_reply (struct GNUNET_DNSPARSER_Record *record, uint16_t record_type, uint32_t client_request_id, struct GNUNET_SERVICE_Client *client) |
Send DNS record back to our client. More... | |
static void | send_end_msg (uint32_t client_request_id, struct GNUNET_SERVICE_Client *client) |
Send message to client that we transmitted all responses for client_request_id. More... | |
static int | remove_expired (struct ResolveCache *rc) |
Remove expired entries from rc. More... | |
static void | process_get (const char *hostname, uint16_t record_type, uint32_t client_request_id, struct GNUNET_SERVICE_Client *client) |
Process DNS request for hostname with request ID request_id from client demanding records of type record_type. More... | |
static int | try_cache (const char *hostname, uint16_t record_type, uint32_t client_request_id, struct GNUNET_SERVICE_Client *client) |
Get an IP address as a string (works for both IPv4 and IPv6). More... | |
static int | pack (const char *hostname, uint16_t type, uint16_t dns_id, char **packet_buf, size_t *packet_size) |
Create DNS query for hostname of type type with DNS request ID dns_id. More... | |
static void | cache_answers (const char *name, struct GNUNET_DNSPARSER_Record *records, unsigned int num_records) |
static void | handle_resolve_result (void *cls, const struct GNUNET_TUN_DnsHeader *dns, size_t dns_len) |
We got a result from DNS. More... | |
static void | handle_resolve_timeout (void *cls) |
We encountered a timeout trying to perform a DNS lookup. More... | |
static int | resolve_and_cache (const char *hostname, uint16_t record_type, uint32_t client_request_id, struct GNUNET_SERVICE_Client *client) |
Initiate an active lookup, then cache the result and try to then complete the resolution. More... | |
static int | check_get (void *cls, const struct GNUNET_RESOLVER_GetMessage *get) |
Verify well-formedness of GET-message. More... | |
static void | handle_get (void *cls, const struct GNUNET_RESOLVER_GetMessage *msg) |
Handle GET-message. More... | |
static void | shutdown_task (void *cls) |
Service is shutting down, clean up. More... | |
static void | add_host (const char *hostname, uint16_t rec_type, const void *data, size_t data_size) |
Add information about a host from /etc/hosts to our cache. More... | |
static void | extract_hosts (const char *line, size_t line_len) |
Extract host information from a line in /etc/hosts. More... | |
static void | load_etc_hosts (void) |
Reads the list of hosts from /etc/hosts. More... | |
static void | init_cb (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_SERVICE_Handle *sh) |
Service is starting, initialize everything. More... | |
static void * | connect_cb (void *cls, struct GNUNET_SERVICE_Client *c, struct GNUNET_MQ_Handle *mq) |
Callback called when a client connects to the service. More... | |
static void | disconnect_cb (void *cls, struct GNUNET_SERVICE_Client *c, void *internal_cls) |
Callback called when a client disconnected from the service. More... | |
GNUNET_SERVICE_MAIN ("resolver", GNUNET_SERVICE_OPTION_NONE, &init_cb, &connect_cb, &disconnect_cb, NULL, GNUNET_MQ_hd_var_size(get, GNUNET_MESSAGE_TYPE_RESOLVER_REQUEST, struct GNUNET_RESOLVER_GetMessage, NULL), GNUNET_MQ_handler_end()) | |
Define "main" method using service macro. More... | |
Variables | |
static struct ResolveCache * | cache_head |
Start of the linked list of cached DNS lookup results. More... | |
static struct ResolveCache * | cache_tail |
Tail of the linked list of cached DNS lookup results. More... | |
static struct ResolveCache * | hosts_head |
Head of the linked list of DNS lookup results from /etc/hosts. More... | |
static struct ResolveCache * | hosts_tail |
Tail of the linked list of DNS lookup results from /etc/hosts. More... | |
static struct ActiveLookup * | lookup_head |
Start of the linked list of active DNS lookups. More... | |
static struct ActiveLookup * | lookup_tail |
Tail of the linked list of active DNS lookups. More... | |
static struct GNUNET_DNSSTUB_Context * | dnsstub_ctx |
context of dnsstub library More... | |
static char * | my_domain |
My domain, to be appended to the hostname to get a FQDN. More... | |
static unsigned int | cache_size |
How many entries do we have in cache_head DLL? More... | |
code to do DNS resolution
Definition in file gnunet-service-resolver.c.
#define DNS_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) |
How long do we wait for DNS answers?
Definition at line 36 of file gnunet-service-resolver.c.
#define MAX_CACHE 1024 |
Maximum number of hostnames we cache results for.
Definition at line 41 of file gnunet-service-resolver.c.
|
static |
Remove entry from cache.
rc | entry to free |
Definition at line 209 of file gnunet-service-resolver.c.
References cache_head, cache_size, cache_tail, GNUNET_CONTAINER_DLL_remove, GNUNET_DNSPARSER_free_record(), GNUNET_free, ResolveCache::hostname, RecordListEntry::record, ResolveCache::records_head, and ResolveCache::records_tail.
Referenced by handle_resolve_result(), remove_expired(), and shutdown_task().
|
static |
Remove entry from cache.
rc | entry to free |
Definition at line 233 of file gnunet-service-resolver.c.
References cache_size, GNUNET_CONTAINER_DLL_remove, GNUNET_DNSPARSER_free_record(), GNUNET_free, ResolveCache::hostname, hosts_head, hosts_tail, RecordListEntry::record, ResolveCache::records_head, and ResolveCache::records_tail.
Referenced by shutdown_task().
|
static |
Release resources associated with al.
al | an active lookup |
Definition at line 257 of file gnunet-service-resolver.c.
References GNUNET_CONTAINER_DLL_remove, GNUNET_DNSSTUB_resolve_cancel(), GNUNET_free, GNUNET_SCHEDULER_cancel(), ActiveLookup::hostname, lookup_head, lookup_tail, ActiveLookup::resolve_handle, and ActiveLookup::timeout_task.
Referenced by disconnect_cb(), handle_resolve_result(), handle_resolve_timeout(), and shutdown_task().
|
static |
Find out if the configuration file line contains a string starting with "nameserver ", and if so, return a copy of the nameserver's IP.
line | line to parse |
line_len | number of characters in line |
Definition at line 285 of file gnunet-service-resolver.c.
References GNUNET_strndup, and line.
Referenced by lookup_dns_servers().
|
static |
Find out if the configuration file line contains a string starting with "search ", and if so, return a copy of the machine's search domain.
line | line to parse |
line_len | number of characters in line |
Definition at line 304 of file gnunet-service-resolver.c.
References GNUNET_strndup, and line.
Referenced by lookup_dns_servers().
|
static |
Reads the list of nameservers from /etc/resolve.conf.
[out] | server_addrs | a list of null-terminated server address strings |
Definition at line 320 of file gnunet-service-resolver.c.
References extract_dns_server(), extract_search_domain(), GNUNET_array_append, GNUNET_DISK_file_close(), GNUNET_DISK_file_handle_size(), GNUNET_DISK_file_map(), GNUNET_DISK_file_open(), GNUNET_DISK_file_unmap(), GNUNET_DISK_MAP_TYPE_READ, GNUNET_DISK_OPEN_READ, GNUNET_DISK_PERM_NONE, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_OK, mh, my_domain, and SIZE_MAX.
Referenced by init_cb().
|
static |
Compute name to use for DNS reverse lookups from ip.
ip | IP address to resolve, in binary format, network byte order |
af | address family of ip, AF_INET or AF_INET6 |
Definition at line 396 of file gnunet-service-resolver.c.
References GNUNET_free, GNUNET_new_array, and GNUNET_snprintf().
Referenced by handle_get().
|
static |
Send DNS record back to our client.
record | information to transmit |
record_type | requested record type from client |
client_request_id | to which request are we responding |
client | where to send record |
Definition at line 459 of file gnunet-service-resolver.c.
References env, GNUNET_DNSPARSER_TYPE_A, GNUNET_DNSPARSER_TYPE_AAAA, GNUNET_DNSPARSER_TYPE_ALL, GNUNET_DNSPARSER_TYPE_CNAME, GNUNET_DNSPARSER_TYPE_PTR, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_RESOLVER_RESPONSE, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_NO, GNUNET_SERVICE_client_get_mq(), GNUNET_YES, msg, payload, and record().
Referenced by try_cache().
|
static |
Send message to client that we transmitted all responses for client_request_id.
client_request_id | to which request are we responding |
client | where to send record |
Definition at line 525 of file gnunet-service-resolver.c.
References env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MESSAGE_TYPE_RESOLVER_RESPONSE, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_SERVICE_client_get_mq(), and msg.
Referenced by handle_resolve_result(), handle_resolve_timeout(), process_get(), and try_cache().
|
static |
Remove expired entries from rc.
rc | entry in resolver cache |
Definition at line 545 of file gnunet-service-resolver.c.
References GNUNET_TIME_Absolute::abs_value_us, free_cache_entry(), GNUNET_CONTAINER_DLL_remove, GNUNET_DNSPARSER_free_record(), GNUNET_free, GNUNET_NO, GNUNET_TIME_absolute_get(), GNUNET_YES, RecordListEntry::next, ResolveCache::records_head, and ResolveCache::records_tail.
Referenced by try_cache().
|
static |
Process DNS request for hostname with request ID request_id from client demanding records of type record_type.
Process DNS request for hostname with request ID client_request_id from client demanding records of type record_type.
hostname | DNS name to resolve |
record_type | desired record type |
client_request_id | client's request ID |
client | who should get the result? |
Definition at line 946 of file gnunet-service-resolver.c.
References ActiveLookup::client, ActiveLookup::client_request_id, GNUNET_break, GNUNET_NO, GNUNET_OK, GNUNET_SERVICE_client_drop(), GNUNET_snprintf(), ActiveLookup::hostname, my_domain, ActiveLookup::record_type, resolve_and_cache(), send_end_msg(), and try_cache().
Referenced by handle_get(), and try_cache().
|
static |
Get an IP address as a string (works for both IPv4 and IPv6).
Note that the resolution happens asynchronously and that the first call may not immediately result in the FQN (but instead in a human-readable IP address).
hostname | what hostname was to be resolved |
record_type | what type of record was requested |
client_request_id | unique identification of the client's request |
client | handle to the client making the request (for sending the reply) |
Definition at line 598 of file gnunet-service-resolver.c.
References cache_head, cache_tail, GNUNET_CONTAINER_DLL_insert, GNUNET_CONTAINER_DLL_remove, GNUNET_DNSPARSER_TYPE_CNAME, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NO, GNUNET_YES, GNUNET_DNSPARSER_Record::hostname, ResolveCache::hostname, hosts_head, RecordListEntry::next, ResolveCache::next, process_get(), record(), ResolveCache::records_head, remove_expired(), send_end_msg(), and send_reply().
Referenced by handle_resolve_result(), and process_get().
|
static |
Create DNS query for hostname of type type with DNS request ID dns_id.
hostname | DNS name to query | |
type | requested DNS record type | |
dns_id | what should be the DNS request ID | |
[out] | packet_buf | where to write the request packet |
[out] | packet_size | set to size of packet_buf on success |
Definition at line 678 of file gnunet-service-resolver.c.
References GNUNET_DNSPARSER_Query::dns_traffic_class, GNUNET_DNSPARSER_Packet::flags, GNUNET_DNSPARSER_pack(), GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_OK, GNUNET_SYSERR, GNUNET_TUN_DNS_CLASS_INTERNET, GNUNET_DNSPARSER_Packet::id, GNUNET_DNSPARSER_Query::name, GNUNET_DNSPARSER_Packet::num_queries, GNUNET_DNSPARSER_Packet::queries, GNUNET_TUN_DnsFlags::recursion_desired, type, and GNUNET_DNSPARSER_Query::type.
Referenced by handle_resolve_result(), and resolve_and_cache().
|
static |
Definition at line 709 of file gnunet-service-resolver.c.
References cache_head, cache_size, cache_tail, GNUNET_CONTAINER_DLL_insert, GNUNET_DNSPARSER_duplicate_record(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_new, GNUNET_strdup, ResolveCache::hostname, name, ResolveCache::next, record(), RecordListEntry::record, records, ResolveCache::records_head, and ResolveCache::records_tail.
Referenced by handle_resolve_result().
|
static |
We got a result from DNS.
Add it to the cache and see if we can make our client happy...
cls | the struct ActiveLookup |
dns | the DNS response |
dns_len | number of bytes in dns |
Definition at line 752 of file gnunet-service-resolver.c.
References GNUNET_DNSPARSER_Packet::additional_records, GNUNET_DNSPARSER_Packet::answers, GNUNET_DNSPARSER_Packet::authority_records, cache_answers(), cache_size, cache_tail, ActiveLookup::client, ActiveLookup::client_request_id, ActiveLookup::did_aaaa, ActiveLookup::dns_id, dnsstub_ctx, free_active_lookup(), free_cache_entry(), GNUNET_CRYPTO_QUALITY_NONCE, GNUNET_CRYPTO_random_u32(), GNUNET_DNSPARSER_free_packet(), GNUNET_DNSPARSER_parse(), GNUNET_DNSPARSER_TYPE_AAAA, GNUNET_DNSPARSER_TYPE_ALL, GNUNET_DNSSTUB_resolve(), GNUNET_DNSSTUB_resolve_cancel(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_YES, handle_resolve_result(), ActiveLookup::hostname, GNUNET_DNSPARSER_Packet::id, MAX_CACHE, GNUNET_DNSPARSER_Packet::num_additional_records, GNUNET_DNSPARSER_Packet::num_answers, GNUNET_DNSPARSER_Packet::num_authority_records, pack(), ActiveLookup::record_type, ActiveLookup::resolve_handle, send_end_msg(), and try_cache().
Referenced by handle_resolve_result(), and resolve_and_cache().
|
static |
We encountered a timeout trying to perform a DNS lookup.
cls | a struct ActiveLookup |
Definition at line 863 of file gnunet-service-resolver.c.
References ActiveLookup::client, ActiveLookup::client_request_id, free_active_lookup(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, send_end_msg(), and ActiveLookup::timeout_task.
Referenced by resolve_and_cache().
|
static |
Initiate an active lookup, then cache the result and try to then complete the resolution.
hostname | DNS name to resolve |
record_type | record type to locate |
client_request_id | client request ID |
client | handle to the client |
Definition at line 885 of file gnunet-service-resolver.c.
References ActiveLookup::client, ActiveLookup::client_request_id, ActiveLookup::dns_id, DNS_TIMEOUT, dnsstub_ctx, GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_QUALITY_NONCE, GNUNET_CRYPTO_random_u32(), GNUNET_DNSPARSER_TYPE_A, GNUNET_DNSPARSER_TYPE_ALL, GNUNET_DNSSTUB_resolve(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_new, GNUNET_OK, GNUNET_SCHEDULER_add_delayed(), GNUNET_strdup, GNUNET_SYSERR, handle_resolve_result(), handle_resolve_timeout(), ActiveLookup::hostname, lookup_head, lookup_tail, pack(), ActiveLookup::record_type, ActiveLookup::resolve_handle, ActiveLookup::timeout_task, and type.
Referenced by process_get().
|
static |
Verify well-formedness of GET-message.
cls | closure, unused |
get | the actual message |
Definition at line 989 of file gnunet-service-resolver.c.
References direction, get, GNUNET_break, GNUNET_MQ_check_zero_termination, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, and size.
|
static |
Handle GET-message.
cls | identification of the client |
msg | the actual message |
Definition at line 1037 of file gnunet-service-resolver.c.
References direction, GNUNET_assert, GNUNET_DNSPARSER_TYPE_A, GNUNET_DNSPARSER_TYPE_AAAA, GNUNET_DNSPARSER_TYPE_ALL, GNUNET_DNSPARSER_TYPE_PTR, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_NO, GNUNET_SERVICE_client_continue(), GNUNET_strdup, make_reverse_hostname(), msg, and process_get().
|
static |
Service is shutting down, clean up.
cls | NULL, unused |
Definition at line 1107 of file gnunet-service-resolver.c.
References cache_head, dnsstub_ctx, free_active_lookup(), free_cache_entry(), free_hosts_entry(), GNUNET_DNSSTUB_stop(), GNUNET_free, hosts_head, lookup_head, and my_domain.
Referenced by init_cb().
|
static |
Add information about a host from /etc/hosts to our cache.
hostname | the name of the host |
rec_type | DNS record type to use |
data | payload |
data_size | number of bytes in data |
Definition at line 1132 of file gnunet-service-resolver.c.
References data, GNUNET_DNSPARSER_RawRecord::data, GNUNET_DNSPARSER_Record::data, GNUNET_DNSPARSER_RawRecord::data_len, data_size, GNUNET_DNSPARSER_Record::dns_traffic_class, GNUNET_DNSPARSER_Record::expiration_time, GNUNET_CONTAINER_DLL_insert, GNUNET_malloc, GNUNET_memdup, GNUNET_new, GNUNET_strdup, GNUNET_TIME_UNIT_FOREVER_ABS, GNUNET_TUN_DNS_CLASS_INTERNET, GNUNET_DNSPARSER_Record::hostname, ResolveCache::hostname, hosts_head, hosts_tail, GNUNET_DNSPARSER_Record::name, GNUNET_DNSPARSER_Record::raw, RecordListEntry::record, ResolveCache::records_head, ResolveCache::records_tail, and GNUNET_DNSPARSER_Record::type.
Referenced by extract_hosts().
|
static |
Extract host information from a line in /etc/hosts.
line | the line to parse |
line_len | number of bytes in line |
Definition at line 1164 of file gnunet-service-resolver.c.
References add_host(), GNUNET_DNSPARSER_TYPE_A, GNUNET_DNSPARSER_TYPE_AAAA, GNUNET_free, GNUNET_strndup, line, and memrchr.
Referenced by load_etc_hosts().
|
static |
Reads the list of hosts from /etc/hosts.
Definition at line 1207 of file gnunet-service-resolver.c.
References extract_hosts(), GNUNET_DISK_file_close(), GNUNET_DISK_file_handle_size(), GNUNET_DISK_file_map(), GNUNET_DISK_file_open(), GNUNET_DISK_file_unmap(), GNUNET_DISK_MAP_TYPE_READ, GNUNET_DISK_OPEN_READ, GNUNET_DISK_PERM_NONE, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_log, GNUNET_OK, mh, and SIZE_MAX.
Referenced by init_cb().
|
static |
Service is starting, initialize everything.
cls | NULL, unused |
cfg | our configuration |
sh | service handle |
Definition at line 1269 of file gnunet-service-resolver.c.
References _, cfg, dnsstub_ctx, GNUNET_DNSSTUB_add_dns_ip(), GNUNET_DNSSTUB_start(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_OK, GNUNET_SCHEDULER_add_shutdown(), load_etc_hosts(), lookup_dns_servers(), result, sh, and shutdown_task().
|
static |
Callback called when a client connects to the service.
cls | closure for the service, unused |
c | the new client that connected to the service |
mq | the message queue used to send messages to the client |
Definition at line 1312 of file gnunet-service-resolver.c.
References mq.
|
static |
Callback called when a client disconnected from the service.
cls | closure for the service |
c | the client that disconnected |
internal_cls | should be equal to c |
Definition at line 1331 of file gnunet-service-resolver.c.
References free_active_lookup(), GNUNET_assert, lookup_head, and ActiveLookup::next.
GNUNET_SERVICE_MAIN | ( | "resolver" | , |
GNUNET_SERVICE_OPTION_NONE | , | ||
& | init_cb, | ||
& | connect_cb, | ||
& | disconnect_cb, | ||
NULL | , | ||
GNUNET_MQ_hd_var_size(get, GNUNET_MESSAGE_TYPE_RESOLVER_REQUEST, struct GNUNET_RESOLVER_GetMessage, NULL) | , | ||
GNUNET_MQ_handler_end() | |||
) |
Define "main" method using service macro.
|
static |
Start of the linked list of cached DNS lookup results.
Definition at line 160 of file gnunet-service-resolver.c.
Referenced by cache_answers(), free_cache_entry(), shutdown_task(), and try_cache().
|
static |
Tail of the linked list of cached DNS lookup results.
Definition at line 165 of file gnunet-service-resolver.c.
Referenced by cache_answers(), free_cache_entry(), handle_resolve_result(), and try_cache().
|
static |
Head of the linked list of DNS lookup results from /etc/hosts.
Definition at line 170 of file gnunet-service-resolver.c.
Referenced by add_host(), free_hosts_entry(), shutdown_task(), and try_cache().
|
static |
Tail of the linked list of DNS lookup results from /etc/hosts.
Definition at line 175 of file gnunet-service-resolver.c.
Referenced by add_host(), and free_hosts_entry().
|
static |
Start of the linked list of active DNS lookups.
Definition at line 180 of file gnunet-service-resolver.c.
Referenced by disconnect_cb(), free_active_lookup(), resolve_and_cache(), and shutdown_task().
|
static |
Tail of the linked list of active DNS lookups.
Definition at line 185 of file gnunet-service-resolver.c.
Referenced by free_active_lookup(), and resolve_and_cache().
|
static |
context of dnsstub library
Definition at line 190 of file gnunet-service-resolver.c.
Referenced by handle_resolve_result(), init_cb(), resolve_and_cache(), and shutdown_task().
|
static |
My domain, to be appended to the hostname to get a FQDN.
Definition at line 195 of file gnunet-service-resolver.c.
Referenced by lookup_dns_servers(), process_get(), and shutdown_task().
|
static |
How many entries do we have in cache_head DLL?
Definition at line 200 of file gnunet-service-resolver.c.
Referenced by cache_answers(), free_cache_entry(), free_hosts_entry(), and handle_resolve_result().