diff options
-rw-r--r-- | grammar/rainerscript.c | 8 | ||||
-rw-r--r-- | grammar/rainerscript.h | 1 | ||||
-rw-r--r-- | runtime/msg.c | 45 | ||||
-rw-r--r-- | runtime/msg.h | 7 | ||||
-rw-r--r-- | runtime/typedefs.h | 1 | ||||
-rw-r--r-- | template.c | 30 |
6 files changed, 32 insertions, 60 deletions
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c index 3caa585c..e4a2caa0 100644 --- a/grammar/rainerscript.c +++ b/grammar/rainerscript.c @@ -1606,9 +1606,10 @@ evalVar(struct cnfvar *var, void *usrptr, struct var *ret) rsRetVal localRet; struct json_object *json; - if(var->name[0] == '$' && var->name[1] == '!') { -#warning chace strlen()? - localRet = msgGetCEEPropJSON((msg_t*)usrptr, (uchar*)var->name+1, strlen(var->name)-1, &json); + if(var->prop.id == PROP_CEE || + var->prop.id == PROP_LOCAL_VAR || + var->prop.id == PROP_GLOBAL_VAR ) { + localRet = msgGetJSONPropJSON((msg_t*)usrptr, &var->prop, &json); ret->datatype = 'J'; ret->d.json = (localRet == RS_RET_OK) ? json : NULL; } else { @@ -2543,6 +2544,7 @@ cnfvarNew(char *name) if((var = malloc(sizeof(struct cnfvar))) != NULL) { var->nodetype = 'V'; var->name = name; + msgPropDescrFill(&var->prop, (uchar*)name, strlen(name)); } return var; } diff --git a/grammar/rainerscript.h b/grammar/rainerscript.h index 7a4f1ac9..001dff4e 100644 --- a/grammar/rainerscript.h +++ b/grammar/rainerscript.h @@ -208,6 +208,7 @@ struct cnfstringval { struct cnfvar { unsigned nodetype; char *name; + msgPropDescr_t prop; }; struct cnfarray { diff --git a/runtime/msg.c b/runtime/msg.c index b1b912a4..407fee72 100644 --- a/runtime/msg.c +++ b/runtime/msg.c @@ -2578,54 +2578,43 @@ getGlobalVarPropVal(uchar *propName, int propNameLen, uchar **pRes, rs_size_t *b /* Get a JSON-based-variable as native json object */ rsRetVal -msgGetJSONPropJSON(struct json_object *jroot, uchar *propName, int propNameLen, struct json_object **pjson) +msgGetJSONPropJSON(msg_t *pMsg, msgPropDescr_t *pProp, struct json_object **pjson) { + struct json_object *jroot; uchar *leaf; struct json_object *parent; DEFiRet; - if(jroot == NULL) { + if(pProp->id == PROP_CEE) { + jroot = pMsg->json; + } else if(pProp->id == PROP_LOCAL_VAR) { + jroot = pMsg->localvars; + } else if(pProp->id == PROP_GLOBAL_VAR) { + pthread_rwlock_rdlock(&glblVars_rwlock); + jroot = global_var_root; + } else { + DBGPRINTF("msgGetJSONPropJSON; invalid property id %d\n", + pProp->id); ABORT_FINALIZE(RS_RET_NOT_FOUND); } - if(!strcmp((char*)propName, "!") || - !strcmp((char*)propName, ".") || - !strcmp((char*)propName, "/") ) { + if(!strcmp((char*)pProp->name, "!")) { *pjson = jroot; FINALIZE; } - leaf = jsonPathGetLeaf(propName, propNameLen); - CHKiRet(jsonPathFindParent(jroot, propName, leaf, &parent, 1)); + leaf = jsonPathGetLeaf(pProp->name, pProp->nameLen); + CHKiRet(jsonPathFindParent(jroot, pProp->name, leaf, &parent, 1)); *pjson = json_object_object_get(parent, (char*)leaf); if(*pjson == NULL) { ABORT_FINALIZE(RS_RET_NOT_FOUND); } finalize_it: + if(pProp->id == PROP_GLOBAL_VAR) + pthread_rwlock_unlock(&glblVars_rwlock); RETiRet; } -rsRetVal -msgGetCEEPropJSON(msg_t *pM, uchar *propName, int propNameLen, struct json_object **pjson) -{ - return msgGetJSONPropJSON(pM->json, propName, propNameLen, pjson); -} - -rsRetVal -msgGetLocalVarJSON(msg_t *pM, uchar *propName, int propNameLen, struct json_object **pjson) -{ - return msgGetJSONPropJSON(pM->localvars, propName, propNameLen, pjson); -} - -rsRetVal -msgGetGlobalVarJSON(uchar *propName, int propNameLen, struct json_object **pjson) -{ - DEFiRet; - pthread_rwlock_rdlock(&glblVars_rwlock); - iRet = msgGetJSONPropJSON(global_var_root, propName, propNameLen, pjson); - pthread_rwlock_unlock(&glblVars_rwlock); - RETiRet; -} /* Encode a JSON value and add it to provided string. Note that * the string object may be NULL. In this case, it is created diff --git a/runtime/msg.h b/runtime/msg.h index 4dcc0579..3e6bf767 100644 --- a/runtime/msg.h +++ b/runtime/msg.h @@ -214,10 +214,11 @@ uchar *getProgramName(msg_t *pM, sbool bLockMutex); uchar *getRcvFrom(msg_t *pM); rsRetVal propNameToID(uchar *pName, propid_t *pPropID); uchar *propIDToName(propid_t propID); -rsRetVal msgGetCEEPropJSON(msg_t *pM, uchar *propName, int propNameLen, struct json_object **pjson); +rsRetVal msgGetCEEPropJSON(msg_t *pM, msgPropDescr_t *pProp, struct json_object **pjson); rsRetVal getGlobalVarPropVal(uchar *propName, int propNameLen, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed); -rsRetVal msgGetLocalVarJSON(msg_t *pM, uchar *propName, int propNameLen, struct json_object **pjson); -rsRetVal msgGetGlobalVarJSON(uchar *propName, int propNameLen, struct json_object **pjson); +rsRetVal msgGetLocalVarJSON(msg_t *pM, msgPropDescr_t *pProp, struct json_object **pjson); +rsRetVal msgGetGlobalVarJSON(msgPropDescr_t *pProp, struct json_object **pjson); +rsRetVal msgGetJSONPropJSON(msg_t *pMsg, msgPropDescr_t *pProp, struct json_object **pjson); rsRetVal msgSetJSONFromVar(msg_t *pMsg, uchar *varname, struct var *var); rsRetVal msgDelJSON(msg_t *pMsg, uchar *varname); rsRetVal jsonFind(struct json_object *jroot, uchar *propName, int propNameLen, struct json_object **jsonres); diff --git a/runtime/typedefs.h b/runtime/typedefs.h index 22fc23d8..2efd7d65 100644 --- a/runtime/typedefs.h +++ b/runtime/typedefs.h @@ -209,6 +209,7 @@ typedef uintTiny propid_t; #define PROP_CEE 200 #define PROP_CEE_ALL_JSON 201 #define PROP_LOCAL_VAR 202 +#define PROP_GLOBAL_VAR 203 /* types of configuration handlers */ @@ -343,8 +343,10 @@ tplToJSON(struct template *pTpl, msg_t *pMsg, struct json_object **pjson, struct jsonf = json_object_new_string((char*) pTpe->data.constant.pConstant); json_object_object_add(json, (char*)pTpe->fieldName, jsonf); } else if(pTpe->eEntryType == FIELD) { - if(pTpe->data.field.msgProp.id == PROP_CEE) { - localRet = msgGetCEEPropJSON(pMsg, pTpe->data.field.msgProp.name, pTpe->data.field.msgProp.nameLen, &jsonf); + if(pTpe->data.field.msgProp.id == PROP_CEE || + pTpe->data.field.msgProp.id == PROP_LOCAL_VAR || + pTpe->data.field.msgProp.id == PROP_GLOBAL_VAR ) { + localRet = msgGetJSONPropJSON(pMsg, &pTpe->data.field.msgProp, &jsonf); if(localRet == RS_RET_OK) { json_object_object_add(json, (char*)pTpe->fieldName, json_object_get(jsonf)); } else { @@ -354,30 +356,6 @@ tplToJSON(struct template *pTpl, msg_t *pMsg, struct json_object **pjson, struct json_object_object_add(json, (char*)pTpe->fieldName, NULL); } } - } else if(pTpe->data.field.msgProp.id == PROP_LOCAL_VAR) { - localRet = msgGetLocalVarJSON(pMsg, pTpe->data.field.msgProp.name, pTpe->data.field.msgProp.nameLen, &jsonf); - if(localRet == RS_RET_OK) { - json_object_object_add(json, (char*)pTpe->fieldName, json_object_get(jsonf)); - } else { - DBGPRINTF("tplToJSON: error %d looking up local variable %s\n", - localRet, pTpe->fieldName); - if(pTpe->data.field.options.bMandatory) { - json_object_object_add(json, (char*)pTpe->fieldName, NULL); - } - } -#if 0 /* do not remove this code *for the moment* -- rgerhards, 2013-10-22 */ - } else if(pTpe->data.field.msgProp.id == PROP_GLOBAL_VAR) { - localRet = msgGetGlobalVarJSON(pTpe->data.field.msgProp.name, pTpe->data.field.msgProp.nameLen, &jsonf); - if(localRet == RS_RET_OK) { - json_object_object_add(json, (char*)pTpe->fieldName, json_object_get(jsonf)); - } else { - DBGPRINTF("tplToJSON: error %d looking up local variable %s\n", - localRet, pTpe->fieldName); - if(pTpe->data.field.options.bMandatory) { - json_object_object_add(json, (char*)pTpe->fieldName, NULL); - } - } -#endif } else { pVal = (uchar*) MsgGetProp(pMsg, pTpe, &pTpe->data.field.msgProp, &propLen, &bMustBeFreed, ttNow); |