osaf/tools/safimm/immcfg/imm_cfg.c | 161 ++++++++++++++++++++++++++++-------- 1 files changed, 125 insertions(+), 36 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"); @@ -287,17 +291,39 @@ static void free_attr_values(SaImmAttrVa } static void free_attr_mod(SaImmAttrModificationT_2 *attrMod) { + int i; if(attrMod) { if(attrMod->modAttr.attrName) free(attrMod->modAttr.attrName); - if(attrMod->modAttr.attrValues) { - free_attr_value(attrMod->modAttr.attrValueType, attrMod->modAttr.attrValues[0]); - free(attrMod->modAttr.attrValues); + for(i=0; i< attrMod->modAttr.attrValuesNumber;i++){ + free_attr_value(attrMod->modAttr.attrValueType, attrMod->modAttr.attrValues[i]); } + free(attrMod->modAttr.attrValues); free(attrMod); } } +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 +331,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 +340,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 +379,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 +392,8 @@ static SaImmAttrModificationT_2 *new_att goto done; } + + attrMod->modType = modType; attrMod->modAttr.attrName = name; name = NULL; @@ -384,26 +420,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 +434,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 +458,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 +513,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 +523,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 +607,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 +683,65 @@ 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){ + if(!(attrMod->modAttr.attrValues)){ + fprintf(stderr, "error Empty value is used for adding Multi value" + " attribute %s\n", attrMod->modAttr.attrName); + free_attr_mod(attrMod); + goto done; + } else { + + 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 = realloc(attrMods, (attr_len + 1) * sizeof(SaImmAttrModificationT_2 *)); - attrMods[attr_len - 1] = attrMod; - attrMods[attr_len] = NULL; - attr_len++; + attrMods[j]->modAttr.attrValuesNumber++; + attrAdded = SA_TRUE; + + 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