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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel