Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

main.h 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #ifndef RPOP_MAIN_H
  2. #define RPOP_MAIN_H
  3. #include "config.h"
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #ifndef HAVE_OWN_QUEUE_H
  7. #include <sys/queue.h>
  8. #else
  9. #include "queue.h"
  10. #endif
  11. #include <sys/time.h>
  12. #include <sys/un.h>
  13. #include <netinet/in.h>
  14. #include <arpa/inet.h>
  15. #include <signal.h>
  16. #include <event.h>
  17. #include "fstring.h"
  18. #include "mem_pool.h"
  19. #include "statfile.h"
  20. #include "url.h"
  21. #include "memcached.h"
  22. #include "protocol.h"
  23. #include "filter.h"
  24. #include <glib.h>
  25. #include <gmime/gmime.h>
  26. /* Default values */
  27. #define FIXED_CONFIG_FILE "./rspamd.conf"
  28. /* Time in seconds to exit for old worker */
  29. #define SOFT_SHUTDOWN_TIME 60
  30. /* Default metric name */
  31. #define DEFAULT_METRIC "default"
  32. /* Logging in postfix style */
  33. #define msg_err g_error
  34. #define msg_warn g_warning
  35. #define msg_info g_message
  36. #define msg_debug g_debug
  37. /* Process type: main or worker */
  38. enum process_type {
  39. TYPE_MAIN,
  40. TYPE_WORKER,
  41. TYPE_CONTROLLER,
  42. };
  43. /* Filter type */
  44. enum script_type {
  45. SCRIPT_HEADER,
  46. SCRIPT_MIME,
  47. SCRIPT_URL,
  48. SCRIPT_MESSAGE,
  49. };
  50. /* Logic expression */
  51. struct expression {
  52. enum { EXPR_OPERAND, EXPR_OPERATION } type;
  53. union {
  54. void *operand;
  55. char operation;
  56. } content;
  57. struct expression *next;
  58. };
  59. /* Worker process structure */
  60. struct rspamd_worker {
  61. pid_t pid;
  62. char is_initialized;
  63. char is_dying;
  64. TAILQ_ENTRY (rspamd_worker) next;
  65. struct rspamd_main *srv;
  66. enum process_type type;
  67. struct event sig_ev;
  68. struct event bind_ev;
  69. };
  70. struct pidfh;
  71. struct config_file;
  72. struct tokenizer;
  73. /* Server statistics */
  74. struct rspamd_stat {
  75. unsigned int messages_scanned;
  76. unsigned int messages_spam;
  77. unsigned int messages_ham;
  78. unsigned int connections_count;
  79. unsigned int control_connections_count;
  80. unsigned int messages_learned;
  81. };
  82. /* Struct that determine main server object (for logging purposes) */
  83. struct rspamd_main {
  84. struct config_file *cfg;
  85. pid_t pid;
  86. /* Pid file structure */
  87. struct pidfh *pfh;
  88. enum process_type type;
  89. unsigned int ev_initialized;
  90. struct rspamd_stat *stat;
  91. memory_pool_t *server_pool;
  92. statfile_pool_t *statfile_pool;
  93. TAILQ_HEAD (workq, rspamd_worker) workers;
  94. };
  95. struct mime_part {
  96. GMimeContentType *type;
  97. GByteArray *content;
  98. TAILQ_ENTRY (mime_part) next;
  99. };
  100. struct save_point {
  101. void *entry;
  102. enum script_type type;
  103. unsigned int saved;
  104. };
  105. /* Control session */
  106. struct controller_session {
  107. struct rspamd_worker *worker;
  108. enum {
  109. STATE_COMMAND,
  110. STATE_LEARN,
  111. } state;
  112. int sock;
  113. /* Access to authorized commands */
  114. int authorized;
  115. memory_pool_t *session_pool;
  116. struct bufferevent *bev;
  117. struct config_file *cfg;
  118. char *learn_rcpt;
  119. char *learn_from;
  120. struct tokenizer *learn_tokenizer;
  121. char *learn_filename;
  122. f_str_buf_t *learn_buf;
  123. };
  124. /* Worker task structure */
  125. struct worker_task {
  126. struct rspamd_worker *worker;
  127. enum {
  128. READ_COMMAND,
  129. READ_HEADER,
  130. READ_MESSAGE,
  131. WRITE_REPLY,
  132. WRITE_ERROR,
  133. WAIT_FILTER,
  134. CLOSING_CONNECTION,
  135. } state;
  136. size_t content_length;
  137. enum rspamd_protocol proto;
  138. enum rspamd_command cmd;
  139. int sock;
  140. char *helo;
  141. char *from;
  142. GList *rcpt;
  143. unsigned int nrcpt;
  144. struct in_addr from_addr;
  145. f_str_buf_t *msg;
  146. struct bufferevent *bev;
  147. /* Memcached connection for this task */
  148. memcached_ctx_t *memc_ctx;
  149. unsigned memc_busy:1;
  150. /* Number of mime parts */
  151. int parts_count;
  152. /* Message */
  153. GMimeMessage *message;
  154. /* All parts of message */
  155. TAILQ_HEAD (mime_partq, mime_part) parts;
  156. /* URLs extracted from message */
  157. TAILQ_HEAD (uriq, uri) urls;
  158. /* Hash of metric result structures */
  159. GHashTable *results;
  160. struct config_file *cfg;
  161. /* Save point for filters deferred processing */
  162. struct save_point save;
  163. /* Saved error message and code */
  164. char *last_error;
  165. int error_code;
  166. /* Memory pool that is associated with this task */
  167. memory_pool_t *task_pool;
  168. };
  169. struct module_ctx {
  170. int (*header_filter)(struct worker_task *task);
  171. int (*mime_filter)(struct worker_task *task);
  172. int (*message_filter)(struct worker_task *task);
  173. int (*url_filter)(struct worker_task *task);
  174. };
  175. struct c_module {
  176. const char *name;
  177. struct module_ctx *ctx;
  178. LIST_ENTRY (c_module) next;
  179. };
  180. void start_worker (struct rspamd_worker *worker, int listen_sock);
  181. void start_controller (struct rspamd_worker *worker);
  182. extern sig_atomic_t do_reopen_log;
  183. #endif
  184. /*
  185. * vi:ts=4
  186. */