osaf/libs/agents/saf/imma/imma_cb.h | 5 +
osaf/libs/agents/saf/imma/imma_db.c | 99 +++++++++++++++++++++++++++++++++
osaf/libs/agents/saf/imma/imma_oi_api.c | 60 +++++++------------
osaf/libs/agents/saf/imma/imma_proc.c | 64 ++-------------------
4 files changed, 133 insertions(+), 95 deletions(-)
Two new variables objectName and adminOwnerName added to imma_oi_ccb_record.
For CCB create operation adminOwnerName will be added.
For CCB delete/modify operation objectName will be added
diff --git a/osaf/libs/agents/saf/imma/imma_cb.h
b/osaf/libs/agents/saf/imma/imma_cb.h
--- a/osaf/libs/agents/saf/imma/imma_cb.h
+++ b/osaf/libs/agents/saf/imma/imma_cb.h
@@ -36,6 +36,10 @@ struct imma_oi_ccb_record {
struct imma_callback_info* ccbCallback;
SaImmHandleT privateAugOmHandle;
SaImmAdminOwnerHandleT privateAoHandle;
+ SaNameT objectName;/* The Object name from the modif/delete ccb
operationi. The objectName is used to obtain
+ adminOnerName when saImmOiAugmentCcbInitialize is
called in completed-callback*/
+ SaNameT adminOwnerName; /* adminowner name of the ccb id, assigned at
ccb-create-callback.The adminOwnerName is used
+ saImmOiAugmentCcbInitialize is called in
completed-callback*/
};
typedef struct imma_client_node {
@@ -197,6 +201,7 @@ int imma_oi_ccb_record_set_critical(IMMA
int imma_oi_ccb_record_terminate(IMMA_CLIENT_NODE *cl_node, SaImmOiCcbIdT
ccbId);
int imma_oi_ccb_record_abort(IMMA_CLIENT_NODE *cl_node, SaImmOiCcbIdT ccbId);
int imma_oi_ccb_record_exists(IMMA_CLIENT_NODE *cl_node, SaImmOiCcbIdT ccbId);
+struct imma_oi_ccb_record * imma_oi_ccb_record_find(IMMA_CLIENT_NODE *cl_node,
SaImmOiCcbIdT ccbId);
int imma_oi_ccb_record_set_error(IMMA_CLIENT_NODE *cl_node, SaImmOiCcbIdT
ccbId, const SaStringT errorString);
SaStringT imma_oi_ccb_record_get_error(IMMA_CLIENT_NODE *cl_node,
SaImmOiCcbIdT ccbId);
void imma_oi_ccb_allow_error_string(IMMA_CLIENT_NODE *cl_node, SaImmOiCcbIdT
ccbId);
diff --git a/osaf/libs/agents/saf/imma/imma_db.c
b/osaf/libs/agents/saf/imma/imma_db.c
--- a/osaf/libs/agents/saf/imma/imma_db.c
+++ b/osaf/libs/agents/saf/imma/imma_db.c
@@ -24,6 +24,8 @@
*****************************************************************************/
#include "imma.h"
+#include "osaf_extended_name.h"
+
/****************************************************************************
Name : imma_client_tree_init
Description : This routine is used to initialize the client tree
@@ -273,6 +275,9 @@ int imma_oi_ccb_record_delete(IMMA_CLIEN
to_delete->mCcbErrorString = NULL;
}
+ osaf_extended_name_free(&(to_delete->objectName));
+ osaf_extended_name_free(&(to_delete->adminOwnerName));
+
free(to_delete);
TRACE_LEAVE();
return 1;
@@ -541,6 +546,11 @@ int imma_oi_ccb_record_note_callback(IMM
*/
int rs = 0;
+ const SaImmAttrNameT admoNameAttr = SA_IMM_ATTR_ADMIN_OWNER_NAME;
+ SaImmAttrValuesT_2 **attr, **attributes = NULL;
+ SaImmAttrValuesT_2 *attrVal = NULL;
+ size_t attrDataSize = 0;
+
struct imma_oi_ccb_record *tmp = imma_oi_ccb_record_find(cl_node,
ccbId);
if(tmp && !(tmp->isAborted)) {
@@ -553,7 +563,96 @@ int imma_oi_ccb_record_note_callback(IMM
rs = 1;
}
}
+ if(callback){
+
+ int noOfAttributes = 0;
+
+ /* NOTE: The code below is practically a copy of the code
+ in immOm searchNext, for serving the attrValues structure.
+ This code should be factored out into some common function.
+ */
+ IMMSV_ATTR_VALUES_LIST *p = callback->attrValues;
+ int i = 0;
+ while (p) {
+ ++noOfAttributes;
+ p = p->next;
+ }
+
+ p = callback->attrValues;
+
+
+ if(cl_node->isImmA2fCbk) {
+ if(noOfAttributes) {
+ p = p->next; // Skip RDN. RDN is the first
attribute
+ noOfAttributes--;
+ }
+ }
+
+ attrDataSize = sizeof(SaImmAttrValuesT_2 *) * (noOfAttributes +
1);
+ attr = calloc(1, attrDataSize); /*alloc-1 */
+ for (; i < noOfAttributes && p; i++, p = p->next) {
+ IMMSV_ATTR_VALUES *q = &(p->n);
+ attr[i] = calloc(1, sizeof(SaImmAttrValuesT_2));
/*alloc-2 */
+ attr[i]->attrName = malloc(q->attrName.size + 1);
/*alloc-3 */
+ strncpy(attr[i]->attrName, (const char
*)q->attrName.buf, q->attrName.size + 1);
+ attr[i]->attrName[q->attrName.size] = 0;
/*redundant. */
+ attr[i]->attrValuesNumber = q->attrValuesNumber;
+ attr[i]->attrValueType =
(SaImmValueTypeT)q->attrValueType;
+ if (q->attrValuesNumber) {
+ attr[i]->attrValues =
+ calloc(q->attrValuesNumber,
sizeof(SaImmAttrValueT)); /*alloc-4 */
+ /*alloc-5 */
+ attr[i]->attrValues[0] =
+ imma_copyAttrValue3(q->attrValueType,
&(q->attrValue));
+
+ if (q->attrValuesNumber > 1) {
+ int ix;
+ IMMSV_EDU_ATTR_VAL_LIST *r =
q->attrMoreValues;
+ for (ix = 1; ix < q->attrValuesNumber;
++ix) {
+ osafassert(r);
+ attr[i]->attrValues[ix] =
/*alloc-5 */
+
imma_copyAttrValue3(q->attrValueType, &(r->n));
+ r = r->next;
+ }//for
+ }//if
+ }//if
+ }//for
+ attr[i] = NULL; /*redundant */
+
+
+ /* Save a copy of the attrvals pointer in the callback to allow
+ saImmOiAugmentCcbInitialize to get access to the
ccbCreateContext.
+ We cant use callback->attrValues because it is partially
stolen
+ from (caused to be incomplete) in the loop above (see
imma_copyAttrValue3).
+ */
+
+ callback->attrValsForCreateUc = (const SaImmAttrValuesT_2
**)attr;
+
+ if(callback->type == IMMA_CALLBACK_OI_CCB_CREATE &&
osaf_is_extended_name_empty(&(tmp->adminOwnerName))) {
+ attributes = (SaImmAttrValuesT_2 **)
callback->attrValsForCreateUc;
+ int i=0;
+ while((attrVal = attributes[i++]) != NULL) {
+ if(strcmp(admoNameAttr, attrVal->attrName)==0) {
+ TRACE("Found %s attribute in object
create upcall", admoNameAttr);
+ break;
+ }
+ }
+
+ if(!attrVal || strcmp(attrVal->attrName, admoNameAttr)
|| (attrVal->attrValuesNumber!=1) ||
+ (attrVal->attrValueType !=
SA_IMM_ATTR_SASTRINGT)) {
+
LOG_ER("imma_oi_ccb_record_note_callback:Missmatch on attribute %s",
admoNameAttr);
+ abort();
+ }
+ osaf_extended_name_alloc(*(SaStringT*)
attrVal->attrValues[0], &(tmp->adminOwnerName));
+
+ } else if (((callback->type == IMMA_CALLBACK_OI_CCB_DELETE) ||
(callback->type == IMMA_CALLBACK_OI_CCB_MODIFY))
+ &&
osaf_is_extended_name_empty(&(tmp->objectName))){
+ SaConstStringT tmpStr =
osaf_extended_name_borrow(&(callback->name));
+ osaf_extended_name_alloc(tmpStr, &(tmp->objectName));
+ }
+ }
+
return rs;
}
diff --git a/osaf/libs/agents/saf/imma/imma_oi_api.c
b/osaf/libs/agents/saf/imma/imma_oi_api.c
--- a/osaf/libs/agents/saf/imma/imma_oi_api.c
+++ b/osaf/libs/agents/saf/imma/imma_oi_api.c
@@ -3565,46 +3565,25 @@ extern void immsv_om_handle_finalize(
SaImmHandleT privateOmHandle)
__attribute__((weak));
static SaAisErrorT
-getAdmoName(SaImmHandleT privateOmHandle, IMMA_CALLBACK_INFO * cbi, SaNameT*
admoNameOut)
+getAdmoName(SaImmHandleT privateOmHandle, IMMA_CALLBACK_INFO * cbi, SaNameT*
object, SaNameT* admoNameOut)
{
SaAisErrorT rc = SA_AIS_OK;
const SaImmAttrNameT admoNameAttr = SA_IMM_ATTR_ADMIN_OWNER_NAME;
- SaImmAttrValuesT_2 **attributes = NULL;
- SaImmAttrValuesT_2 *attrVal = NULL;
+
TRACE_ENTER();
- if(cbi->type == IMMA_CALLBACK_OI_CCB_CREATE) {
- /* Admo attribute for created object should be in attr list.*/
- int i=0;
- attributes = (SaImmAttrValuesT_2 **) cbi->attrValsForCreateUc;
- while((attrVal = attributes[i++]) != NULL) {
- if(strcmp(admoNameAttr, attrVal->attrName)==0) {
- TRACE("Found %s attribute in object create upcall",
admoNameAttr);
- break;
- }
- }
-
- if(!attrVal || strcmp(attrVal->attrName, admoNameAttr) ||
(attrVal->attrValuesNumber!=1) ||
- (attrVal->attrValueType != SA_IMM_ATTR_SASTRINGT)) {
- LOG_ER("Missmatch on attribute %s", admoNameAttr);
- abort();
- }
-
- osaf_extended_name_alloc(*(SaStringT*) attrVal->attrValues[0],
admoNameOut);
-
- } else {
- /* modify or delete => fetch admo attribute for object from server.
*/
- if((cbi->type != IMMA_CALLBACK_OI_CCB_DELETE) &&
- (cbi->type != IMMA_CALLBACK_OI_CCB_MODIFY)) {
- LOG_ER("Inconsistency in callback type:%u", cbi->type);
- abort();
- }
-
- osafassert(immsv_om_augment_ccb_get_admo_name);
- rc = immsv_om_augment_ccb_get_admo_name(privateOmHandle,
&(cbi->name), admoNameOut);
- if(rc == SA_AIS_ERR_LIBRARY) {
- LOG_ER("Missmatch on attribute %s for delete or modify",
admoNameAttr);
- }
+ /* modify or delete => fetch admo attribute for object from server. */
+ if((cbi->type != IMMA_CALLBACK_OI_CCB_DELETE) &&
+ (cbi->type != IMMA_CALLBACK_OI_CCB_MODIFY) &&
+ (cbi->type != IMMA_CALLBACK_OI_CCB_COMPLETED)) {
+ LOG_ER("Inconsistency in callback type:%u", cbi->type);
+ abort();
+ }
+
+ osafassert(immsv_om_augment_ccb_get_admo_name);
+ rc = immsv_om_augment_ccb_get_admo_name(privateOmHandle, &(cbi->name),
admoNameOut);
+ if(rc == SA_AIS_ERR_LIBRARY) {
+ LOG_ER("Missmatch on attribute %s for delete or modify",
admoNameAttr);
}
/* attrVal found either in create callback, or fetched from server. */
@@ -3734,6 +3713,7 @@ SaAisErrorT saImmOiAugmentCcbInitialize(
goto done;
}
+ struct imma_oi_ccb_record *ccb_oi_record =
imma_oi_ccb_record_find(cl_node, ccbId);
cbi = imma_oi_ccb_record_ok_augment(cl_node, ccbId, &privateOmHandle,
&privateAoHandle);
if(!cbi) {
TRACE_2("ERR_BAD_OPERATION: Ccb %u, is not in a state that "
@@ -3848,11 +3828,17 @@ SaAisErrorT saImmOiAugmentCcbInitialize(
if(!privateAoHandle) {
TRACE("AugCcbinit: Admo has ReleaseOnFinalize FALSE "
- "=> init separate admo => must fetch admo-name
first");
+ "=> init separate admo => must fetch
admo-name first");
osafassert(locked == false);
SaNameT admName;/* Used to get admo string name copied
to stack.*/
- rc = getAdmoName(privateOmHandle, cbi, &admName);
+ if((cbi->type == IMMA_CALLBACK_OI_CCB_CREATE)||
((cbi->type == IMMA_CALLBACK_OI_CCB_COMPLETED) &&
+
!osaf_is_extended_name_empty(&(ccb_oi_record->adminOwnerName)))){
+ admName = ccb_oi_record->adminOwnerName;
+ } else {
+ rc = getAdmoName(privateOmHandle, cbi,
&(ccb_oi_record->objectName),&admName);
+ }
+
if(rc != SA_AIS_OK) {
TRACE("ERR_TRY_AGAIN: failed to obtain
SaImmAttrAdminOwnerName %u", rc);
if(rc != SA_AIS_ERR_TRY_AGAIN) {
diff --git a/osaf/libs/agents/saf/imma/imma_proc.c
b/osaf/libs/agents/saf/imma/imma_proc.c
--- a/osaf/libs/agents/saf/imma/imma_proc.c
+++ b/osaf/libs/agents/saf/imma/imma_proc.c
@@ -2285,7 +2285,6 @@ static bool imma_process_callback_info(I
IMMSV_EVT ccbObjCrRpl;
bool locked = false;
SaImmAttrValuesT_2 **attr = NULL;
- size_t attrDataSize = 0;
int i = 0;
/* No need to check for
o.iCallbkA2f.saImmOiCcbObjectCreateCallback
* "o" is union and
o.iCallbk.saImmOiCcbObjectCreateCallback is same
@@ -2308,62 +2307,11 @@ static bool imma_process_callback_info(I
const SaImmClassNameT className =
callback->className; /*0 */
callback->className = NULL;
- int noOfAttributes = 0;
-
- /* NOTE: The code below is practically
a copy of the code
- in immOm searchNext, for serving the
attrValues structure.
- This code should be factored out
into some common function.
- */
- IMMSV_ATTR_VALUES_LIST *p =
callback->attrValues;
- while (p) {
- ++noOfAttributes;
- p = p->next;
- }
-
- p = callback->attrValues;
-
- if(cl_node->isImmA2fCbk) {
- if(noOfAttributes) {
- p = p->next; // Skip
RDN. RDN is the first attribute
- noOfAttributes--;
- } else {
- /* There must be at
least one attribute value */
- localEr =
SA_AIS_ERR_BAD_OPERATION;
- clientCapable = false;
- }
- }
-
- if(localEr == SA_AIS_OK) {
- attrDataSize =
sizeof(SaImmAttrValuesT_2 *) * (noOfAttributes + 1);
- attr = calloc(1, attrDataSize);
/*alloc-1 */
- for (; i < noOfAttributes && p;
i++, p = p->next) {
- IMMSV_ATTR_VALUES *q =
&(p->n);
- attr[i] = calloc(1,
sizeof(SaImmAttrValuesT_2)); /*alloc-2 */
- attr[i]->attrName =
malloc(q->attrName.size + 1); /*alloc-3 */
-
strncpy(attr[i]->attrName, (const char *)q->attrName.buf, q->attrName.size + 1);
-
attr[i]->attrName[q->attrName.size] = 0; /*redundant. */
-
attr[i]->attrValuesNumber = q->attrValuesNumber;
- attr[i]->attrValueType
= (SaImmValueTypeT)q->attrValueType;
- if
(q->attrValuesNumber) {
-
attr[i]->attrValues =
-
calloc(q->attrValuesNumber, sizeof(SaImmAttrValueT)); /*alloc-4 */
- /*alloc-5 */
-
attr[i]->attrValues[0] =
-
imma_copyAttrValue3(q->attrValueType, &(q->attrValue));
-
- if
(q->attrValuesNumber > 1) {
- int ix;
-
IMMSV_EDU_ATTR_VAL_LIST *r = q->attrMoreValues;
- for (ix
= 1; ix < q->attrValuesNumber; ++ix) {
-
osafassert(r);
-
attr[i]->attrValues[ix] = /*alloc-5 */
-
imma_copyAttrValue3(q->attrValueType, &(r->n));
-
r = r->next;
- }//for
- }//if
- }//if
- }//for
- attr[i] = NULL; /*redundant */
+
+ if(cl_node->isImmA2fCbk &&
!callback->attrValsForCreateUc) {
+ /* There must be at least one
attribute value */
+ localEr =
SA_AIS_ERR_BAD_OPERATION;
+ clientCapable = false;
}
if(localEr == SA_AIS_OK &&
cl_node->isImmA2fCbk) {
@@ -2388,7 +2336,6 @@ static bool imma_process_callback_info(I
We cant use callback->attrValues
because it is partially stolen
from (caused to be incomplete) in
the loop above (see imma_copyAttrValue3).
*/
- callback->attrValsForCreateUc = (const
SaImmAttrValuesT_2 **)attr;
if (localEr == SA_AIS_OK
&&
!osaf_is_extended_names_enabled()
@@ -2457,6 +2404,7 @@ static bool imma_process_callback_info(I
free(className); /*free-0 */
free(objectName); /*free-6 */
+ attr = (SaImmAttrValuesT_2 **)
callback->attrValsForCreateUc;
for (i = 0; attr[i]; ++i) {
free(attr[i]->attrName);
/*free-3 */
attr[i]->attrName = 0;
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel