osaf/tools/safimm/immcfg/imm_cfg.c | 149 ++++++++++---------------------- osaf/tools/safimm/immcfg/imm_import.cc | 14 +-- 2 files changed, 53 insertions(+), 110 deletions(-)
This patch revert ticket #1283 and use safe read to retrieve class name for chained modify operations. 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 @@ -46,12 +46,6 @@ #include "osaf_extended_name.h" -typedef struct ObjectInfo { - char *objectName; - char *className; - struct ObjectInfo *next; -} ObjectInfoT; - static SaVersionT immVersion = { 'A', 2, 17 }; int verbose = 0; int ccb_safe = 1; @@ -62,8 +56,6 @@ SaImmAdminOwnerNameT adminOwnerName = NU SaImmAdminOwnerHandleT ownerHandle = 0; SaImmCcbHandleT ccbHandle = -1; -static ObjectInfoT *objectInfo = NULL; - extern struct ImmutilWrapperProfile immutilWrapperProfile; typedef enum { INVALID = 0, @@ -194,76 +186,6 @@ void sigalarmh(int sig) exit(EXIT_FAILURE); } -void object_info_add(const char *objectName, const char *className) { - ObjectInfoT *oi; - ObjectInfoT *prev; - int rc; - - prev = NULL; - oi = objectInfo; - while(oi) { - if((rc = strcmp(oi->objectName, objectName)) >= 0) { - if(!rc) { - // Object is already in the list - return; - } - - break; - } - - prev = oi; - oi = oi->next; - } - - if(prev) { - oi = (ObjectInfoT *)calloc(1, sizeof(ObjectInfoT)); - oi->objectName = strdup(objectName); - oi->className = strdup(className); - oi->next = prev->next; - prev->next = oi; - } else { - objectInfo = (ObjectInfoT *)calloc(1, sizeof(ObjectInfoT)); - objectInfo->objectName = strdup(objectName); - objectInfo->className = strdup(className); - objectInfo->next = oi; - } -} - -void object_info_clear() { - ObjectInfoT *oi = objectInfo; - ObjectInfoT *next; - - while(oi) { - next = oi->next; - free(oi->objectName); - free(oi->className); - free(oi); - oi = next; - } - - objectInfo = NULL; -} - -char *object_info_get_class(const char *objectName) { - ObjectInfoT *oi; - int rc; - - oi = objectInfo; - while(oi) { - if((rc = strcmp(oi->objectName, objectName)) >= 0) { - if(!rc) { - return strdup(oi->className); - } - - break; - } - - oi = oi->next; - } - - return NULL; -} - static void free_attr_value(SaImmValueTypeT attrValueType, SaImmAttrValueT attrValue) { if(attrValue) { if(attrValueType == SA_IMM_ATTR_SASTRINGT) @@ -324,6 +246,48 @@ static SaAisErrorT get_attrValueType(SaI return SA_AIS_ERR_NOT_EXIST; } +/* Get class name of the object. + * This is a clone of immutil_get_className(). + * If saImmOmAccessorGet_2() returns SA_AIS_ERR_NOT_EXIST, + * it will try with saImmOmCcbObjectRead() to get class name of being created object. + */ +static SaImmClassNameT get_class_name(const SaNameT *objectName) { + SaAisErrorT rc = SA_AIS_OK; + SaImmHandleT omHandle; + SaImmClassNameT className = NULL; + SaImmAccessorHandleT accessorHandle; + SaImmAttrValuesT_2 **attributes; + SaImmAttrNameT attributeNames[] = { "SaImmAttrClassName", NULL }; + + if (immutil_saImmOmInitialize(&omHandle, NULL, &immVersion) != SA_AIS_OK) + goto done; + + if (immutil_saImmOmAccessorInitialize(omHandle, &accessorHandle) != SA_AIS_OK) + goto finalize_om_handle; + + rc = immutil_saImmOmAccessorGet_2(accessorHandle, objectName, attributeNames, &attributes); + if (rc == SA_AIS_OK) { + className = strdup(*((char **) attributes[0]->attrValues[0])); + + } else if (rc == SA_AIS_ERR_NOT_EXIST && ccbHandle != -1) { + /* If ccbHandle is not intialized (value of -1) + * this is absolutely not a chained operation */ + + rc = immutil_saImmOmCcbObjectRead(ccbHandle, osaf_extended_name_borrow(objectName), attributeNames, &attributes); + if (rc == SA_AIS_OK) { + className = strdup(*((char **) attributes[0]->attrValues[0])); + } + } + + (void) immutil_saImmOmAccessorFinalize(accessorHandle); + + finalize_om_handle: + (void) immutil_saImmOmFinalize(omHandle); + + done: + return className; +} + /** * Alloc SaImmAttrModificationT_2 object and initialize its attributes from nameval (x=y) * @param objectName @@ -337,22 +301,11 @@ static SaImmAttrModificationT_2 *new_att char *name = strdup(nameval); char *value; SaImmAttrModificationT_2 *attrMod = NULL; - SaImmClassNameT className; + SaImmClassNameT className = get_class_name(objectName); 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; - } - + SaImmAttrDefinitionT_2 **attrDefinitions = NULL; if (className == NULL) { fprintf(stderr, "Object with DN '%s' does not exist\n", osaf_extended_name_borrow(objectName)); @@ -360,6 +313,11 @@ static SaImmAttrModificationT_2 *new_att goto done; } + if((error = saImmOmClassDescriptionGet_2(immHandle, className, &classCategory, &attrDefinitions)) != SA_AIS_OK) { + fprintf(stderr, "error - saImmOmClassDescriptionGet_2. FAILED: %s\n", saf_error(error)); + goto done; + } + attrMod = malloc(sizeof(SaImmAttrModificationT_2)); if ((value = strstr(name, "=")) == NULL) { @@ -565,13 +523,10 @@ int object_create(const SaNameT **object fprintf(stderr, "error - saImmOmCcbInitialize FAILED: %s\n", saf_error(error)); goto done; } - object_info_clear(); } i = 0; while (objectNames[i] != NULL) { - object_info_add(osaf_extended_name_borrow(objectNames[i]), className); - str = strdup(osaf_extended_name_borrow(objectNames[i])); if ((delim = strchr(str, ',')) != NULL) { /* a parent exist */ @@ -760,7 +715,6 @@ int object_modify(const SaNameT **object fprintf(stderr, "error - saImmOmCcbInitialize FAILED: %s\n", saf_error(error)); goto done; } - object_info_clear(); } i = 0; @@ -834,7 +788,6 @@ int object_delete(const SaNameT **object fprintf(stderr, "error - saImmOmCcbInitialize FAILED: %s\n", saf_error(error)); goto done; } - object_info_clear(); } while (objectNames[i] != NULL) { @@ -1099,8 +1052,6 @@ static int ccb_apply() { } done: - object_info_clear(); - return (transaction_mode) ? rc : 0; } @@ -1117,8 +1068,6 @@ static int ccb_abort() { ccbHandle = -1; } - object_info_clear(); - return (transaction_mode) ? rc : 0; } diff --git a/osaf/tools/safimm/immcfg/imm_import.cc b/osaf/tools/safimm/immcfg/imm_import.cc --- a/osaf/tools/safimm/immcfg/imm_import.cc +++ b/osaf/tools/safimm/immcfg/imm_import.cc @@ -68,10 +68,6 @@ extern "C" SaImmHandleT *immHandle, SaImmAdminOwnerHandleT *ownerHandle, SaImmCcbHandleT *ccbHandle, int mode, const char *xsdPath, int strictParse); int validateImmXML(const char *xmlfile, int verbose, int mode, int strictParse); - - void object_info_add(const char *objectName, const char *className); - void object_info_clear(); - char *object_info_get_class(const char *objectName); } extern ImmutilErrorFnT immutilError; @@ -642,6 +638,7 @@ static void createImmObject(ParserState* SaImmAttrValuesT_2** attrValues; SaAisErrorT errorCode = SA_AIS_OK; int i = 0; + size_t DNlen; SaNameT objectName; std::list<SaImmAttrValuesT_2>::iterator it; @@ -689,17 +686,15 @@ static void createImmObject(ParserState* if(state->ctxt->instate == XML_PARSER_EOF) return; - object_info_add(state->objectName, className); - #ifdef TRACE_8 /* Get the length of the DN and truncate state->objectName */ if (!osaf_is_extended_name_empty(&parentName)) { - i = strlen(state->objectName) - (strlen(osaf_extended_name_borrow(&parentName)) + 1); + DNlen = strlen(state->objectName) - (strlen(osaf_extended_name_borrow(&parentName)) + 1); } else { - i = strlen(state->objectName); + DNlen = strlen(state->objectName); } - state->objectName[i] = '\0'; + state->objectName[DNlen] = '\0'; TRACE_8("OBJECT NAME: %s", state->objectName); #endif @@ -1710,7 +1705,6 @@ static void endElementHandler(void* user state->parsingStatus = 1; return; } - object_info_clear(); state->ccbInit = 1; } ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel