Example #1
0
    static void
rdns_test_a (struct rdns_resolver *resolver)
{
#if 1
    char *addr = "2.0.0.127.zen.spamhaus.org";
    rdns_make_request_full (resolver, rdns_regress_callback, addr, 1.0, 2, 1, addr, RDNS_REQUEST_A);
    remain_tests++;

    while (tot_tests > 0) {
        memset(buff[NUM_TESTS - tot_tests], 0, sizeof(buff[NUM_TESTS - tot_tests]));

        printf("Please input the IP address to lookup the zen.spamhaus.org block lists!\n");
        scanf("%s", buff[NUM_TESTS - tot_tests]);
        strcat(buff[NUM_TESTS - tot_tests], ".zen.spamhaus.org");

        printf("The lookup is %s\n", buff[NUM_TESTS - tot_tests]);

        rdns_make_request_full (resolver, rdns_regress_callback, buff[NUM_TESTS - tot_tests], 1.0, 2, 1, buff[NUM_TESTS - tot_tests], RDNS_REQUEST_A);
        remain_tests ++;

        tot_tests--;
    }

    printf("tot_tests = %d\n", tot_tests);
#endif
}
Example #2
0
    static void
rdns_test_a (struct rdns_resolver *resolver)
{
#if 0
    char *names[] = {
        "google.com",
        "github.com",
        "freebsd.org",
        "kernel.org",
        "www.ник.рф",
        "2.0.0.127.zen.spamhaus.org",
        "1.25.168.192.zen.spamhaus.org",
        NULL
    };
    char **cur;

    for (cur = names; *cur != NULL; cur ++) {
        rdns_make_request_full (resolver, rdns_regress_callback, *cur, 1.0, 2, 1, *cur, RDNS_REQUEST_A);
        remain_tests ++;
    }
#endif

#if 1
    char *addr = "2.0.0.127.zen.spamhaus.org";
    rdns_make_request_full (resolver, rdns_regress_callback, addr, 1.0, 2, 1, addr, RDNS_REQUEST_A);
    remain_tests++;

    while (tot_tests > 0) {
        memset(buff[NUM_TESTS - tot_tests], 0, sizeof(buff[NUM_TESTS - tot_tests]));

        printf("Please input the IP address to lookup the zen.spamhaus.org block lists!\n");
        scanf("%s", buff[NUM_TESTS - tot_tests]);
        strcat(buff[NUM_TESTS - tot_tests], ".zen.spamhaus.org");

        printf("The lookup is %s\n", buff[NUM_TESTS - tot_tests]);

        rdns_make_request_full (resolver, rdns_regress_callback, buff[NUM_TESTS - tot_tests], 1.0, 2, 1, buff[NUM_TESTS - tot_tests], RDNS_REQUEST_A);
        remain_tests ++;

        tot_tests--;
    }

    printf("tot_tests = %d\n", tot_tests);
#endif
}
Example #3
0
File: map.c Project: Sp1l/rspamd
/**
 * Async HTTP callback
 */
static void
http_callback (gint fd, short what, void *ud)
{
	struct rspamd_map *map = ud;
	struct http_map_data *data;
	struct http_callback_data *cbd;
	rspamd_mempool_t *pool;
	gchar tmpbuf[PATH_MAX];

	data = map->map_data;
	pool = map->pool;

	if (!g_atomic_int_compare_and_exchange (map->locked, 0, 1)) {
		msg_debug_pool (
				"don't try to reread map as it is locked by other process, will reread it later");
		jitter_timeout_event (map, TRUE, FALSE, FALSE);
		return;
	}

	/* Plan event */
	cbd = g_slice_alloc0 (sizeof (struct http_callback_data));

	rspamd_snprintf (tmpbuf, sizeof (tmpbuf),
			"%s" G_DIR_SEPARATOR_S "rspamd_map%d-XXXXXX",
			map->cfg->temp_dir, map->id);
	cbd->out_fd = mkstemp (tmpbuf);

	if (cbd->out_fd == -1) {
		g_slice_free1 (sizeof (*cbd), cbd);
		msg_err_pool ("cannot create tempfile: %s", strerror (errno));
		jitter_timeout_event (map, FALSE, FALSE, TRUE);
		g_atomic_int_set (map->locked, 0);

		return;
	}

	cbd->tmpfile = g_strdup (tmpbuf);
	cbd->ev_base = map->ev_base;
	cbd->map = map;
	cbd->data = data;
	cbd->fd = -1;
	cbd->cbdata.state = 0;
	cbd->cbdata.prev_data = *cbd->map->user_data;
	cbd->cbdata.cur_data = NULL;
	cbd->cbdata.map = cbd->map;
	cbd->stage = map_resolve_host2;
	double_to_tv (map->cfg->map_timeout, &cbd->tv);
	REF_INIT_RETAIN (cbd, free_http_cbdata);

	msg_debug_pool ("reading map data from %s", data->host);
	/* Send both A and AAAA requests */
	if (map->r->r) {
		if (rdns_make_request_full (map->r->r, rspamd_map_dns_callback, cbd,
				map->cfg->dns_timeout, map->cfg->dns_retransmits, 1,
				data->host, RDNS_REQUEST_A)) {
			REF_RETAIN (cbd);
		}
		if (rdns_make_request_full (map->r->r, rspamd_map_dns_callback, cbd,
				map->cfg->dns_timeout, map->cfg->dns_retransmits, 1,
				data->host, RDNS_REQUEST_AAAA)) {
			REF_RETAIN (cbd);
		}

		jitter_timeout_event (map, FALSE, FALSE, FALSE);
		map->dtor = free_http_cbdata_dtor;
		map->dtor_data = cbd;
	}
	else {
		msg_warn_pool ("cannot load map: DNS resolver is not initialized");
		jitter_timeout_event (map, FALSE, FALSE, TRUE);
	}

	/* We don't need own ref as it is now refcounted by DNS requests */
	REF_RELEASE (cbd);
}
Example #4
0
/**
 * Async HTTP callback
 */
