In addition what Gergely just said, this seems to be a genuine bug in the system() source as it unconditionally uses newer features, even though the version you specified is older than that.
Too bad. the code for the system source is pretty inconvinient a fragile to modify, but anyway I wrote an untested patch that should solve this issue. However while trying I noticed it is not enough, SCL is pretty incompatible with early @version tags. With my 3.7 tree, we are using stuff like "template-function" declarations, which is again unsupported in old config versions. If stuff like python blocks appear in SCL include files, then the entire @version stuff would become futile if the config in question uses SCL.
I'm starting to think that new keywords shouldn't be considered identifiers even with old config versions, as that's the only thing preventing your configuration to work. In that case if someone used a keyword as an identifier would have a conflict, but that's probably less likely than an inoperable construct in SCL, and I don't want to put too much ifdef mockery into SCL itself.
Would you like to try this patch:
$ git diff
diff --git a/lib/cfg-lexer.c b/lib/cfg-lexer.c
index 80d36f2..d0fd30c 100644
--- a/lib/cfg-lexer.c
+++ b/lib/cfg-lexer.c
@@ -195,7 +195,7 @@ cfg_lexer_lookup_keyword(CfgLexer *self, YYSTYPE *yylval, YYLTYPE *yylloc, const
if (token[j] == 0 && keywords[i].kw_name[j] == 0)
{
/* match */
- if (cfg_is_config_version_older(configuration, keywords[i].kw_req_version))
+ if (0 && cfg_is_config_version_older(configuration, keywords[i].kw_req_version))
{
msg_warning("WARNING: Your configuration uses a newly introduced reserved word as identifier, please use a different name or enclose it in quotes before upgrading",
evt_tag_str("keyword", keywords[i].kw_name),
Google may clobber the patch itself, but it simply disables the "too new keyword for this config version" check and lets syslog-ng process any new keywords (such as channel generated by system()).
The entire "too new keyword" used was added becauses SLES 11 used "null" as a destination name, which became reserved in 3.1-3.2 timeframe causing syntax errors in established configs. We might just add one such exception for the "null" keyword and be done with the generic check.
Any opinions?