diff options
author | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2008-09-02 19:42:58 +0400 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@rambler-co.ru> | 2008-09-02 19:42:58 +0400 |
commit | 2809ad4747b7e3a3795aec4e433d7754c7efc365 (patch) | |
tree | 924e32c2c66062b6b9b7e3525ada783b092aaea8 | |
parent | bacc29586271996154884ff8c531520385318a84 (diff) | |
download | rspamd-2809ad4747b7e3a3795aec4e433d7754c7efc365.tar.gz rspamd-2809ad4747b7e3a3795aec4e433d7754c7efc365.zip |
* Add ability to pass options to rspamd modules via flex start conditions
-rw-r--r-- | cfg_file.h | 7 | ||||
-rw-r--r-- | cfg_file.l | 12 | ||||
-rw-r--r-- | cfg_file.y | 33 | ||||
-rw-r--r-- | cfg_utils.c | 23 |
4 files changed, 73 insertions, 2 deletions
diff --git a/cfg_file.h b/cfg_file.h index 62856b489..401593584 100644 --- a/cfg_file.h +++ b/cfg_file.h @@ -84,6 +84,12 @@ struct filter_chain { LIST_ENTRY (filter_chain) next; }; +struct module_opt { + char *param; + char *value; + LIST_ENTRY (module_opt) next; +}; + struct config_file { char *cfg_name; char *pid_file; @@ -108,6 +114,7 @@ struct config_file { LIST_HEAD (perlq, filter_chain) filters; LIST_HEAD (modulesq, perl_module) perl_modules; LIST_HEAD (cmodulesq, c_module) c_modules; + GHashTable* modules_opts; }; int add_memcached_server (struct config_file *cf, char *str); diff --git a/cfg_file.l b/cfg_file.l index 760afc1ad..8cde589b5 100644 --- a/cfg_file.l +++ b/cfg_file.l @@ -1,4 +1,5 @@ %x incl +%x module %{ #include <stdio.h> @@ -98,6 +99,7 @@ parse_flag (const char *str) %% ^[ \t]*#.* /* ignore comments */; .include BEGIN(incl); +.module BEGIN(module); tempdir return TEMPDIR; pidfile return PIDFILE; workers return WORKERS; @@ -120,6 +122,7 @@ script_message return SCRIPT_MESSAGE; script_url return SCRIPT_URL; script_chain return SCRIPT_CHAIN; + \{ return OBRACE; \} return EBRACE; ; return SEMICOLON; @@ -177,6 +180,15 @@ yes|YES|no|NO|[yY]|[nN] yylval.flag=parse_flag(yytext); return FLAG; } } +<module>\n /* ignore EOL */; +<module>[ \t]+ /* ignore whitespace */; +<module>\'[a-zA-Z0-9_-]\' yylval.string=strdup(yytext + 1); yylval.string[strlen(yylval.string) - 1] = '\0'; return MODULE_OPT; +<module>\{ return OBRACE; +<module>\} return EBRACE; +<module>\; return SEMICOLON; +<module>[a-zA-Z0-9_-] yylval.string=strdup(yytext); return PARAM; +<module>\"[^"]+\" yylval.string=strdup(yytext + 1); yylval.string[strlen(yylval.string) - 1] = '\0'; return QUOTEDSTRING; + %% /* * vi:ts=4 diff --git a/cfg_file.y b/cfg_file.y index 91f84f4ce..8448933b4 100644 --- a/cfg_file.y +++ b/cfg_file.y @@ -26,6 +26,7 @@ extern char *yytext; struct scriptq *cur_scripts; unsigned int cur_scripts_num = 0; +LIST_HEAD (moduleoptq, module_opt) *cur_module_opt = NULL; %} @@ -47,9 +48,10 @@ unsigned int cur_scripts_num = 0; %token READ_SERVERS WRITE_SERVER DIRECTORY_SERVERS MAILBOX_QUERY USERS_QUERY LASTLOGIN_QUERY %token MEMCACHED WORKERS REQUIRE MODULE %token FILTER METRIC SCRIPT_HEADER SCRIPT_MIME SCRIPT_MESSAGE SCRIPT_URL SCRIPT_CHAIN SCRIPT_PARAM +%token MODULE_OPT, PARAM %type <string> STRING -%type <string> QUOTEDSTRING +%type <string> QUOTEDSTRING MODULE_OPT PARAM %type <string> FILENAME %type <string> SOCKCRED %type <string> IPADDR IPNETWORK @@ -77,6 +79,7 @@ command : | workers | require | filter + | module_opt ; tempdir : @@ -130,7 +133,7 @@ bind_cred: ; memcached: - BEANSTALK OBRACE memcachedbody EBRACE + MEMCACHED OBRACE memcachedbody EBRACE ; memcachedbody: @@ -374,6 +377,32 @@ requirecmd: } ; +module_opt: + MODULE_OPT OBRACE moduleoptbody EBRACE { + g_hash_table_insert (cfg->modules_opts, $1, cur_module_opt); + cur_module_opt = NULL; + } + ; + +moduleoptbody: + optcmd SEMICOLON + | moduleoptbody optcmd SEMICOLON + ; + +optcmd: + PARAM EQSIGN QUOTEDSTRING { + struct module_opt *mopt; + if (cur_module_opt == NULL) { + cur_module_opt = g_malloc (sizeof (cur_module_opt)); + LIST_INIT (cur_module_opt); + } + mopt = g_malloc (sizeof (struct module_opt)); + mopt->param = $1; + mopt->value = $3; + LIST_INSERT_HEAD (cur_module_opt, mopt, next); + } + ; + %% /* * vi:ts=4 diff --git a/cfg_utils.c b/cfg_utils.c index 78c37dabd..83738aea6 100644 --- a/cfg_utils.c +++ b/cfg_utils.c @@ -24,6 +24,24 @@ extern int yylineno; extern char *yytext; +static void +clean_hash_bucket (gpointer key, gpointer value, gpointer unused) +{ + LIST_HEAD (moduleoptq, module_opt) *cur_module_opt = (struct moduleoptq *)value; + struct module_opt *cur, *tmp; + + LIST_FOREACH_SAFE (cur, cur_module_opt, next, tmp) { + if (cur->param) { + free (cur->param); + } + if (cur->value) { + free (cur->value); + } + LIST_REMOVE (cur, next); + free (cur); + } +} + int add_memcached_server (struct config_file *cf, char *str) { @@ -126,6 +144,7 @@ init_defaults (struct config_file *cfg) cfg->memcached_protocol = TCP_TEXT; cfg->workers_number = DEFAULT_WORKERS_NUM; + cfg->modules_opts = g_hash_table_new (g_str_hash, g_str_equal); LIST_INIT (&cfg->filters); LIST_INIT (&cfg->perl_modules); @@ -178,6 +197,10 @@ free_config (struct config_file *cfg) } free (cmodule); } + + g_hash_table_foreach (cfg->modules_opts, clean_hash_bucket, NULL); + g_hash_table_remove_all (cfg->modules_opts); + g_hash_table_unref (cfg->modules_opts); } int |