Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

rspamd.xs 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. /*
  2. * Perl XS module for interacting with rspamd
  3. *
  4. * vi:ts=4
  5. */
  6. #include <sys/types.h>
  7. #include <unistd.h>
  8. #include <EXTERN.h>
  9. #include <perl.h>
  10. #include <XSUB.h>
  11. #include "../src/config.h"
  12. #include "../src/main.h"
  13. #include "../src/cfg_file.h"
  14. #include "../src/perl.h"
  15. #include "../src/mem_pool.h"
  16. #define perl_set_session(r) \
  17. r = INT2PTR(struct worker_task *, SvIV((SV *) SvRV(ST(0))))
  18. #define perl_set_targ(p, len) \
  19. SvUPGRADE(TARG, SVt_PV); \
  20. SvPOK_on(TARG); \
  21. sv_setpvn(TARG, (char *) p, len)
  22. MODULE = rspamd PACKAGE = rspamd
  23. PROTOTYPES: DISABLE
  24. void
  25. get_header (r, header)
  26. CODE:
  27. dXSTARG;
  28. struct worker_task *r;
  29. SV *header;
  30. char *s;
  31. STRLEN len;
  32. perl_set_session(r);
  33. header = ST(1);
  34. if (SvROK (header) && SvTYPE (SvRV (header)) == SVt_PV) {
  35. header = SvRV (header);
  36. }
  37. s = (char *) SvPV (header, len);
  38. if ((s = (char *)g_mime_message_get_header (r->message, s)) == NULL) {
  39. XSRETURN_UNDEF;
  40. }
  41. else {
  42. ngx_http_perl_set_targ (s, strlen (s));
  43. ST(0) = TARG;
  44. }
  45. void
  46. get_part_num (r)
  47. CODE:
  48. dXSTARG;
  49. struct worker_task *r;
  50. perl_set_session (r);
  51. sv_upgrade(TARG, SVt_IV);
  52. sv_setiv(TARG, r->parts_count);
  53. ST(0) = TARG;
  54. HV *
  55. get_part (r, num)
  56. CODE:
  57. struct worker_task *r;
  58. SV *num;
  59. int number;
  60. struct mime_part *part;
  61. char *type;
  62. perl_set_session (r);
  63. num = ST(1);
  64. number = (int) SvIV (num);
  65. if (number < 0 || number > r->parts_count - 1) {
  66. XSRETURN_UNDEF;
  67. }
  68. TAILQ_FOREACH (part, &r->parts, next) {
  69. if (--number == 0) {
  70. break;
  71. }
  72. }
  73. RETVAL = newHV();
  74. type = g_mime_content_type_to_string (part->type);
  75. hv_store_ent (RETVAL,
  76. newSVpv ("type", sizeof ("type") - 1),
  77. newSVpv (type, strlen(type)), 0);
  78. hv_store_ent (RETVAL,
  79. newSVpv ("content", sizeof ("content") - 1),
  80. newSVpv ((char *)part->content->data, part->content->len), 0);
  81. sv_2mortal((SV*)RETVAL);
  82. OUTPUT:
  83. RETVAL
  84. void
  85. ip (r)
  86. CODE:
  87. dXSTARG;
  88. struct worker_task *r;
  89. char *ip_str;
  90. perl_set_session (r);
  91. sv_upgrade(TARG, SVt_PV);
  92. ip_str = inet_ntoa (r->from_addr);
  93. sv_setpv(TARG, ip_str);
  94. ST(0) = TARG;
  95. void
  96. from (r)
  97. CODE:
  98. dXSTARG;
  99. struct worker_task *r;
  100. perl_set_session (r);
  101. if (r->from == NULL) {
  102. XSRETURN_UNDEF;
  103. }
  104. sv_upgrade(TARG, SVt_PV);
  105. sv_setpv(TARG, r->from);
  106. ST(0) = TARG;
  107. void
  108. save_point (r)
  109. CODE:
  110. struct worker_task *r;
  111. perl_set_session (r);
  112. r->save.saved = 1;
  113. void
  114. recall_filter (r)
  115. CODE:
  116. struct worker_task *r;
  117. perl_set_session (r);
  118. process_filters (r);
  119. void
  120. insert_result (r, metric, symbol, flag)
  121. CODE:
  122. struct worker_task *r;
  123. char *metric, *symbol;
  124. int flag;
  125. STRLEN metriclen, symbollen;
  126. perl_set_session (r);
  127. metric = (char *) SvPV (ST(1), metriclen);
  128. symbol = (char *) SvPV (ST(2), symbollen);
  129. flag = (int) SvIV (ST(3));
  130. insert_result (r, metric, symbol, flag);
  131. void
  132. get_module_param (r, modulename, paramname)
  133. CODE:
  134. struct worker_task *r;
  135. char *module, *param, *value;
  136. STRLEN modulelen, paramlen;
  137. dXSTARG;
  138. perl_set_session (r);
  139. module = (char *) SvPV (ST(1), modulelen);
  140. param = (char *) SvPV (ST(2), paramlen);
  141. value = get_module_opt (r->worker->srv->cfg, module, param);
  142. if (value == NULL) {
  143. XSRETURN_UNDEF;
  144. }
  145. sv_upgrade(TARG, SVt_PV);
  146. sv_setpv(TARG, value);
  147. ST(0) = TARG;
  148. void
  149. read_memcached_key (r, key, datalen, callback)
  150. CODE:
  151. struct worker_task *r;
  152. char *key;
  153. unsigned int datalen;
  154. SV *callback;
  155. STRLEN keylen;
  156. struct _param {
  157. SV *callback;
  158. struct worker_task *task;
  159. } *callback_data;
  160. memcached_ctx_t *ctx;
  161. memcached_param_t param;
  162. perl_set_session (r);
  163. key = (char *) SvPV (ST(1), keylen);
  164. datalen = (unsigned int) SvIV (ST(2));
  165. callback = SvRV(ST(3));
  166. /* Copy old ctx to new one */
  167. ctx = memory_pool_alloc (r->task_pool, sizeof (memcached_ctx_t));
  168. if (ctx == NULL) {
  169. XSRETURN_UNDEF;
  170. }
  171. memcpy (ctx, r->memc_ctx, sizeof (memcached_ctx_t));
  172. /* Set perl callback */
  173. ctx->callback = perl_call_memcached_callback;
  174. callback_data = memory_pool_alloc (r->task_pool, sizeof (struct _param));
  175. if (callback_data == NULL) {
  176. XSRETURN_UNDEF;
  177. }
  178. callback_data->callback = callback;
  179. callback_data->task = r;
  180. ctx->callback_data = (void *)callback_data;
  181. strlcpy (param.key, key, sizeof (param.key));
  182. param.buf = memory_pool_alloc (r->task_pool, datalen);
  183. if (param.buf != NULL) {
  184. param.bufsize = datalen;
  185. }
  186. param.bufpos = 0;
  187. param.expire = 0;
  188. memc_get (ctx, &param);
  189. /* Set save point */
  190. r->save.saved = 1;
  191. XSRETURN_EMPTY;
  192. void
  193. write_memcached_key (r, key, data, expire, callback)
  194. CODE:
  195. struct worker_task *r;
  196. char *key, *data;
  197. SV *callback;
  198. STRLEN keylen, datalen;
  199. int expire;
  200. struct _param {
  201. SV *callback;
  202. struct worker_task *task;
  203. } *callback_data;
  204. memcached_ctx_t *ctx;
  205. memcached_param_t param;
  206. perl_set_session (r);
  207. key = (char *) SvPV (ST(1), keylen);
  208. data = (char *) SvPV (ST(2), datalen);
  209. expire = (int) SvIV (ST(3));
  210. callback = SvRV(ST(4));
  211. /* Copy old ctx to new one */
  212. ctx = memory_pool_alloc (r->task_pool, sizeof (memcached_ctx_t));
  213. if (ctx == NULL) {
  214. XSRETURN_UNDEF;
  215. }
  216. memcpy (ctx, r->memc_ctx, sizeof (memcached_ctx_t));
  217. /* Set perl callback */
  218. ctx->callback = perl_call_memcached_callback;
  219. callback_data = memory_pool_alloc (r->task_pool, sizeof (struct _param));
  220. if (callback_data == NULL) {
  221. XSRETURN_UNDEF;
  222. }
  223. callback_data->callback = callback;
  224. callback_data->task = r;
  225. ctx->callback_data = (void *)callback_data;
  226. strlcpy (param.key, key, sizeof (param.key));
  227. param.buf = data;
  228. param.bufsize = datalen;
  229. param.bufpos = 0;
  230. param.expire = expire;
  231. memc_set (ctx, &param, expire);
  232. /* Set save point */
  233. r->save.saved = 1;
  234. XSRETURN_EMPTY;
  235. void
  236. delete_memcached_key (r, key, callback)
  237. CODE:
  238. struct worker_task *r;
  239. char *key;
  240. SV *callback;
  241. STRLEN keylen;
  242. struct _param {
  243. SV *callback;
  244. struct worker_task *task;
  245. } *callback_data;
  246. memcached_ctx_t *ctx;
  247. memcached_param_t param;
  248. perl_set_session (r);
  249. key = (char *) SvPV (ST(1), keylen);
  250. callback = SvRV(ST(2));
  251. /* Copy old ctx to new one */
  252. ctx = memory_pool_alloc (r->task_pool, sizeof (memcached_ctx_t));
  253. if (ctx == NULL) {
  254. XSRETURN_UNDEF;
  255. }
  256. memcpy (ctx, r->memc_ctx, sizeof (memcached_ctx_t));
  257. /* Set perl callback */
  258. ctx->callback = perl_call_memcached_callback;
  259. callback_data = memory_pool_alloc (r->task_pool, sizeof (struct _param));
  260. if (callback_data == NULL) {
  261. XSRETURN_UNDEF;
  262. }
  263. callback_data->callback = callback;
  264. callback_data->task = r;
  265. ctx->callback_data = (void *)callback_data;
  266. strlcpy (param.key, key, sizeof (param.key));
  267. param.buf = NULL;
  268. param.bufsize = 0;
  269. param.bufpos = 0;
  270. param.expire = 0;
  271. memc_delete (ctx, &param);
  272. /* Set save point */
  273. r->save.saved = 1;
  274. XSRETURN_EMPTY;