dns_callback_type cb;
gpointer ud;
rspamd_mempool_t *pool;
+ struct rspamd_task *task;
+ struct rspamd_symcache_item *item;
struct rdns_request *req;
struct rdns_reply *reply;
};
* event removing
*/
rdns_request_retain (reply->request);
+
+ if (reqdata->item) {
+ rspamd_symcache_item_async_dec_check (reqdata->task,
+ reqdata->item);
+ }
+
rspamd_session_remove_event (reqdata->session, rspamd_dns_fin_cb, reqdata);
}
else {
}
}
-gboolean
+struct rspamd_dns_request_ud *
make_dns_request (struct rspamd_dns_resolver *resolver,
struct rspamd_async_session *session,
rspamd_mempool_t *pool,
g_assert (resolver != NULL);
if (resolver->r == NULL) {
- return FALSE;
+ return NULL;
}
if (session && rspamd_session_blocked (session)) {
- return FALSE;
+ return NULL;
}
if (pool != NULL) {
if (session) {
if (req != NULL) {
- rspamd_session_add_event (session, NULL, (event_finalizer_t) rspamd_dns_fin_cb, reqdata,
+ rspamd_session_add_event (session,
+ (event_finalizer_t) rspamd_dns_fin_cb,
+ reqdata,
g_quark_from_static_string ("dns resolver"));
}
}
if (pool == NULL) {
g_free (reqdata);
}
- return FALSE;
+ return NULL;
}
- return TRUE;
+ return reqdata;
}
static gboolean
const char *name,
gboolean forced)
{
- gboolean ret;
+ struct rspamd_dns_request_ud *reqdata;
if (!forced && task->dns_requests >= task->cfg->dns_max_requests) {
return FALSE;
}
- ret = make_dns_request (task->resolver, task->s, task->task_pool, cb, ud,
+ reqdata = make_dns_request (task->resolver, task->s, task->task_pool, cb, ud,
type, name);
- if (ret) {
+ if (reqdata) {
task->dns_requests ++;
+ reqdata->task = task;
+ reqdata->item = rspamd_symbols_cache_get_cur_item (task);
+ rspamd_symcache_item_async_inc (task, reqdata->item);
+
if (!forced && task->dns_requests >= task->cfg->dns_max_requests) {
msg_info_task ("<%s> stop resolving on reaching %ud requests",
task->message_id, task->dns_requests);
}
+
+ return FALSE;
}
- return ret;
+ return TRUE;
}
gboolean
struct rspamd_dns_resolver * dns_resolver_init (rspamd_logger_t *logger,
struct event_base *ev_base, struct rspamd_config *cfg);
+struct rspamd_dns_request_ud;
/**
* Make a DNS request
* @param resolver resolver object
* @param ... string or ip address based on a request type
* @return TRUE if request was sent.
*/
-gboolean make_dns_request (struct rspamd_dns_resolver *resolver,
+struct rspamd_dns_request_ud * make_dns_request (struct rspamd_dns_resolver *resolver,
struct rspamd_async_session *session,
rspamd_mempool_t *pool,
dns_callback_type cb,