static void
rspamd_map_common_http_callback (struct rspamd_map *map, struct rspamd_map_backend *bk,
		struct map_periodic_cbdata *periodic, gboolean check)
{
	struct http_map_data *data;
	struct http_callback_data *cbd;


	data = bk->data.hd;

	if (g_atomic_int_get (&map->cache->available) == 1) {
		/* Read cached data */
		if (check) {
			if (data->last_checked < map->cache->last_checked) {
				periodic->need_modify = TRUE;
				/* Reset the whole chain */
				periodic->cur_backend = 0;
				rspamd_map_periodic_callback (-1, EV_TIMEOUT, periodic);
			}

			return;
		}
		else if (rspamd_map_read_cached (map, periodic, data->host)) {
			/* Switch to the next backend */
			periodic->cur_backend ++;
			rspamd_map_periodic_callback (-1, EV_TIMEOUT, periodic);
			data->last_checked = map->cache->last_checked;

			return;
		}
	}

	cbd = g_slice_alloc0 (sizeof (struct http_callback_data));

	cbd->ev_base = map->ev_base;
	cbd->map = map;
	cbd->data = data;
	cbd->fd = -1;
	cbd->check = check;
	cbd->periodic = periodic;
	MAP_RETAIN (periodic, "periodic");
	cbd->bk = bk;
	MAP_RETAIN (bk, "rspamd_map_backend");
	cbd->stage = map_resolve_host2;
	double_to_tv (map->cfg->map_timeout, &cbd->tv);
	REF_INIT_RETAIN (cbd, free_http_cbdata);

	msg_debug_map ("%s map data from %s", check ? "checking" : "reading",
			data->host);
	/* Send both A and AAAA requests */
	if (map->r->r) {
		if (rdns_make_request_full (map->r->r, rspamd_map_dns_callback, cbd,
				map->cfg->dns_timeout, map->cfg->dns_retransmits, 1,
				data->host, RDNS_REQUEST_A)) {
			MAP_RETAIN (cbd, "http_callback_data");
		}
		if (rdns_make_request_full (map->r->r, rspamd_map_dns_callback, cbd,
				map->cfg->dns_timeout, map->cfg->dns_retransmits, 1,
				data->host, RDNS_REQUEST_AAAA)) {
			MAP_RETAIN (cbd, "http_callback_data");
		}

		map->dtor = free_http_cbdata_dtor;
		map->dtor_data = cbd;
	}
	else {
		msg_warn_map ("cannot load map: DNS resolver is not initialized");
		cbd->periodic->errored = TRUE;
	}

	/* We don't need own ref as it is now ref counted by DNS handlers */
	MAP_RELEASE (cbd, "http_callback_data");
}
Example #5
0
/**
 * Async HTTP callback
 */
static void
rspamd_map_common_http_callback (struct rspamd_map *map, struct rspamd_map_backend *bk,
		struct map_periodic_cbdata *periodic, gboolean check)
{
	struct http_map_data *data;
	struct http_callback_data *cbd;
	gchar tmpbuf[PATH_MAX];

	data = bk->data.hd;
	cbd = g_slice_alloc0 (sizeof (struct http_callback_data));

	rspamd_snprintf (tmpbuf, sizeof (tmpbuf),
			"%s" G_DIR_SEPARATOR_S "rspamd_map%d-XXXXXX",
			map->cfg->temp_dir, map->id);
	cbd->out_fd = mkstemp (tmpbuf);

	if (cbd->out_fd == -1) {
		msg_err_map ("cannot create tempfile: %s", strerror (errno));
		g_atomic_int_set (map->locked, 0);
		g_slice_free1 (sizeof (*cbd), cbd);
		periodic->errored = TRUE;
		rspamd_map_periodic_callback (-1, EV_TIMEOUT, periodic);

		return;
	}

	cbd->tmpfile = g_strdup (tmpbuf);
	cbd->ev_base = map->ev_base;
	cbd->map = map;
	cbd->data = data;
	cbd->fd = -1;
	cbd->check = check;
	cbd->periodic = periodic;
	MAP_RETAIN (periodic);
	cbd->bk = bk;
	MAP_RETAIN (bk);
	cbd->stage = map_resolve_host2;
	double_to_tv (map->cfg->map_timeout, &cbd->tv);
	REF_INIT_RETAIN (cbd, free_http_cbdata);

	msg_debug_map ("%s map data from %s", check ? "checking" : "reading",
			data->host);
	/* Send both A and AAAA requests */
	if (map->r->r) {
		if (rdns_make_request_full (map->r->r, rspamd_map_dns_callback, cbd,
				map->cfg->dns_timeout, map->cfg->dns_retransmits, 1,
				data->host, RDNS_REQUEST_A)) {
			MAP_RETAIN (cbd);
		}
		if (rdns_make_request_full (map->r->r, rspamd_map_dns_callback, cbd,
				map->cfg->dns_timeout, map->cfg->dns_retransmits, 1,
				data->host, RDNS_REQUEST_AAAA)) {
			MAP_RETAIN (cbd);
		}

		map->dtor = free_http_cbdata_dtor;
		map->dtor_data = cbd;
	}
	else {
		msg_warn_map ("cannot load map: DNS resolver is not initialized");
		cbd->periodic->errored = TRUE;
	}

	/* We don't need own ref as it is now ref counted by DNS handlers */
	MAP_RELEASE (cbd);
}