summaryrefslogtreecommitdiffstats
path: root/perl/Rspamd/Config.xs
diff options
context:
space:
mode:
Diffstat (limited to 'perl/Rspamd/Config.xs')
-rw-r--r--perl/Rspamd/Config.xs141
1 files changed, 141 insertions, 0 deletions
diff --git a/perl/Rspamd/Config.xs b/perl/Rspamd/Config.xs
new file mode 100644
index 000000000..49b26db2f
--- /dev/null
+++ b/perl/Rspamd/Config.xs
@@ -0,0 +1,141 @@
+MODULE = Mail::Rspamd PACKAGE = Mail::Rspamd::Config PREFIX = rspamd_config_
+PROTOTYPES: DISABLE
+
+SV *
+rspamd_config_get_scalar (cfg, param)
+ Mail::Rspamd::Config cfg
+ const char *param
+ CODE:
+ struct config_scalar *sc;
+ int val;
+
+ sc = g_hash_table_lookup (cfg->cfg_params, param);
+ if (sc == NULL) {
+ XSRETURN_UNDEF;
+ }
+ else {
+ switch (sc->type) {
+ case SCALAR_TYPE_SIZE:
+ RETVAL = newSViv ((int)(*(size_t *)sc->pointer));
+ break;
+ case SCALAR_TYPE_INT:
+ case SCALAR_TYPE_UINT:
+ RETVAL = newSViv (*(int *)sc->pointer);
+ break;
+ case SCALAR_TYPE_STR:
+ RETVAL = newSVpv ((char *)sc->pointer, 0);
+ break;
+ }
+ }
+
+
+void
+rspamd_config_set_scalar (cfg, param, value)
+ Mail::Rspamd::Config cfg
+ const char *param
+ SV* value
+ CODE:
+ char *param, *charval;
+ int intval;
+
+ sc = g_hash_table_lookup (cfg->cfg_params, param);
+ if (sc == NULL) {
+ XSRETURN_UNDEF;
+ }
+ else {
+ switch (sc->type) {
+ case SCALAR_TYPE_SIZE:
+ intval = (int)SvIV (value);
+ *((size_t *)sc->pointer) = intval;
+ break;
+ case SCALAR_TYPE_INT:
+ case SCALAR_TYPE_UINT:
+ intval = (int)SvIV (value);
+ *((int *)sc->pointer) = intval;
+ break;
+ case SCALAR_TYPE_STR:
+ charval = (char *)SvPVX (value);
+ *((char **)sc->pointer) = charval;
+ break;
+ }
+ }
+
+HV *
+rspamd_config_get_metric (r, name)
+ Mail::Rspamd::Config cfg
+ const char *name
+ CODE:
+ struct metric *val;
+
+ val = g_hash_table_lookup (r->metrics, name);
+ if (val == NULL) {
+ XSRETURN_UNDEF;
+ }
+ else {
+ RETVAL = newHV();
+
+ (void)hv_store_ent (RETVAL,
+ newSVpv ("name", sizeof ("name") - 1),
+ newSVpv (val->name, strlen (val->name)), 0);
+ (void)hv_store_ent (RETVAL,
+ newSVpv ("func_name", sizeof ("func_name") - 1),
+ newSVpv (val->func_name, strlen (val->func_name)), 0);
+ (void)hv_store_ent (RETVAL,
+ newSVpv ("required_score", sizeof ("required_score") - 1),
+ newSVnv (val->required_score), 0);
+ sv_2mortal((SV*)RETVAL);
+ }
+ OUTPUT:
+ RETVAL
+
+HV *
+rspamd_config_get_statfile (r, name)
+ Mail::Rspamd::Config cfg
+ const char *name
+ CODE:
+ struct statfile *val;
+ char *name;
+
+ val = g_hash_table_lookup (r->statfiles, name);
+ if (val == NULL) {
+ XSRETURN_UNDEF;
+ }
+ else {
+ RETVAL = newHV();
+
+ (void)hv_store_ent (RETVAL,
+ newSVpv ("alias", sizeof ("alias") - 1),
+ newSVpv (val->alias, strlen (val->alias)), 0);
+ (void)hv_store_ent (RETVAL,
+ newSVpv ("pattern", sizeof ("pattern") - 1),
+ newSVpv (val->pattern, strlen (val->pattern)), 0);
+ (void)hv_store_ent (RETVAL,
+ newSVpv ("metric", sizeof ("metric") - 1),
+ newSVpv (val->metric, strlen (val->metric)), 0);
+ (void)hv_store_ent (RETVAL,
+ newSVpv ("weight", sizeof ("weight") - 1),
+ newSVnv (val->weight), 0);
+ (void)hv_store_ent (RETVAL,
+ newSVpv ("size", sizeof ("size") - 1),
+ newSViv (val->size), 0);
+ sv_2mortal((SV*)RETVAL);
+ }
+ OUTPUT:
+ RETVAL
+
+SV*
+rspamd_config_get_module_param (r, modulename, paramname)
+ Mail::Rspamd::Config cfg
+ const char *modulename
+ const char *paramname
+ CODE:
+ char *value;
+
+ value = get_module_opt (r, modulename, paramname);
+ if (value == NULL) {
+ XSRETURN_UNDEF;
+ }
+ RETVAL = newSVpv (value, 0);
+ OUTPUT:
+ RETVAL
+