You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

map.h 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #ifndef RSPAMD_MAP_H
  2. #define RSPAMD_MAP_H
  3. #include "config.h"
  4. #include "contrib/libev/ev.h"
  5. #include "ucl.h"
  6. #include "mem_pool.h"
  7. #include "radix.h"
  8. #include "dns.h"
  9. #ifdef __cplusplus
  10. extern "C" {
  11. #endif
  12. /**
  13. * Maps API is designed to load lists data from different dynamic sources.
  14. * It monitor files and HTTP locations for modifications and reload them if they are
  15. * modified.
  16. */
  17. struct map_cb_data;
  18. struct rspamd_worker;
  19. /**
  20. * Callback types
  21. */
  22. typedef gchar *(*map_cb_t) (gchar *chunk, gint len,
  23. struct map_cb_data *data, gboolean final);
  24. typedef void (*map_fin_cb_t) (struct map_cb_data *data, void **target);
  25. typedef void (*map_dtor_t) (struct map_cb_data *data);
  26. typedef gboolean (*rspamd_map_traverse_cb) (gconstpointer key,
  27. gconstpointer value, gsize hits, gpointer ud);
  28. typedef void (*rspamd_map_traverse_function) (void *data,
  29. rspamd_map_traverse_cb cb,
  30. gpointer cbdata, gboolean reset_hits);
  31. /**
  32. * Common map object
  33. */
  34. struct rspamd_config;
  35. struct rspamd_map;
  36. /**
  37. * Callback data for async load
  38. */
  39. struct map_cb_data {
  40. struct rspamd_map *map;
  41. gint state;
  42. void *prev_data;
  43. void *cur_data;
  44. };
  45. /**
  46. * Returns TRUE if line looks like a map definition
  47. * @param map_line
  48. * @return
  49. */
  50. gboolean rspamd_map_is_map (const gchar *map_line);
  51. /**
  52. * Add map from line
  53. */
  54. struct rspamd_map *rspamd_map_add (struct rspamd_config *cfg,
  55. const gchar *map_line,
  56. const gchar *description,
  57. map_cb_t read_callback,
  58. map_fin_cb_t fin_callback,
  59. map_dtor_t dtor,
  60. void **user_data,
  61. struct rspamd_worker *worker);
  62. /**
  63. * Add map from ucl
  64. */
  65. struct rspamd_map *rspamd_map_add_from_ucl (struct rspamd_config *cfg,
  66. const ucl_object_t *obj,
  67. const gchar *description,
  68. map_cb_t read_callback,
  69. map_fin_cb_t fin_callback,
  70. map_dtor_t dtor,
  71. void **user_data,
  72. struct rspamd_worker *worker);
  73. enum rspamd_map_watch_type {
  74. RSPAMD_MAP_WATCH_MIN = 9,
  75. RSPAMD_MAP_WATCH_PRIMARY_CONTROLLER,
  76. RSPAMD_MAP_WATCH_SCANNER,
  77. RSPAMD_MAP_WATCH_WORKER,
  78. RSPAMD_MAP_WATCH_MAX
  79. };
  80. /**
  81. * Start watching of maps by adding events to libevent event loop
  82. */
  83. void rspamd_map_watch (struct rspamd_config *cfg,
  84. struct ev_loop *event_loop,
  85. struct rspamd_dns_resolver *resolver,
  86. struct rspamd_worker *worker,
  87. enum rspamd_map_watch_type how);
  88. /**
  89. * Preloads maps where all backends are file
  90. * @param cfg
  91. */
  92. void rspamd_map_preload (struct rspamd_config *cfg);
  93. /**
  94. * Remove all maps watched (remove events)
  95. */
  96. void rspamd_map_remove_all (struct rspamd_config *cfg);
  97. /**
  98. * Get traverse function for specific map
  99. * @param map
  100. * @return
  101. */
  102. rspamd_map_traverse_function rspamd_map_get_traverse_function (struct rspamd_map *map);
  103. /**
  104. * Perform map traverse
  105. * @param map
  106. * @param cb
  107. * @param cbdata
  108. * @param reset_hits
  109. * @return
  110. */
  111. void rspamd_map_traverse (struct rspamd_map *map, rspamd_map_traverse_cb cb,
  112. gpointer cbdata, gboolean reset_hits);
  113. #ifdef __cplusplus
  114. }
  115. #endif
  116. #endif