diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2011-07-19 11:23:57 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2011-07-19 11:23:57 +0200 |
commit | 47c961eac280f72a472ad82764f8fd450ba3643f (patch) | |
tree | 131fbed2ff68f457266902b9752ce1b657bc2e6f /grammar/rainerscript.c | |
parent | 127d61fea78c967d2cdc536f898da425ffdd8a11 (diff) | |
download | rsyslog-47c961eac280f72a472ad82764f8fd450ba3643f.tar.gz rsyslog-47c961eac280f72a472ad82764f8fd450ba3643f.tar.xz rsyslog-47c961eac280f72a472ad82764f8fd450ba3643f.zip |
milestone: two syntaxes for get conf param implemented
Diffstat (limited to 'grammar/rainerscript.c')
-rw-r--r-- | grammar/rainerscript.c | 79 |
1 files changed, 75 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) { |