Hi Neelakanta, The new feature works very nice with all replace/add/delete modification types.
Before, we dealt with only one attribute value and freeing memory worked fine with freeing only the first value in the modification list. Now, it's possible to set more values at once to the same attribute, and freeing only the first value is not enough, and it creates memory leak. This is a minor issue, and the fix can be pushed together with the patch. Ack from me. Thanks, Zoran -----Original Message----- From: reddy.neelaka...@oracle.com [mailto:reddy.neelaka...@oracle.com] Sent: Thursday, January 21, 2016 11:14 AM To: Zoran Milinkovic; Hung Duc Nguyen Cc: opensaf-devel@lists.sourceforge.net Subject: [PATCH 1 of 1] immtool: immcfg allows creation and modification of multiple values for multi attributes[#1626] osaf/tools/safimm/immcfg/imm_cfg.c | 145 ++++++++++++++++++++++++++++-------- 1 files changed, 112 insertions(+), 33 deletions(-) diff --git a/osaf/tools/safimm/immcfg/imm_cfg.c b/osaf/tools/safimm/immcfg/imm_cfg.c --- a/osaf/tools/safimm/immcfg/imm_cfg.c +++ b/osaf/tools/safimm/immcfg/imm_cfg.c @@ -150,6 +150,10 @@ static void usage(const char *progname) printf("\t\tchange one attribute for one object\n"); printf("\timmcfg -c SaAmfApplication -a saAmfAppType=Test safApp=myTestApp1\n"); printf("\t\tcreate one object setting one initialized attribute\n"); + printf("\timmcfg -c class -a attrMulti=one -a attrMulti=two obj=1\n"); + printf("\t\tcreate object with multiple values for MULTI_VALUE attribute\n"); + printf("\timmcfg -a attrMulti=three -a attrMulti=four obj=1\n"); + printf("\t\tModify object with multiple values for MULTI_VALUE attribute\n"); printf("\timmcfg -d safAmfNode=Node01,safAmfCluster=1\n"); printf("\t\tdelete one object\n"); printf("\timmcfg -d safAmfNode=Node01,safAmfCluster=1 safAmfNode=Node02,safAmfCluster=1\n"); @@ -298,6 +302,27 @@ static void free_attr_mod(SaImmAttrModif } } +static SaAisErrorT get_attrValueType(SaImmAttrDefinitionT_2 **attrDefinitions, SaImmAttrNameT attrName, + SaImmValueTypeT *attrValueType, SaImmAttrFlagsT * flags) { + if(!attrDefinitions || !attrName) + return SA_AIS_ERR_NOT_EXIST; + + int i=0; + while(attrDefinitions[i]) { + if(!strcmp(attrDefinitions[i]->attrName, attrName)) { + if(attrValueType){ + *attrValueType = attrDefinitions[i]->attrValueType; + if(flags){ + *flags = attrDefinitions[i]->attrFlags; + } + } + return SA_AIS_OK; + } + i++; + } + return SA_AIS_ERR_NOT_EXIST; +} + /** * Alloc SaImmAttrModificationT_2 object and initialize its attributes from nameval (x=y) * @param objectName @@ -305,7 +330,7 @@ static void free_attr_mod(SaImmAttrModif * * @return SaImmAttrModificationT_2* */ -static SaImmAttrModificationT_2 *new_attr_mod(const SaNameT *objectName, char *nameval) +static SaImmAttrModificationT_2 *new_attr_mod(const SaNameT *objectName, char *nameval, SaImmAttrFlagsT * flags) { int res = 0; char *name = strdup(nameval); @@ -314,11 +339,19 @@ static SaImmAttrModificationT_2 *new_att SaImmClassNameT className; SaAisErrorT error; SaImmAttrModificationTypeT modType = SA_IMM_ATTR_VALUES_REPLACE; + SaImmClassCategoryT classCategory; + SaImmAttrDefinitionT_2 **attrDefinitions = NULL; className = object_info_get_class(osaf_extended_name_borrow(objectName)); if(!className) { className = immutil_get_className(objectName); } + + if((error = saImmOmClassDescriptionGet_2(immHandle, className, &classCategory, &attrDefinitions)) != SA_AIS_OK) { + fprintf(stderr, "error - saImmOmClassDescriptionGet_2. FAILED: %s\n", saf_error(error)); + goto done; + } + if (className == NULL) { fprintf(stderr, "Object with DN '%s' does not exist\n", osaf_extended_name_borrow(objectName)); @@ -345,7 +378,7 @@ static SaImmAttrModificationT_2 *new_att *value = '\0'; value++; - error = immutil_get_attrValueType(className, name, &attrMod->modAttr.attrValueType); + error = get_attrValueType(attrDefinitions, name, &attrMod->modAttr.attrValueType, flags); if (error == SA_AIS_ERR_NOT_EXIST) { fprintf(stderr, "Class '%s' does not exist\n", className); res = -1; @@ -358,6 +391,8 @@ static SaImmAttrModificationT_2 *new_att goto done; } + + attrMod->modType = modType; attrMod->modAttr.attrName = name; name = NULL; @@ -384,26 +419,12 @@ static SaImmAttrModificationT_2 *new_att attrMod = NULL; } } + if(attrDefinitions) + saImmOmClassDescriptionMemoryFree_2(immHandle, attrDefinitions); + return attrMod; } -static SaAisErrorT get_attrValueType(SaImmAttrDefinitionT_2 **attrDefinitions, SaImmAttrNameT attrName, SaImmValueTypeT *attrValueType) { - if(!attrDefinitions || !attrName) - return SA_AIS_ERR_NOT_EXIST; - - int i=0; - while(attrDefinitions[i]) { - if(!strcmp(attrDefinitions[i]->attrName, attrName)) { - if(attrValueType) - *attrValueType = attrDefinitions[i]->attrValueType; - return SA_AIS_OK; - } - i++; - } - - return SA_AIS_ERR_NOT_EXIST; -} - /** * Alloc SaImmAttrValuesT_2 object and initialize its attributes from nameval (x=y) * @param attrDefinitions @@ -412,7 +433,8 @@ static SaAisErrorT get_attrValueType(SaI * * @return SaImmAttrValuesT_2* */ -static SaImmAttrValuesT_2 *new_attr_value(SaImmAttrDefinitionT_2 **attrDefinitions, char *nameval, int isRdn) +static SaImmAttrValuesT_2 *new_attr_value(SaImmAttrDefinitionT_2 **attrDefinitions, char *nameval, int isRdn, + SaImmAttrFlagsT * flags) { int res = 0; char *name = strdup(nameval), *p; @@ -435,7 +457,7 @@ static SaImmAttrValuesT_2 *new_attr_valu name = NULL; VERBOSE_INFO("new_attr_value attrValue->attrName: '%s' value:'%s'\n", attrValue->attrName, isRdn ? nameval : value); - error = get_attrValueType(attrDefinitions, attrValue->attrName, &attrValue->attrValueType); + error = get_attrValueType(attrDefinitions, attrValue->attrName, &attrValue->attrValueType, flags); if (error != SA_AIS_OK) { fprintf(stderr, "Attribute '%s' does not exist in class\n", attrValue->attrName); @@ -490,6 +512,8 @@ int object_create(const SaNameT **object const SaStringT* errStrings=NULL; SaImmClassCategoryT classCategory; SaImmAttrDefinitionT_2 **attrDefinitions = NULL; + SaImmAttrFlagsT flags=0; + SaBoolT attrAdded = SA_FALSE; if((error = saImmOmClassDescriptionGet_2(immHandle, className, &classCategory, &attrDefinitions)) != SA_AIS_OK) { fprintf(stderr, "error - saImmOmClassDescriptionGet_2. FAILED: %s\n", saf_error(error)); @@ -498,15 +522,37 @@ int object_create(const SaNameT **object for (i = 0; i < optargs_len; i++) { VERBOSE_INFO("object_create optargs[%d]: '%s'\n", i, optargs[i]); - if ((attrValue = new_attr_value(attrDefinitions, optargs[i], 0)) == NULL){ + if ((attrValue = new_attr_value(attrDefinitions, optargs[i], 0, &flags)) == NULL){ fprintf(stderr, "error - creating attribute from '%s'\n", optargs[i]); goto done; } - attrValues = realloc(attrValues, (attr_len + 1) * sizeof(SaImmAttrValuesT_2 *)); - attrValues[attr_len - 1] = attrValue; - attrValues[attr_len] = NULL; - attr_len++; + if(attrValues && (flags & SA_IMM_ATTR_MULTI_VALUE)){ + int j=0; + while(attrValues[j]){ + if(!strcmp(attrValue->attrName, attrValues[j]->attrName)){ + attrValues[j]->attrValues = realloc(attrValues[j]->attrValues, + (attrValues[j]->attrValuesNumber+1) * sizeof(SaImmAttrValueT *)); + attrValues[j]->attrValues[attrValues[j]->attrValuesNumber] = attrValue->attrValues[0]; + attrValues[j]->attrValuesNumber++; + attrAdded = SA_TRUE; + + free(attrValue->attrName); + free(attrValue->attrValues); + free(attrValue); + break; + } + j++; + } + } + if(!attrAdded){ + + attrValues = realloc(attrValues, (attr_len + 1) * sizeof(SaImmAttrValuesT_2 *)); + attrValues[attr_len - 1] = attrValue; + attrValues[attr_len] = NULL; + attr_len++; + } + attrAdded = SA_FALSE; } attrValues = realloc(attrValues, (attr_len + 1) * sizeof(SaImmAttrValuesT_2 *)); @@ -560,7 +606,7 @@ int object_create(const SaNameT **object } VERBOSE_INFO("object_create rdn attribute attrValues[%d]: '%s' \n", attr_len - 1, str); - if ((attrValue = new_attr_value(attrDefinitions, str, 1)) == NULL){ + if ((attrValue = new_attr_value(attrDefinitions, str, 1, NULL)) == NULL){ fprintf(stderr, "error - creating rdn attribute from '%s'\n", str); goto done; } @@ -636,23 +682,56 @@ done: int object_modify(const SaNameT **objectNames, char **optargs, int optargs_len) { SaAisErrorT error; - int i; + int i, j; int attr_len = 1; int rc = EXIT_FAILURE; SaImmAttrModificationT_2 *attrMod; SaImmAttrModificationT_2 **attrMods = NULL; const SaStringT* errStrings=NULL; + SaImmAttrFlagsT flags=0; + SaBoolT attrAdded = SA_FALSE; + for (i = 0; i < optargs_len; i++) { - if ((attrMod = new_attr_mod(objectNames[0], optargs[i])) == NULL) { + if ((attrMod = new_attr_mod(objectNames[0], optargs[i], &flags)) == NULL) { fprintf(stderr, "error - creating attribute from '%s'\n", optargs[i]); goto done; } + + if(attrMods && (flags & SA_IMM_ATTR_MULTI_VALUE)){ + j = 0; + while(attrMods[j]){ + if(!strcmp(attrMod->modAttr.attrName, attrMods[j]->modAttr.attrName)){ + if(attrMod->modType == attrMods[j]->modType){ + attrMods[j]->modAttr.attrValues = realloc(attrMods[j]->modAttr.attrValues, + (attrMods[j]->modAttr.attrValuesNumber+1) * + sizeof(SaImmAttrValueT *)); + attrMods[j]->modAttr.attrValues[attrMods[j]->modAttr.attrValuesNumber] = + attrMod->modAttr.attrValues[0]; + attrMods[j]->modAttr.attrValuesNumber++; + attrAdded = SA_TRUE; - attrMods = realloc(attrMods, (attr_len + 1) * sizeof(SaImmAttrModificationT_2 *)); - attrMods[attr_len - 1] = attrMod; - attrMods[attr_len] = NULL; - attr_len++; + free(attrMod->modAttr.attrName); + free(attrMod->modAttr.attrValues); + free(attrMod); + break; + } else { + fprintf(stderr, "error - Only one Modify operation type is supported" + " for attribute\n"); + goto done; + } + } + j++; + } + } + + if(!attrAdded) { + attrMods = realloc(attrMods, (attr_len + 1) * sizeof(SaImmAttrModificationT_2 *)); + attrMods[attr_len - 1] = attrMod; + attrMods[attr_len] = NULL; + attr_len++; + } + attrAdded = SA_FALSE; } if ((error = immutil_saImmOmAdminOwnerSet(ownerHandle, (const SaNameT **)objectNames, SA_IMM_ONE)) != SA_AIS_OK) { ------------------------------------------------------------------------------ Site24x7 APM Insight: Get Deep Visibility into Application Performance APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month Monitor end-to-end web transactions and take corrective actions now Troubleshoot faster and improve end-user experience. Signup Now! http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel