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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. * Common map object
  21. */
  22. struct rspamd_config;
  23. struct rspamd_map;
  24. /**
  25. * Callback types
  26. */
  27. typedef char *(*map_cb_t)(char *chunk, int len,
  28. struct map_cb_data *data, gboolean final);
  29. typedef void (*map_fin_cb_t)(struct map_cb_data *data, void **target);
  30. typedef void (*map_dtor_t)(struct map_cb_data *data);
  31. typedef gboolean (*rspamd_map_traverse_cb)(gconstpointer key,
  32. gconstpointer value, gsize hits, gpointer ud);
  33. typedef void (*rspamd_map_traverse_function)(void *data,
  34. rspamd_map_traverse_cb cb,
  35. gpointer cbdata, gboolean reset_hits);
  36. typedef void (*rspamd_map_on_load_function)(struct rspamd_map *map, gpointer ud);
  37. /**
  38. * Callback data for async load
  39. */
  40. struct map_cb_data {
  41. struct rspamd_map *map;
  42. int state;
  43. bool errored;
  44. void *prev_data;
  45. void *cur_data;
  46. };
  47. /**
  48. * Returns TRUE if line looks like a map definition
  49. * @param map_line
  50. * @return
  51. */
  52. gboolean rspamd_map_is_map(const char *map_line);
  53. enum rspamd_map_flags {
  54. RSPAMD_MAP_DEFAULT = 0,
  55. RSPAMD_MAP_FILE_ONLY = 1u << 0u,
  56. RSPAMD_MAP_FILE_NO_READ = 1u << 1u,
  57. };
  58. /**
  59. * Add map from line
  60. */
  61. struct rspamd_map *rspamd_map_add(struct rspamd_config *cfg,
  62. const char *map_line,
  63. const char *description,
  64. map_cb_t read_callback,
  65. map_fin_cb_t fin_callback,
  66. map_dtor_t dtor,
  67. void **user_data,
  68. struct rspamd_worker *worker,
  69. int flags);
  70. /**
  71. * Add map from ucl
  72. */
  73. struct rspamd_map *rspamd_map_add_from_ucl(struct rspamd_config *cfg,
  74. const ucl_object_t *obj,
  75. const char *description,
  76. map_cb_t read_callback,
  77. map_fin_cb_t fin_callback,
  78. map_dtor_t dtor,
  79. void **user_data,
  80. struct rspamd_worker *worker,
  81. int flags);
  82. /**
  83. * Adds a fake map structure (for logging purposes mainly)
  84. * @param cfg
  85. * @param description
  86. * @return
  87. */
  88. struct rspamd_map *rspamd_map_add_fake(struct rspamd_config *cfg,
  89. const char *description,
  90. const char *name);
  91. enum rspamd_map_watch_type {
  92. RSPAMD_MAP_WATCH_MIN = 9,
  93. RSPAMD_MAP_WATCH_PRIMARY_CONTROLLER,
  94. RSPAMD_MAP_WATCH_SCANNER,
  95. RSPAMD_MAP_WATCH_WORKER,
  96. RSPAMD_MAP_WATCH_MAX
  97. };
  98. /**
  99. * Start watching of maps by adding events to libevent event loop
  100. */
  101. void rspamd_map_watch(struct rspamd_config *cfg,
  102. struct ev_loop *event_loop,
  103. struct rspamd_dns_resolver *resolver,
  104. struct rspamd_worker *worker,
  105. enum rspamd_map_watch_type how);
  106. /**
  107. * Preloads maps where all backends are file
  108. * @param cfg
  109. */
  110. void rspamd_map_preload(struct rspamd_config *cfg);
  111. /**
  112. * Remove all maps watched (remove events)
  113. */
  114. void rspamd_map_remove_all(struct rspamd_config *cfg);
  115. /**
  116. * Get traverse function for specific map
  117. * @param map
  118. * @return
  119. */
  120. rspamd_map_traverse_function rspamd_map_get_traverse_function(struct rspamd_map *map);
  121. /**
  122. * Perform map traverse
  123. * @param map
  124. * @param cb
  125. * @param cbdata
  126. * @param reset_hits
  127. * @return
  128. */
  129. void rspamd_map_traverse(struct rspamd_map *map, rspamd_map_traverse_cb cb,
  130. gpointer cbdata, gboolean reset_hits);
  131. /**
  132. * Set map on load callback
  133. * @param map
  134. * @param cb
  135. * @param cbdata
  136. */
  137. void rspamd_map_set_on_load_function(struct rspamd_map *map, rspamd_map_on_load_function cb,
  138. gpointer cbdata, GDestroyNotify dtor);
  139. #ifdef __cplusplus
  140. }
  141. #endif
  142. #endif