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.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. enum rspamd_map_flags {
  52. RSPAMD_MAP_DEFAULT = 0,
  53. RSPAMD_MAP_FILE_ONLY = 1u << 0u,
  54. RSPAMD_MAP_FILE_NO_READ = 1u << 1u,
  55. };
  56. /**
  57. * Add map from line
  58. */
  59. struct rspamd_map *rspamd_map_add (struct rspamd_config *cfg,
  60. const gchar *map_line,
  61. const gchar *description,
  62. map_cb_t read_callback,
  63. map_fin_cb_t fin_callback,
  64. map_dtor_t dtor,
  65. void **user_data,
  66. struct rspamd_worker *worker,
  67. int flags);
  68. /**
  69. * Add map from ucl
  70. */
  71. struct rspamd_map *rspamd_map_add_from_ucl (struct rspamd_config *cfg,
  72. const ucl_object_t *obj,
  73. const gchar *description,
  74. map_cb_t read_callback,
  75. map_fin_cb_t fin_callback,
  76. map_dtor_t dtor,
  77. void **user_data,
  78. struct rspamd_worker *worker,
  79. int flags);
  80. /**
  81. * Adds a fake map structure (for logging purposes mainly)
  82. * @param cfg
  83. * @param description
  84. * @return
  85. */
  86. struct rspamd_map *rspamd_map_add_fake (struct rspamd_config *cfg,
  87. const gchar *description,
  88. const gchar *name);
  89. enum rspamd_map_watch_type {
  90. RSPAMD_MAP_WATCH_MIN = 9,
  91. RSPAMD_MAP_WATCH_PRIMARY_CONTROLLER,
  92. RSPAMD_MAP_WATCH_SCANNER,
  93. RSPAMD_MAP_WATCH_WORKER,
  94. RSPAMD_MAP_WATCH_MAX
  95. };
  96. /**
  97. * Start watching of maps by adding events to libevent event loop
  98. */
  99. void rspamd_map_watch (struct rspamd_config *cfg,
  100. struct ev_loop *event_loop,
  101. struct rspamd_dns_resolver *resolver,
  102. struct rspamd_worker *worker,
  103. enum rspamd_map_watch_type how);
  104. /**
  105. * Preloads maps where all backends are file
  106. * @param cfg
  107. */
  108. void rspamd_map_preload (struct rspamd_config *cfg);
  109. /**
  110. * Remove all maps watched (remove events)
  111. */
  112. void rspamd_map_remove_all (struct rspamd_config *cfg);
  113. /**
  114. * Get traverse function for specific map
  115. * @param map
  116. * @return
  117. */
  118. rspamd_map_traverse_function rspamd_map_get_traverse_function (struct rspamd_map *map);
  119. /**
  120. * Perform map traverse
  121. * @param map
  122. * @param cb
  123. * @param cbdata
  124. * @param reset_hits
  125. * @return
  126. */
  127. void rspamd_map_traverse (struct rspamd_map *map, rspamd_map_traverse_cb cb,
  128. gpointer cbdata, gboolean reset_hits);
  129. #ifdef __cplusplus
  130. }
  131. #endif
  132. #endif