timeout = 0.0;
}
else if (errored) {
- timeout = map->cfg->map_timeout * error_mult;
+ timeout = map->poll_timeout * error_mult;
}
else if (locked) {
- timeout = map->cfg->map_timeout * lock_mult;
+ timeout = map->poll_timeout * lock_mult;
}
else {
- timeout = map->cfg->map_timeout;
+ timeout = map->poll_timeout;
}
cbd = g_slice_alloc0 (sizeof (*cbd));
map->backends = g_ptr_array_sized_new (1);
g_ptr_array_add (map->backends, bk);
map->name = g_strdup (map_line);
+ map->poll_timeout = cfg->map_timeout;
if (description != NULL) {
map->description =
return map;
}
+struct rspamd_map*
+rspamd_map_add_from_ucl (struct rspamd_config *cfg,
+ const ucl_object_t *obj,
+ map_cb_t read_callback,
+ map_fin_cb_t fin_callback,
+ void **user_data)
+{
+ ucl_object_iter_t it = NULL;
+ const ucl_object_t *cur, *elt;
+ struct rspamd_map *map;
+ struct rspamd_map_backend *bk;
+
+ g_assert (obj != NULL);
+
+ if (ucl_object_type (obj) == UCL_STRING) {
+ /* Just a plain string */
+ return rspamd_map_add (cfg, ucl_object_tostring (obj), NULL,
+ read_callback, fin_callback, user_data);
+ }
+
+ map = g_slice_alloc0 (sizeof (struct rspamd_map));
+ map->read_callback = read_callback;
+ map->fin_callback = fin_callback;
+ map->user_data = user_data;
+ map->cfg = cfg;
+ map->id = g_random_int ();
+ map->locked =
+ rspamd_mempool_alloc0_shared (cfg->cfg_pool, sizeof (gint));
+ map->backends = g_ptr_array_new ();
+ map->poll_timeout = cfg->map_timeout;
+
+ if (ucl_object_type (obj) == UCL_ARRAY) {
+ /* Add array of maps as multiple backends */
+ while ((cur = ucl_object_iterate (obj, &it, true)) != NULL) {
+ if (ucl_object_type (cur) == UCL_STRING) {
+ bk = rspamd_map_parse_backend (cfg, ucl_object_tostring (cur));
+
+ if (bk != NULL) {
+ g_ptr_array_add (map->backends, bk);
+
+ if (!map->name) {
+ map->name = g_strdup (ucl_object_tostring (cur));
+ }
+ }
+ }
+ else {
+ msg_err_config ("bad map element type: %s",
+ ucl_object_type_to_string (ucl_object_type (cur)));
+ }
+ }
+
+ if (map->backends->len == 0) {
+ msg_err_config ("map has no urls to be loaded");
+ goto err;
+ }
+ }
+ else if (ucl_object_type (obj) == UCL_OBJECT) {
+ elt = ucl_object_lookup (obj, "name");
+ if (elt && ucl_object_type (elt) == UCL_STRING) {
+ map->name = g_strdup (ucl_object_tostring (elt));
+ }
+
+ elt = ucl_object_lookup (obj, "description");
+ if (elt && ucl_object_type (elt) == UCL_STRING) {
+ map->description = g_strdup (ucl_object_tostring (elt));
+ }
+
+ elt = ucl_object_lookup_any (obj, "timeout", "poll", "poll_time",
+ "watch_interval", NULL);
+ if (elt) {
+ map->poll_timeout = ucl_object_todouble (elt);
+ }
+
+ elt = ucl_object_lookup_any (obj, "upstreams", "url", "urls", NULL);
+ if (elt == NULL) {
+ msg_err_config ("map has no urls to be loaded");
+ goto err;
+ }
+
+ if (ucl_object_type (obj) == UCL_ARRAY) {
+ /* Add array of maps as multiple backends */
+ while ((cur = ucl_object_iterate (elt, &it, true)) != NULL) {
+ if (ucl_object_type (cur) == UCL_STRING) {
+ bk = rspamd_map_parse_backend (cfg, ucl_object_tostring (cur));
+
+ if (bk != NULL) {
+ g_ptr_array_add (map->backends, bk);
+
+ if (!map->name) {
+ map->name = g_strdup (ucl_object_tostring (cur));
+ }
+ }
+ }
+ else {
+ msg_err_config ("bad map element type: %s",
+ ucl_object_type_to_string (ucl_object_type (cur)));
+ goto err;
+ }
+ }
+
+ if (map->backends->len == 0) {
+ msg_err_config ("map has no urls to be loaded");
+ goto err;
+ }
+ }
+ else if (ucl_object_type (elt) == UCL_STRING) {
+ bk = rspamd_map_parse_backend (cfg, ucl_object_tostring (elt));
+
+ if (bk != NULL) {
+ g_ptr_array_add (map->backends, bk);
+
+ if (!map->name) {
+ map->name = g_strdup (ucl_object_tostring (cur));
+ }
+ }
+ }
+
+ if (map->backends->len == 0) {
+ msg_err_config ("map has no urls to be loaded");
+ goto err;
+ }
+ }
+
+ return map;
+
+err:
+ g_ptr_array_free (map->backends, TRUE);
+ g_free (map->name);
+ g_free (map->description);
+ g_slice_free1 (sizeof (*map), map);
+
+ return NULL;
+}
+
/**
* FSM for parsing lists
*/