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.

main.h 3.9KB

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