summaryrefslogtreecommitdiffstats
path: root/grammar
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2011-07-19 11:23:57 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2011-07-19 11:23:57 +0200
commit47c961eac280f72a472ad82764f8fd450ba3643f (patch)
tree131fbed2ff68f457266902b9752ce1b657bc2e6f /grammar
parent127d61fea78c967d2cdc536f898da425ffdd8a11 (diff)
downloadrsyslog-47c961eac280f72a472ad82764f8fd450ba3643f.tar.gz
rsyslog-47c961eac280f72a472ad82764f8fd450ba3643f.tar.xz
rsyslog-47c961eac280f72a472ad82764f8fd450ba3643f.zip
milestone: two syntaxes for get conf param implemented
Diffstat (limited to 'grammar')
-rw-r--r--grammar/rainerscript.c79
-rw-r--r--grammar/rainerscript.h1
2 files changed, 76 insertions, 4 deletions
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c
index 754910da..502deece 100644
--- a/grammar/rainerscript.c
+++ b/grammar/rainerscript.c
@@ -202,21 +202,59 @@ nvlstChkUnused(struct nvlst *lst)
}
+static inline void
+doGetBinary(struct nvlst *valnode, struct cnfparamdescr *param,
+ struct cnfparamvals *val)
+{
+ val->val.datatype = 'N';
+ if(!es_strbufcmp(valnode->val.d.estr, (unsigned char*) "on", 2)) {
+ val->val.d.n = 1;
+ } else if(!es_strbufcmp(valnode->val.d.estr, (unsigned char*) "off", 3)) {
+ val->val.d.n = 0;
+ } else {
+ parser_errmsg("parameter '%s' must be \"on\" or \"off\" but "
+ "is neither. Results unpredictable.", param->name);
+ val->val.d.n = 0;
+ }
+}
+
+
+static inline void
+doGetWord(struct nvlst *valnode, struct cnfparamdescr *param,
+ struct cnfparamvals *val)
+{
+ es_size_t i;
+ unsigned char *c;
+ val->val.datatype = 'S';
+ val->val.d.estr = es_newStr(32);
+ c = es_getBufAddr(valnode->val.d.estr);
+ for(i = 0 ; i < es_strlen(valnode->val.d.estr) && !isspace(c[i]) ; ++i) {
+ es_addChar(&val->val.d.estr, c[i]);
+ }
+ if(i != es_strlen(valnode->val.d.estr)) {
+ parser_errmsg("parameter '%s' contains whitespace, which is not "
+ "permitted - data after first whitespace ignored",
+ param->name);
+ }
+}
+
/* get a single parameter according to its definition. Helper to
* nvlstGetParams.
*/
static inline void
nvlstGetParam(struct nvlst *valnode, struct cnfparamdescr *param,
- struct cnfparamvals *vals)
+ struct cnfparamvals *val)
{
dbgprintf("XXXX: in nvlstGetParam, name '%s', type %d\n",
param->name, (int) param->type);
+ val->bUsed = 1;
switch(param->type) {
case eCmdHdlrUID:
break;
case eCmdHdlrGID:
break;
case eCmdHdlrBinary:
+ doGetBinary(valnode, param, val);
break;
case eCmdHdlrFileCreateMode:
break;
@@ -231,8 +269,11 @@ nvlstGetParam(struct nvlst *valnode, struct cnfparamdescr *param,
case eCmdHdlrSeverity:
break;
case eCmdHdlrGetWord:
+ doGetWord(valnode, param, val);
break;
case eCmdHdlrString:
+ val->val.datatype = 'S';
+ val->val.d.estr = es_strdup(valnode->val.d.estr);
break;
case eCmdHdlrGoneAway:
parser_errmsg("parameter '%s' is no longer supported",
@@ -267,9 +308,9 @@ nvlstGetParams(struct nvlst *lst, struct cnfparamblk *params,
}
if(vals == NULL) {
- if((vals = malloc(params->nParams *
+ if((vals = calloc(params->nParams,
sizeof(struct cnfparamvals))) == NULL)
- return NULL;
+ return NULL;
}
for(i = 0 ; i < params->nParams ; ++i) {
@@ -281,12 +322,42 @@ nvlstGetParams(struct nvlst *lst, struct cnfparamblk *params,
"one instance is ignored. Fix config", param->name);
continue;
}
- nvlstGetParam(lst, param, vals + i);
+ nvlstGetParam(valnode, param, vals + i);
}
return vals;
}
+void
+cnfparamsPrint(struct cnfparamblk *params, struct cnfparamvals *vals)
+{
+ int i;
+ char *cstr;
+
+ for(i = 0 ; i < params->nParams ; ++i) {
+ dbgprintf("%s: ", params->descr[i].name);
+ if(vals[i].bUsed) {
+ // TODO: other types!
+ switch(vals[i].val.datatype) {
+ case 'S':
+ cstr = es_str2cstr(vals[i].val.d.estr, NULL);
+ dbgprintf(" '%s'", cstr);
+ free(cstr);
+ break;
+ case 'N':
+ dbgprintf("%lld", vals[i].val.d.n);
+ break;
+ default:
+ dbgprintf("(unsupported datatype %c)",
+ vals[i].val.datatype);
+ }
+ } else {
+ dbgprintf("(unset)");
+ }
+ dbgprintf("\n");
+ }
+}
+
struct cnfobj*
cnfobjNew(enum cnfobjType objType, struct nvlst *lst)
{
diff --git a/grammar/rainerscript.h b/grammar/rainerscript.h
index 1dc5719d..03e59895 100644
--- a/grammar/rainerscript.h
+++ b/grammar/rainerscript.h
@@ -241,6 +241,7 @@ int cnfDoInclude(char *name);
int cnfparamGetIdx(struct cnfparamblk *params, char *name);
struct cnfparamvals* nvlstGetParams(struct nvlst *lst, struct cnfparamblk *params,
struct cnfparamvals *vals);
+void cnfparamsPrint(struct cnfparamblk *params, struct cnfparamvals *vals);
/* debug helper */
void cstrPrint(char *text, es_str_t *estr);