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

Reply via email to