aboutsummaryrefslogtreecommitdiffstats
path: root/perl/Rspamd/Config.xs
blob: 49b26db2f748f351ed77d3dbad59e6b8e64fbc5b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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