diff options
-rw-r--r-- | grammar/rainerscript.c | 21 | ||||
-rw-r--r-- | grammar/rainerscript.h | 4 | ||||
-rw-r--r-- | plugins/ommongodb/ommongodb.c | 10 | ||||
-rw-r--r-- | runtime/msg.c | 79 | ||||
-rw-r--r-- | runtime/msg.h | 14 | ||||
-rw-r--r-- | runtime/ruleset.c | 17 | ||||
-rw-r--r-- | template.c | 80 | ||||
-rw-r--r-- | template.h | 6 |
8 files changed, 101 insertions, 130 deletions
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c index b73366c2..ff472b52 100644 --- a/grammar/rainerscript.c +++ b/grammar/rainerscript.c @@ -47,6 +47,7 @@ #include "obj.h" #include "modules.h" #include "ruleset.h" +#include "unicode-helper.h" DEFobjCurrIf(obj) DEFobjCurrIf(regexp) @@ -185,10 +186,8 @@ DecodePropFilter(uchar *pline, struct cnfstmt *stmt) } if(stmt->d.s_propfilt.propID == PROP_CEE) { /* in CEE case, we need to preserve the actual property name */ - if((stmt->d.s_propfilt.propName = - es_newStrFromBuf((char*)cstrGetSzStrNoNULL(pCSPropName)+2, cstrLen(pCSPropName)-2)) == NULL) { - ABORT_FINALIZE(RS_RET_ERR); - } + stmt->d.s_propfilt.propName = ustrdup(cstrGetSzStrNoNULL(pCSPropName+2)); + stmt->d.s_propfilt.propNameLen = cstrLen(pCSPropName)-2; } /* read operation */ @@ -1614,14 +1613,11 @@ static inline void evalVar(struct cnfvar *var, void *usrptr, struct var *ret) { rsRetVal localRet; - es_str_t *estr; struct json_object *json; if(var->name[0] == '$' && var->name[1] == '!') { - /* TODO: unify string libs */ - estr = es_newStrFromBuf(var->name+1, strlen(var->name)-1); - localRet = msgGetCEEPropJSON((msg_t*)usrptr, estr, &json); - es_deleteStr(estr); +#warning chace strlen()? + localRet = msgGetCEEPropJSON((msg_t*)usrptr, (uchar*)var->name+1, strlen(var->name)-1, &json); ret->datatype = 'J'; ret->d.json = (localRet == RS_RET_OK) ? json : NULL; } else { @@ -2448,10 +2444,8 @@ cnfstmtPrintOnly(struct cnfstmt *stmt, int indent, sbool subtree) doIndent(indent); dbgprintf("\tProperty.: '%s'\n", propIDToName(stmt->d.s_propfilt.propID)); if(stmt->d.s_propfilt.propName != NULL) { - cstr = es_str2cstr(stmt->d.s_propfilt.propName, NULL); doIndent(indent); - dbgprintf("\tCEE-Prop.: '%s'\n", cstr); - free(cstr); + dbgprintf("\tCEE-Prop.: '%s'\n", stmt->d.s_propfilt.propName); } doIndent(indent); dbgprintf("\tOperation: "); if(stmt->d.s_propfilt.isNegated) @@ -2611,8 +2605,7 @@ cnfstmtDestruct(struct cnfstmt *stmt) cnfstmtDestructLst(stmt->d.s_prifilt.t_else); break; case S_PROPFILT: - if(stmt->d.s_propfilt.propName != NULL) - es_deleteStr(stmt->d.s_propfilt.propName); + free(stmt->d.s_propfilt.propName); if(stmt->d.s_propfilt.regex_cache != NULL) rsCStrRegexDestruct(&stmt->d.s_propfilt.regex_cache); if(stmt->d.s_propfilt.pCSCompValue != NULL) diff --git a/grammar/rainerscript.h b/grammar/rainerscript.h index 4a508f93..7bbd7456 100644 --- a/grammar/rainerscript.h +++ b/grammar/rainerscript.h @@ -183,7 +183,9 @@ struct cnfstmt { struct cstr_s *pCSCompValue;/* value to "compare" against */ sbool isNegated; uintTiny propID;/* ID of the requested property */ - es_str_t *propName;/* name of property for CEE-based filters */ + //es_str_t *propName;/* name of property for CEE-based filters */ + uchar *propName; + int propNameLen; struct cnfstmt *t_then; struct cnfstmt *t_else; } s_propfilt; diff --git a/plugins/ommongodb/ommongodb.c b/plugins/ommongodb/ommongodb.c index ecfd2518..85f09d1b 100644 --- a/plugins/ommongodb/ommongodb.c +++ b/plugins/ommongodb/ommongodb.c @@ -236,11 +236,11 @@ getDefaultBSON(msg_t *pMsg) gint64 ts_gen, ts_rcv; /* timestamps: generated, received */ int secfrac; - procid = MsgGetProp(pMsg, NULL, PROP_PROGRAMNAME, NULL, &procid_len, &procid_free, NULL); - tag = MsgGetProp(pMsg, NULL, PROP_SYSLOGTAG, NULL, &tag_len, &tag_free, NULL); - pid = MsgGetProp(pMsg, NULL, PROP_PROCID, NULL, &pid_len, &pid_free, NULL); - sys = MsgGetProp(pMsg, NULL, PROP_HOSTNAME, NULL, &sys_len, &sys_free, NULL); - msg = MsgGetProp(pMsg, NULL, PROP_MSG, NULL, &msg_len, &msg_free, NULL); + procid = MsgGetProp(pMsg, NULL, PROP_PROGRAMNAME, NULL, 0, &procid_len, &procid_free, NULL); + tag = MsgGetProp(pMsg, NULL, PROP_SYSLOGTAG, NULL, 0, &tag_len, &tag_free, NULL); + pid = MsgGetProp(pMsg, NULL, PROP_PROCID, NULL, 0, &pid_len, &pid_free, NULL); + sys = MsgGetProp(pMsg, NULL, PROP_HOSTNAME, NULL, 0, &sys_len, &sys_free, NULL); + msg = MsgGetProp(pMsg, NULL, PROP_MSG, NULL, 0, &msg_len, &msg_free, NULL); // TODO: move to datetime? Refactor in any case! rgerhards, 2012-03-30 ts_gen = (gint64) datetime.syslogTime2time_t(&pMsg->tTIMESTAMP) * 1000; /* ms! */ diff --git a/runtime/msg.c b/runtime/msg.c index 2e5d9358..c7e2bcc6 100644 --- a/runtime/msg.c +++ b/runtime/msg.c @@ -2538,9 +2538,8 @@ static uchar *getNOW(eNOWType eNow, struct syslogTime *t) /* Get a JSON-Property as string value (used for various types of JSON-based vars) */ static rsRetVal -getJSONPropVal(struct json_object *jroot, es_str_t *propName, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed) +getJSONPropVal(struct json_object *jroot, uchar *propName, int propNameLen, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed) { - uchar *name = NULL; uchar *leaf; struct json_object *parent; struct json_object *field; @@ -2549,15 +2548,15 @@ getJSONPropVal(struct json_object *jroot, es_str_t *propName, uchar **pRes, rs_s if(*pbMustBeFreed) free(*pRes); *pRes = NULL; - // TODO: mutex? if(jroot == NULL) goto finalize_it; - if(!es_strbufcmp(propName, (uchar*)"!", 1)) { + if(!strcmp((char*)propName, "!") || + !strcmp((char*)propName, ".") || + !strcmp((char*)propName, "/") ) { field = jroot; } else { - name = (uchar*)es_str2cstr(propName, NULL); - leaf = jsonPathGetLeaf(name+1, ustrlen(name-1)); - CHKiRet(jsonPathFindParent(jroot, name+1, leaf, &parent, 1)); + leaf = jsonPathGetLeaf(propName, propNameLen); + CHKiRet(jsonPathFindParent(jroot, propName+1, leaf, &parent, 1)); field = json_object_object_get(parent, (char*)leaf); } if(field != NULL) { @@ -2567,7 +2566,6 @@ getJSONPropVal(struct json_object *jroot, es_str_t *propName, uchar **pRes, rs_s } finalize_it: - free(name); if(*pRes == NULL) { /* could not find any value, so set it to empty */ *pRes = (unsigned char*)""; @@ -2577,23 +2575,23 @@ finalize_it: } rsRetVal -getCEEPropVal(msg_t *pM, es_str_t *propName, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed) +getCEEPropVal(msg_t *pM, uchar *propName, int propNameLen, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed) { - return getJSONPropVal(pM->json, propName, pRes, buflen, pbMustBeFreed); + return getJSONPropVal(pM->json, propName, propNameLen, pRes, buflen, pbMustBeFreed); } rsRetVal -getLocalVarPropVal(msg_t *pM, es_str_t *propName, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed) +getLocalVarPropVal(msg_t *pM, uchar *propName, int propNameLen, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed) { - return getJSONPropVal(pM->localvars, propName, pRes, buflen, pbMustBeFreed); + return getJSONPropVal(pM->localvars, propName, propNameLen, pRes, buflen, pbMustBeFreed); } rsRetVal -getGlobalVarPropVal( es_str_t *propName, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed) +getGlobalVarPropVal(uchar *propName, int propNameLen, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed) { DEFiRet; pthread_rwlock_rdlock(&glblVars_rwlock); - iRet = getJSONPropVal(global_var_root, propName, pRes, buflen, pbMustBeFreed); + iRet = getJSONPropVal(global_var_root, propName, propNameLen, pRes, buflen, pbMustBeFreed); pthread_rwlock_unlock(&glblVars_rwlock); RETiRet; } @@ -2601,53 +2599,51 @@ getGlobalVarPropVal( es_str_t *propName, uchar **pRes, rs_size_t *buflen, unsign /* Get a JSON-based-variable as native json object */ rsRetVal -msgGetJSONPropJSON(struct json_object *jroot, es_str_t *propName, struct json_object **pjson) +msgGetJSONPropJSON(struct json_object *jroot, uchar *propName, int propNameLen, struct json_object **pjson) { - uchar *name = NULL; uchar *leaf; struct json_object *parent; DEFiRet; - // TODO: mutex? if(jroot == NULL) { ABORT_FINALIZE(RS_RET_NOT_FOUND); } - if(!es_strbufcmp(propName, (uchar*)"!", 1)) { + if(!strcmp((char*)propName, "!") || + !strcmp((char*)propName, ".") || + !strcmp((char*)propName, "/") ) { *pjson = jroot; FINALIZE; } - name = (uchar*)es_str2cstr(propName, NULL); - leaf = jsonPathGetLeaf(name, ustrlen(name)); - CHKiRet(jsonPathFindParent(jroot, name, leaf, &parent, 1)); + leaf = jsonPathGetLeaf(propName, propNameLen); + CHKiRet(jsonPathFindParent(jroot, propName, leaf, &parent, 1)); *pjson = json_object_object_get(parent, (char*)leaf); if(*pjson == NULL) { ABORT_FINALIZE(RS_RET_NOT_FOUND); } finalize_it: - free(name); RETiRet; } rsRetVal -msgGetCEEPropJSON(msg_t *pM, es_str_t *propName, struct json_object **pjson) +msgGetCEEPropJSON(msg_t *pM, uchar *propName, int propNameLen, struct json_object **pjson) { - return msgGetJSONPropJSON(pM->json, propName, pjson); + return msgGetJSONPropJSON(pM->json, propName, propNameLen, pjson); } rsRetVal -msgGetLocalVarJSON(msg_t *pM, es_str_t *propName, struct json_object **pjson) +msgGetLocalVarJSON(msg_t *pM, uchar *propName, int propNameLen, struct json_object **pjson) { - return msgGetJSONPropJSON(pM->localvars, propName, pjson); + return msgGetJSONPropJSON(pM->localvars, propName, propNameLen, pjson); } rsRetVal -msgGetGlobalVarJSON(es_str_t *propName, struct json_object **pjson) +msgGetGlobalVarJSON(uchar *propName, int propNameLen, struct json_object **pjson) { DEFiRet; pthread_rwlock_rdlock(&glblVars_rwlock); - iRet = msgGetJSONPropJSON(global_var_root, propName, pjson); + iRet = msgGetJSONPropJSON(global_var_root, propName, propNameLen, pjson); pthread_rwlock_unlock(&glblVars_rwlock); RETiRet; } @@ -2852,7 +2848,7 @@ finalize_it: *pPropLen = sizeof("**OUT OF MEMORY**") - 1; \ return(UCHAR_CONSTANT("**OUT OF MEMORY**"));} uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe, - propid_t propid, es_str_t *propName, rs_size_t *pPropLen, + propid_t propid, uchar *propName, int propNameLen, rs_size_t *pPropLen, unsigned short *pbMustBeFreed, struct syslogTime *ttNow) { uchar *pRes; /* result pointer */ @@ -3047,13 +3043,13 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe, } break; case PROP_CEE: - getCEEPropVal(pMsg, propName, &pRes, &bufLen, pbMustBeFreed); + getCEEPropVal(pMsg, propName, propNameLen, &pRes, &bufLen, pbMustBeFreed); break; case PROP_LOCAL_VAR: - getLocalVarPropVal(pMsg, propName, &pRes, &bufLen, pbMustBeFreed); + getLocalVarPropVal(pMsg, propName, propNameLen, &pRes, &bufLen, pbMustBeFreed); break; case PROP_GLOBAL_VAR: - getGlobalVarPropVal(propName, &pRes, &bufLen, pbMustBeFreed); + getGlobalVarPropVal(propName, propNameLen, &pRes, &bufLen, pbMustBeFreed); break; case PROP_SYS_BOM: if(*pbMustBeFreed == 1) @@ -3777,16 +3773,14 @@ msgGetMsgVarNew(msg_t *pThis, uchar *name) propid_t propid; unsigned short bMustBeFreed = 0; es_str_t *estr; - es_str_t *propName; ISOBJ_TYPE_assert(pThis, msg); /* always call MsgGetProp() without a template specifier */ /* TODO: optimize propNameToID() call -- rgerhards, 2009-06-26 */ +#warning remove strlen() ? propNameStrToID(name, &propid); - propName = es_newStrFromCStr((char*)name, ustrlen(name)); // TODO: optimize! - pszProp = (uchar*) MsgGetProp(pThis, NULL, propid, propName, &propLen, &bMustBeFreed, NULL); - es_deleteStr(propName); + pszProp = (uchar*) MsgGetProp(pThis, NULL, propid, name, ustrlen(name), &propLen, &bMustBeFreed, NULL); estr = es_newStrFromCStr((char*)pszProp, propLen); if(bMustBeFreed) @@ -3981,9 +3975,8 @@ DBGPRINTF("AAAA jsonMerge adds '%s'\n", it.key); /* find a JSON structure element (field or container doesn't matter). */ rsRetVal -jsonFind(struct json_object *jroot, es_str_t *propName, struct json_object **jsonres) +jsonFind(struct json_object *jroot, uchar *propName, int propNameLen, struct json_object **jsonres) { - uchar *name = NULL; uchar *leaf; struct json_object *parent; struct json_object *field; @@ -3994,18 +3987,18 @@ jsonFind(struct json_object *jroot, es_str_t *propName, struct json_object **jso goto finalize_it; } - if(!es_strbufcmp(propName, (uchar*)"!", 1)) { + if(!strcmp((char*)propName, "!") || + !strcmp((char*)propName, ".") || + !strcmp((char*)propName, "/") ) { field = jroot; } else { - name = (uchar*)es_str2cstr(propName, NULL); - leaf = jsonPathGetLeaf(name, ustrlen(name)); - CHKiRet(jsonPathFindParent(jroot, name, leaf, &parent, 0)); + leaf = jsonPathGetLeaf(propName, propNameLen); + CHKiRet(jsonPathFindParent(jroot, propName, leaf, &parent, 0)); field = json_object_object_get(parent, (char*)leaf); } *jsonres = field; finalize_it: - free(name); RETiRet; } diff --git a/runtime/msg.h b/runtime/msg.h index ed15622a..6e27e398 100644 --- a/runtime/msg.h +++ b/runtime/msg.h @@ -184,7 +184,7 @@ void MsgSetRawMsgWOSize(msg_t *pMsg, char* pszRawMsg); void MsgSetRawMsg(msg_t *pMsg, char* pszRawMsg, size_t lenMsg); rsRetVal MsgReplaceMSG(msg_t *pThis, uchar* pszMSG, int lenMSG); uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe, - propid_t propid, es_str_t *propName, + propid_t propid, uchar *propName, int propNameLen, rs_size_t *pPropLen, unsigned short *pbMustBeFreed, struct syslogTime *ttNow); rsRetVal msgGetMsgVar(msg_t *pThis, cstr_t *pstrPropName, var_t **ppVar); es_str_t* msgGetMsgVarNew(msg_t *pThis, uchar *name); @@ -197,7 +197,7 @@ rsRetVal msgGetCEEVar(msg_t *pThis, cstr_t *propName, var_t **ppVar); es_str_t* msgGetCEEVarNew(msg_t *pMsg, char *name); es_str_t* msgGetLocalVarNew(msg_t *pMsg, char *name); rsRetVal msgAddJSON(msg_t *pM, uchar *name, struct json_object *json); -rsRetVal getCEEPropVal(msg_t *pM, es_str_t *propName, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed); +rsRetVal getCEEPropVal(msg_t *pM, uchar *propName, int propNameLen, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed); rsRetVal MsgGetSeverity(msg_t *pThis, int *piSeverity); rsRetVal MsgDeserialize(msg_t *pMsg, strm_t *pStrm); @@ -215,13 +215,13 @@ uchar *getProgramName(msg_t *pM, sbool bLockMutex); uchar *getRcvFrom(msg_t *pM); rsRetVal propNameToID(cstr_t *pCSPropName, propid_t *pPropID); uchar *propIDToName(propid_t propID); -rsRetVal msgGetCEEPropJSON(msg_t *pM, es_str_t *propName, struct json_object **pjson); -rsRetVal getGlobalVarPropVal( es_str_t *propName, uchar **pRes, rs_size_t *buflen, unsigned short *pbMustBeFreed); -rsRetVal msgGetLocalVarJSON(msg_t *pM, es_str_t *propName, struct json_object **pjson); -rsRetVal msgGetGlobalVarJSON(es_str_t *propName, struct json_object **pjson); +rsRetVal msgGetCEEPropJSON(msg_t *pM, uchar *propName, int propNameLen, 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 msgSetJSONFromVar(msg_t *pMsg, uchar *varname, struct var *var); rsRetVal msgDelJSON(msg_t *pMsg, uchar *varname); -rsRetVal jsonFind(struct json_object *jroot, es_str_t *propName, struct json_object **jsonres); +rsRetVal jsonFind(struct json_object *jroot, uchar *propName, int propNameLen, struct json_object **jsonres); static inline rsRetVal msgUnsetJSON(msg_t *pMsg, uchar *varname) { diff --git a/runtime/ruleset.c b/runtime/ruleset.c index dae5bbaa..9c7550c6 100644 --- a/runtime/ruleset.c +++ b/runtime/ruleset.c @@ -396,8 +396,8 @@ evalPROPFILT(struct cnfstmt *stmt, msg_t *pMsg) goto done; pszPropVal = MsgGetProp(pMsg, NULL, stmt->d.s_propfilt.propID, - stmt->d.s_propfilt.propName, &propLen, - &pbMustBeFreed, NULL); + stmt->d.s_propfilt.propName, stmt->d.s_propfilt.propNameLen, + &propLen, &pbMustBeFreed, NULL); /* Now do the compares (short list currently ;)) */ switch(stmt->d.s_propfilt.operation ) { @@ -441,22 +441,15 @@ evalPROPFILT(struct cnfstmt *stmt, msg_t *pMsg) bRet = (bRet == 1) ? 0 : 1; if(Debug) { - char *cstr; if(stmt->d.s_propfilt.propID == PROP_CEE) { - cstr = es_str2cstr(stmt->d.s_propfilt.propName, NULL); DBGPRINTF("Filter: check for CEE property '%s' (value '%s') ", - cstr, pszPropVal); - free(cstr); + stmt->d.s_propfilt.propName, pszPropVal); } else if(stmt->d.s_propfilt.propID == PROP_LOCAL_VAR) { - cstr = es_str2cstr(stmt->d.s_propfilt.propName, NULL); DBGPRINTF("Filter: check for local var '%s' (value '%s') ", - cstr, pszPropVal); - free(cstr); + stmt->d.s_propfilt.propName, pszPropVal); } else if(stmt->d.s_propfilt.propID == PROP_GLOBAL_VAR) { - cstr = es_str2cstr(stmt->d.s_propfilt.propName, NULL); DBGPRINTF("Filter: check for global var '%s' (value '%s') ", - cstr, pszPropVal); - free(cstr); + stmt->d.s_propfilt.propName, pszPropVal); } else { DBGPRINTF("Filter: check for property '%s' (value '%s') ", propIDToName(stmt->d.s_propfilt.propID), pszPropVal); @@ -169,7 +169,7 @@ tplToString(struct template *pTpl, msg_t *pMsg, uchar **ppBuf, size_t *pLenBuf, * not worth the effort, as this passing mode is not expected * in subtree mode and so most probably only used for debug & test. */ - getCEEPropVal(pMsg, pTpl->subtree, &pVal, &iLenVal, &bMustBeFreed); + getCEEPropVal(pMsg, pTpl->subtree, pTpl->subtreeLen, &pVal, &iLenVal, &bMustBeFreed); if(iLenVal >= (rs_size_t)*pLenBuf) /* we reserve one char for the final \0! */ CHKiRet(ExtendBuf(ppBuf, pLenBuf, iLenVal + 1)); memcpy(*ppBuf, pVal, iLenVal+1); @@ -194,8 +194,8 @@ tplToString(struct template *pTpl, msg_t *pMsg, uchar **ppBuf, size_t *pLenBuf, bMustBeFreed = 0; } else if(pTpe->eEntryType == FIELD) { pVal = (uchar*) MsgGetProp(pMsg, pTpe, pTpe->data.field.propid, - pTpe->data.field.propName, &iLenVal, - &bMustBeFreed, ttNow); + pTpe->data.field.propName, pTpe->data.field.propNameLen, + &iLenVal, &bMustBeFreed, ttNow); /* we now need to check if we should use SQL option. In this case, * we must go over the generated string and escape '\'' characters. * rgerhards, 2005-09-22: the option values below look somewhat misplaced, @@ -269,7 +269,7 @@ tplToArray(struct template *pTpl, msg_t *pMsg, uchar*** ppArr, struct syslogTime * using array passing, so I simply could not test it. */ CHKmalloc(pArr = calloc(2, sizeof(uchar*))); - getCEEPropVal(pMsg, pTpl->subtree, &pVal, &propLen, &bMustBeFreed); + getCEEPropVal(pMsg, pTpl->subtree, pTpl->subtreeLen, &pVal, &propLen, &bMustBeFreed); if(bMustBeFreed) { /* if it must be freed, it is our own private copy... */ pArr[0] = pVal; /* ... so we can use it! */ } else { @@ -291,8 +291,8 @@ tplToArray(struct template *pTpl, msg_t *pMsg, uchar*** ppArr, struct syslogTime CHKmalloc(pArr[iArr] = (uchar*)strdup((char*) pTpe->data.constant.pConstant)); } else if(pTpe->eEntryType == FIELD) { pVal = (uchar*) MsgGetProp(pMsg, pTpe, pTpe->data.field.propid, - pTpe->data.field.propName, &propLen, - &bMustBeFreed, ttNow); + pTpe->data.field.propName, pTpe->data.field.propNameLen, + &propLen, &bMustBeFreed, ttNow); if(bMustBeFreed) { /* if it must be freed, it is our own private copy... */ pArr[iArr] = pVal; /* ... so we can use it! */ } else { @@ -327,7 +327,7 @@ tplToJSON(struct template *pTpl, msg_t *pMsg, struct json_object **pjson, struct DEFiRet; if(pTpl->subtree != NULL){ - localRet = jsonFind(pMsg->json, pTpl->subtree, pjson); + localRet = jsonFind(pMsg->json, pTpl->subtree, pTpl->subtreeLen, pjson); if(*pjson == NULL) { /* we need to have a root object! */ *pjson = json_object_new_object(); @@ -346,7 +346,7 @@ tplToJSON(struct template *pTpl, msg_t *pMsg, struct json_object **pjson, struct json_object_object_add(json, (char*)pTpe->fieldName, jsonf); } else if(pTpe->eEntryType == FIELD) { if(pTpe->data.field.propid == PROP_CEE) { - localRet = msgGetCEEPropJSON(pMsg, pTpe->data.field.propName, &jsonf); + localRet = msgGetCEEPropJSON(pMsg, pTpe->data.field.propName, pTpe->data.field.propNameLen, &jsonf); if(localRet == RS_RET_OK) { json_object_object_add(json, (char*)pTpe->fieldName, json_object_get(jsonf)); } else { @@ -357,7 +357,7 @@ tplToJSON(struct template *pTpl, msg_t *pMsg, struct json_object **pjson, struct } } } else if(pTpe->data.field.propid == PROP_LOCAL_VAR) { - localRet = msgGetLocalVarJSON(pMsg, pTpe->data.field.propName, &jsonf); + localRet = msgGetLocalVarJSON(pMsg, pTpe->data.field.propName, pTpe->data.field.propNameLen, &jsonf); if(localRet == RS_RET_OK) { json_object_object_add(json, (char*)pTpe->fieldName, json_object_get(jsonf)); } else { @@ -368,7 +368,7 @@ tplToJSON(struct template *pTpl, msg_t *pMsg, struct json_object **pjson, struct } } } else if(pTpe->data.field.propid == PROP_GLOBAL_VAR) { - localRet = msgGetGlobalVarJSON(pTpe->data.field.propName, &jsonf); + localRet = msgGetGlobalVarJSON(pTpe->data.field.propName, pTpe->data.field.propNameLen, &jsonf); if(localRet == RS_RET_OK) { json_object_object_add(json, (char*)pTpe->fieldName, json_object_get(jsonf)); } else { @@ -380,7 +380,8 @@ tplToJSON(struct template *pTpl, msg_t *pMsg, struct json_object **pjson, struct } } else { pVal = (uchar*) MsgGetProp(pMsg, pTpe, pTpe->data.field.propid, - pTpe->data.field.propName, &propLen, + pTpe->data.field.propName, + pTpe->data.field.propNameLen, &propLen, &bMustBeFreed, ttNow); if(pTpe->data.field.options.bMandatory || propLen > 0) { jsonf = json_object_new_string_len((char*)pVal, propLen); @@ -557,6 +558,7 @@ tplConstruct(rsconf_t *conf) struct template *pTpl; if((pTpl = calloc(1, sizeof(struct template))) == NULL) return NULL; +pTpl->subtree = NULL; /* basic initialisation is done via calloc() - need to * initialize only values != 0. */ @@ -815,17 +817,14 @@ do_Parameter(uchar **pp, struct template *pTpl) } if(pTpe->data.field.propid == PROP_CEE) { /* in CEE case, we need to preserve the actual property name */ - if((pTpe->data.field.propName = es_newStrFromCStr((char*)cstrGetSzStrNoNULL(pStrProp)+1, cstrLen(pStrProp)-1)) == NULL) { - cstrDestruct(&pStrProp); - ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY); - } + pTpe->data.field.propName = ustrdup(cstrGetSzStrNoNULL(pStrProp)+1); + pTpe->data.field.propNameLen = cstrLen(pStrProp)-1; } else if(pTpe->data.field.propid == PROP_LOCAL_VAR || pTpe->data.field.propid == PROP_GLOBAL_VAR) { /* in these cases, we need to preserve the actual property name, but correct the root ID (bang vs. dot) */ - if((pTpe->data.field.propName = es_newStrFromCStr((char*)cstrGetSzStrNoNULL(pStrProp)+1, cstrLen(pStrProp)-1)) == NULL) { - cstrDestruct(&pStrProp); - ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY); - } - es_getBufAddr(pTpe->data.field.propName)[0] = '!'; /* patch root name */ + pTpe->data.field.propName = ustrdup(cstrGetSzStrNoNULL(pStrProp)+1); + pTpe->data.field.propNameLen = cstrLen(pStrProp)-1; + pTpe->data.field.propName[0] = '!'; /* patch root name */ +#warning do we really need to patch root name? } /* Check frompos, if it has an R, then topos should be a regex */ @@ -1608,12 +1607,13 @@ createPropertyTpe(struct template *pTpl, struct cnfobj *o) CHKiRet(propNameToID(name, &pTpe->data.field.propid)); if(pTpe->data.field.propid == PROP_CEE) { /* in CEE case, we need to preserve the actual property name */ - pTpe->data.field.propName = es_newStrFromCStr((char*)cstrGetSzStrNoNULL(name)+1, - cstrLen(name)-1); + pTpe->data.field.propName = ustrdup(cstrGetSzStrNoNULL(name)+1); + pTpe->data.field.propNameLen = cstrLen(name)-1; } else if(pTpe->data.field.propid == PROP_LOCAL_VAR || pTpe->data.field.propid == PROP_GLOBAL_VAR) { /* in these case, we need to preserve the actual property name, but correct the root ID (bang vs. dot) */ - pTpe->data.field.propName = es_newStrFromCStr((char*)cstrGetSzStrNoNULL(name)+1, cstrLen(name)-1); - es_getBufAddr(pTpe->data.field.propName)[0] = '!'; /* patch root name */ + pTpe->data.field.propName = ustrdup(cstrGetSzStrNoNULL(name)+1); + pTpe->data.field.propNameLen = cstrLen(name)-1; + pTpe->data.field.propName[0] = '!'; /* patch root name */ } pTpe->data.field.options.bDropLastLF = droplastlf; pTpe->data.field.options.bSPIffNo1stSP = spifno1stsp; @@ -1747,7 +1747,7 @@ tplProcessCnf(struct cnfobj *o) char *name = NULL; uchar *tplStr = NULL; uchar *plugin = NULL; - es_str_t *subtree = NULL; + uchar *subtree = NULL; uchar *p; enum { T_STRING, T_PLUGIN, T_LIST, T_SUBTREE } tplType = T_STRING; /* init just to keep compiler happy: mandatory parameter */ @@ -1795,10 +1795,7 @@ tplProcessCnf(struct cnfobj *o) free(name); /* overall assigned */ ABORT_FINALIZE(RS_RET_ERR); } else { - /* TODO: unify strings! */ - char *cstr = es_str2cstr(pvals[i].val.d.estr, NULL); - subtree = es_newStrFromBuf(cstr+1, es_strlen(pvals[i].val.d.estr)-1); - free(cstr); + subtree = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL); } } else if(!strcmp(pblk.descr[i].name, "plugin")) { plugin = (uchar*) es_str2cstr(pvals[i].val.d.estr, NULL); @@ -1912,6 +1909,7 @@ tplProcessCnf(struct cnfobj *o) case T_LIST: createListTpl(pTpl, o); break; case T_SUBTREE: pTpl->subtree = subtree; + pTpl->subtreeLen = ustrlen(subtree); break; } @@ -2003,8 +2001,7 @@ void tplDeleteAll(rsconf_t *conf) regexp.regfree(&(pTpeDel->data.field.re)); } } - if(pTpeDel->data.field.propName != NULL) - es_deleteStr(pTpeDel->data.field.propName); + free(pTpeDel->data.field.propName); #endif break; } @@ -2015,8 +2012,7 @@ void tplDeleteAll(rsconf_t *conf) pTplDel = pTpl; pTpl = pTpl->pNext; free(pTplDel->pszName); - if(pTplDel->subtree != NULL) - es_deleteStr(pTplDel->subtree); + free(pTplDel->subtree); free(pTplDel); } ENDfunc @@ -2063,8 +2059,7 @@ void tplDeleteNew(rsconf_t *conf) regexp.regfree(&(pTpeDel->data.field.re)); } } - if(pTpeDel->data.field.propName != NULL) - es_deleteStr(pTpeDel->data.field.propName); + free(pTpeDel->data.field.propName); #endif break; } @@ -2074,8 +2069,7 @@ void tplDeleteNew(rsconf_t *conf) pTplDel = pTpl; pTpl = pTpl->pNext; free(pTplDel->pszName); - if(pTplDel->subtree != NULL) - es_deleteStr(pTplDel->subtree); + free(pTplDel->subtree); free(pTplDel); } ENDfunc @@ -2119,17 +2113,11 @@ void tplPrintList(rsconf_t *conf) case FIELD: dbgprintf("(FIELD), value: '%d' ", pTpe->data.field.propid); if(pTpe->data.field.propid == PROP_CEE) { - char *cstr = es_str2cstr(pTpe->data.field.propName, NULL); - dbgprintf("[EE-Property: '%s'] ", cstr); - free(cstr); + dbgprintf("[EE-Property: '%s'] ", pTpe->data.field.propName); } else if(pTpe->data.field.propid == PROP_LOCAL_VAR) { - char *cstr = es_str2cstr(pTpe->data.field.propName, NULL); - dbgprintf("[Local Var: '%s'] ", cstr); - free(cstr); + dbgprintf("[Local Var: '%s'] ", pTpe->data.field.propName); } else if(pTpe->data.field.propid == PROP_GLOBAL_VAR) { - char *cstr = es_str2cstr(pTpe->data.field.propName, NULL); - dbgprintf("[Global Var: '%s'] ", cstr); - free(cstr); + dbgprintf("[Global Var: '%s'] ", pTpe->data.field.propName); } switch(pTpe->data.field.eDateFormat) { case tplFmtDefault: @@ -40,7 +40,8 @@ struct template { char *pszName; int iLenName; rsRetVal (*pStrgen)(msg_t*, uchar**, size_t *); - es_str_t *subtree; /* subtree name for subtree-type templates */ + uchar *subtree; /* subtree name for subtree-type templates */ + int subtreeLen; int tpenElements; /* number of elements in templateEntry list */ struct templateEntry *pEntryRoot; struct templateEntry *pEntryLast; @@ -103,7 +104,8 @@ struct templateEntry { int field_expand; /* use multiple instances of the field delimiter as a single one? */ #endif - es_str_t *propName; /**< property name (currently being used for CEE only) */ + uchar *propName; + int propNameLen; enum tplFormatTypes eDateFormat; enum tplFormatCaseConvTypes eCaseConv; |