Hi Hung, Multiple adminowners are allowed for each immhandle Multiple ccbhandles(IDs) allowed for each adminownerhandle
If we need to store in the OI cb , then we have to book-keep ccbids and there corresponding ccb operation object name Instead I chose to read from IMMND , as AccessorGet or new message will have to get admin owner from IMMND. Thanks, Neel. On 2016/11/23 01:47 PM, Hung Nguyen wrote: > Hi Neel, > > I think we can fix this ticket without new message type. > > Before the CcbCompleted callback, the OI always gets one or more > CcbCreate/Modify/Delete callbacks. > We can use those callbacks to get admo name. > > We add more members to 'struct imma_oi_ccb_record' > SaStringT firstObjectName; > SaStringT adminOwnerName; > > > CcbCreate callback: > We can get the admo name right away > by reading 'SaImmAttrAdminOwnerName' attribute from > 'evt->info.objCreate.attrValues' > Then store the admo name in imma_oi_ccb_record.adminOwnerName. > > > CcbModify/Delete callback: > We can't get the admo name right away. > We have to store the object name in imma_oi_ccb_record.firstObjectName. > This only needs to be done once, no need to overwrite 'firstObjectName' in > later callbacks. > We only need one object name of the CCB. > > > Now when we need to get admo name in CcbCompleted callback, > we have to fetch the imma_oi_ccb_record of that ccb. > If the ccb_record already has adminOwnerName, we can use it right away. > If the ccb_record only has firstObjectName, use saImmOmAccessorGet_2 to > retrieve the admo name. > > > BR, > Hung Nguyen - DEK Technologies > > -------------------------------------------------------------------------------- > From: Neelakanta [email protected] > Sent: Friday, November 18, 2016 9:54PM > To: Zoran Milinkovic, Hung Nguyen > [email protected],[email protected] > Cc: Opensaf-devel > [email protected] > Subject: [PATCH 1 of 1] imm:allow augumentCcbInit with ROF as false in > completed callback[#1956] > > > osaf/libs/agents/saf/imma/imma_oi_api.c | 156 > +++++++++++++++++++++++++--- > osaf/libs/common/immsv/immsv_evt.c | 49 ++++++-- > osaf/libs/common/immsv/include/immsv_evt.h | 2 + > osaf/services/saf/immsv/immnd/ImmModel.cc | 39 +++++++ > osaf/services/saf/immsv/immnd/ImmModel.hh | 3 + > osaf/services/saf/immsv/immnd/immnd_evt.c | 65 ++++++++++++ > osaf/services/saf/immsv/immnd/immnd_init.h | 3 + > 7 files changed, 284 insertions(+), 33 deletions(-) > > > with saImmOmCcbObjectRead, completed callback is also allowed to call > saImmOiAugmentCcbInitialize. > When ROF is false the augumentInit will get new adminowner with same name > as old adminowner name with ROF as true. > > Since, object name is not set for completed callback, a new event from OI to > IMMND is required to get adminownername from ccbID > The patch inroduces new event by sending ccbID and response of the event will > be the adminname of the corresponding ccbId. > > 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 > @@ -3617,6 +3617,97 @@ getAdmoName(SaImmHandleT privateOmHandle > } > > > /**************************************************************************** > + Name : immsv_oi_augment_ccb_get_admo_name > + > + Description : The function gets adminoperation name from the CcbID. > + For the saImmOiAugmentCcbInitialize when the ROF flag is false > + for the original adminOperation name(#1956). > + > + Arguments : privateOmHandle - IMM OM handle > + ccbId - The ccbId from the completed callback . > + admoNameOut - The AdminOperation name of the ccbId > + timeout - synchronous timeout > + > + Return Values : SA_AIS_OK > + SA_AIS_ERR_BAD_HANDLE > + > +******************************************************************************/ > + > +SaAisErrorT immsv_oi_augment_ccb_get_admo_name( > + SaImmHandleT privateOmHandle, > + SaUint32T ccbId, > + SaStringT *admoNameOut, > + SaTimeT timeout) > + > +{ > + SaAisErrorT rc = SA_AIS_OK; > + IMMA_CB *cb = &imma_cb; > + uint32_t proc_rc; > + IMMSV_EVT evt; > + IMMSV_EVT *out_evt = NULL; > + SaStringT * admtmp; > + TRACE_ENTER(); > + > + memset(&evt, 0, sizeof(IMMSV_EVT)); > + evt.type = IMMSV_EVT_TYPE_IMMND; > + evt.info.immnd.type = IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO; > + evt.info.immnd.info.ccbId = ccbId; > + > + proc_rc = imma_mds_msg_sync_send(cb->imma_mds_hdl, &cb->immnd_mds_dest, > &evt, &out_evt, timeout); > + switch(proc_rc) { > + case NCSCC_RC_SUCCESS: > + break; > + > + case NCSCC_RC_REQ_TIMOUT: > + rc = imma_proc_check_stale(cb, privateOmHandle, > SA_AIS_ERR_TIMEOUT); > + goto mds_send_fail; > + > + default: > + rc = SA_AIS_ERR_LIBRARY; > + TRACE_4("ERR_LIBRARY: MDS returned unexpected error > code %u", proc_rc); > + goto mds_send_fail; > + } > + > + if(out_evt) { > + osafassert(out_evt->type == IMMSV_EVT_TYPE_IMMA); > + if (out_evt->info.imma.type == IMMA_EVT_ND2A_IMM_ERROR) { > + rc = out_evt->info.imma.info.errRsp.error; > + osafassert(rc && (rc != SA_AIS_OK)); > + free(out_evt); /*BUGFIX (leak) 090506 */ > + out_evt = NULL; > + goto mds_send_fail; > + } > + > + osafassert(out_evt->info.imma.type == > IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP); > + IMMSV_ATTR_VALUES_LIST *p; > + > + osafassert(out_evt->info.imma.info.searchNextRsp); > + p = out_evt->info.imma.info.searchNextRsp->attrValuesList; > + IMMSV_ATTR_VALUES *q = &(p->n); > + osafassert(!(strncmp(q->attrName.buf, > "SaImmAttrAdminOwnerName", strlen("SaImmAttrAdminOwnerName")))); > + osafassert(q->attrValuesNumber == 1); > + admtmp = (SaStringT *) imma_copyAttrValue3(q->attrValueType, > &(q->attrValue)); > + *admoNameOut = *admtmp; > + TRACE("The admin operation Name %s ", *admoNameOut); > + > + if(out_evt) { > + if(out_evt->info.imma.info.searchNextRsp) { > + > if(out_evt->info.imma.info.searchNextRsp->attrValuesList) { > + > immsv_free_attrvalues_list(out_evt->info.imma.info.searchNextRsp->attrValuesList); > + } > + free(out_evt->info.imma.info.searchNextRsp); > + out_evt->info.imma.info.searchNextRsp = NULL; > + } > + free(out_evt); > + } > + } > + > + mds_send_fail: > + TRACE_LEAVE(); > + return rc; > +} > + > +/**************************************************************************** > Name : saImmOiAugmentCcbInitialize > > Description : Allows the OI implementers to augment ops to a ccb > related > @@ -3850,32 +3941,57 @@ SaAisErrorT saImmOiAugmentCcbInitialize( > TRACE("AugCcbinit: Admo has ReleaseOnFinalize FALSE " > "=> 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(rc != SA_AIS_OK) { > - TRACE("ERR_TRY_AGAIN: failed to obtain > SaImmAttrAdminOwnerName %u", rc); > - if(rc != SA_AIS_ERR_TRY_AGAIN) { > - rc = SA_AIS_ERR_TRY_AGAIN; > + if(cbi->type == IMMA_CALLBACK_OI_CCB_COMPLETED){ > + SaStringT admOwnerStr; > + rc = > immsv_oi_augment_ccb_get_admo_name(privateOmHandle, cbi->ccbID, &admOwnerStr, > cl_node->syncr_timeout); > + if(rc != SA_AIS_OK) { > + TRACE("ERR_TRY_AGAIN: failed to obtain > SaImmAttrAdminOwnerName %u", rc); > + if(rc != SA_AIS_ERR_TRY_AGAIN) { > + rc = SA_AIS_ERR_TRY_AGAIN; > + } > + if(admOwnerStr) > + free(admOwnerStr); > + goto done; > + } > + rc = > immsv_om_admo_handle_initialize(privateOmHandle, (const > SaImmAdminOwnerNameT)admOwnerStr, &privateAoHandle); > + if(rc != SA_AIS_OK) { > + TRACE("ERR_TRY_AGAIN: failed to obtain > internal admo handle rc:%u", rc); > + if(rc != SA_AIS_ERR_TRY_AGAIN) { > + rc = SA_AIS_ERR_TRY_AGAIN; > + } > + if(admOwnerStr) > + free(admOwnerStr); > + goto done; > + } > + if(admOwnerStr) > + free(admOwnerStr); > + } else { > + SaNameT admName;/* Used to get admo string name > copied to stack.*/ > + rc = getAdmoName(privateOmHandle, cbi, > &admName); > + if(rc != SA_AIS_OK) { > + TRACE("ERR_TRY_AGAIN: failed to obtain > SaImmAttrAdminOwnerName %u", rc); > + if(rc != SA_AIS_ERR_TRY_AGAIN) { > + rc = SA_AIS_ERR_TRY_AGAIN; > + } > + osaf_extended_name_free(&admName); > + goto done; > + } > + TRACE("Obtaned AdminOwnerName:%s", > osaf_extended_name_borrow(&admName)); > + /* Allocate private admowner with > ReleaseOnFinalize as TRUE */ > + osafassert(immsv_om_admo_handle_initialize); > + rc = > immsv_om_admo_handle_initialize(privateOmHandle, > + (SaImmAdminOwnerNameT) > osaf_extended_name_borrow(&admName), &privateAoHandle); > + > + if(rc != SA_AIS_OK) { > + TRACE("ERR_TRY_AGAIN: failed to obtain > internal admo handle rc:%u", rc); > + if(rc != SA_AIS_ERR_TRY_AGAIN) { > + rc = SA_AIS_ERR_TRY_AGAIN; > } > osaf_extended_name_free(&admName); > goto done; > - } > - TRACE("Obtaned AdminOwnerName:%s", > osaf_extended_name_borrow(&admName)); > - /* Allocate private admowner with ReleaseOnFinalize as > TRUE */ > - osafassert(immsv_om_admo_handle_initialize); > - rc = immsv_om_admo_handle_initialize(privateOmHandle, > - (SaImmAdminOwnerNameT) > osaf_extended_name_borrow(&admName), &privateAoHandle); > - > - if(rc != SA_AIS_OK) { > - TRACE("ERR_TRY_AGAIN: failed to obtain internal > admo handle rc:%u", rc); > - if(rc != SA_AIS_ERR_TRY_AGAIN) { > - rc = SA_AIS_ERR_TRY_AGAIN; > } > osaf_extended_name_free(&admName); > - goto done; > } > - osaf_extended_name_free(&admName); > } > } else {TRACE("AugCcbinit: Admo has ROF == TRUE");} > > diff --git a/osaf/libs/common/immsv/immsv_evt.c > b/osaf/libs/common/immsv/immsv_evt.c > --- a/osaf/libs/common/immsv/immsv_evt.c > +++ b/osaf/libs/common/immsv/immsv_evt.c > @@ -177,6 +177,7 @@ static const char *immnd_evt_names[] = { > "IMMND_EVT_A2ND_OBJ_CREATE_2", /* saImmOmCcbObjectCreate_o3 */ > "IMMND_EVT_A2ND_OI_OBJ_CREATE_2", /* saImmOiRtObjectCreate_o3 */ > "IMMND_EVT_A2ND_OBJ_SAFE_READ", /* saImmOmCcbObjectRead */ > + "IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO", /* To get Admin owner name for > corresponding ccbID */ > "undefined (high)" > }; > > @@ -1332,19 +1333,22 @@ static uint32_t immsv_evt_enc_sublevels( > } > } > } else if ((i_evt->info.imma.type == > IMMA_EVT_ND2A_SEARCHNEXT_RSP) || > - (i_evt->info.imma.type == > IMMA_EVT_ND2A_ACCESSOR_GET_RSP)) { > + (i_evt->info.imma.type == > IMMA_EVT_ND2A_ACCESSOR_GET_RSP) || > + (i_evt->info.imma.type == > IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP)) { > uint8_t *p8; > int depth = 0; > /*Encode searchNext response */ > IMMSV_OM_RSP_SEARCH_NEXT *sn = > i_evt->info.imma.info.searchNextRsp; > osafassert(sn); > > - IMMSV_OCTET_STRING *os = &(sn->objectName); > - IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4); > - ncs_encode_32bit(&p8, os->size); > - ncs_enc_claim_space(o_ub, 4); > - if(!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) { > - return NCSCC_RC_OUT_OF_MEM; > + if(i_evt->info.imma.type != > IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP){ > + IMMSV_OCTET_STRING *os = &(sn->objectName); > + IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4); > + ncs_encode_32bit(&p8, os->size); > + ncs_enc_claim_space(o_ub, 4); > + if(!immsv_evt_enc_inline_text(__LINE__, o_ub, > os)) { > + return NCSCC_RC_OUT_OF_MEM; > + } > } > > IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 1); > @@ -2013,7 +2017,8 @@ static uint32_t immsv_evt_dec_sublevels( > } > } > } else if ((o_evt->info.imma.type == > IMMA_EVT_ND2A_SEARCHNEXT_RSP) || > - (o_evt->info.imma.type == > IMMA_EVT_ND2A_ACCESSOR_GET_RSP)) { > + (o_evt->info.imma.type == > IMMA_EVT_ND2A_ACCESSOR_GET_RSP) || > + (o_evt->info.imma.type == > IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP)) { > uint8_t *p8; > uint8_t c8; > uint8_t local_data[8]; > @@ -2022,11 +2027,13 @@ static uint32_t immsv_evt_dec_sublevels( > o_evt->info.imma.info.searchNextRsp = calloc(1, > sizeof(IMMSV_OM_RSP_SEARCH_NEXT)); > > /* Decode object name */ > - IMMSV_OCTET_STRING *os = > &(o_evt->info.imma.info.searchNextRsp->objectName); > - IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4); > - os->size = ncs_decode_32bit(&p8); > - ncs_dec_skip_space(i_ub, 4); > - immsv_evt_dec_inline_string(i_ub, os); > + if(o_evt->info.imma.type != > IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP){ > + IMMSV_OCTET_STRING *os = > &(o_evt->info.imma.info.searchNextRsp->objectName); > + IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, > 4); > + os->size = ncs_decode_32bit(&p8); > + ncs_dec_skip_space(i_ub, 4); > + immsv_evt_dec_inline_string(i_ub, os); > + } > > IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 1); > c8 = ncs_decode_8bit(&p8); > @@ -2657,6 +2664,7 @@ static uint32_t immsv_evt_enc_toplevel(I > > case IMMA_EVT_ND2A_SEARCHNEXT_RSP: //Response from for > SearchNext > case IMMA_EVT_ND2A_ACCESSOR_GET_RSP: //Response from for > AccessorGet > + case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP: //Response to get > Admin name from ccbID > /*Totaly encoded in sublevel. */ > break; > > @@ -3424,6 +3432,14 @@ static uint32_t immsv_evt_enc_toplevel(I > > break; > > + case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO: > + > + IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4); > + ncs_encode_32bit(&p8, immndevt->info.ccbId); > + ncs_enc_claim_space(o_ub, 4); > + > + break; > + > case IMMND_EVT_A2ND_IMM_ADMOP: /* Syncronous AdminOp */ > case IMMND_EVT_A2ND_IMM_ADMOP_ASYNC: /* Asyncronous AdminOp > */ > IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4); > @@ -4048,6 +4064,7 @@ static uint32_t immsv_evt_dec_toplevel(N > > case IMMA_EVT_ND2A_SEARCHNEXT_RSP: //Response from for > SearchNext > case IMMA_EVT_ND2A_ACCESSOR_GET_RSP: //Response from for > AccessorGet > + case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP: //Response to get > Admin name from ccbID > /*Totaly decoded in sublevel. */ > break; > > @@ -4845,6 +4862,12 @@ static uint32_t immsv_evt_dec_toplevel(N > immndevt->info.ccbId = ncs_decode_32bit(&p8); > ncs_dec_skip_space(i_ub, 4); > break; > + > + case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO: /* Get Admin > owner name for corresponding ccbID */ > + IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4); > + immndevt->info.ccbId = ncs_decode_32bit(&p8); > + ncs_dec_skip_space(i_ub, 4); > + break; > > case IMMND_EVT_A2ND_IMM_ADMOP: /* Syncronous AdminOp */ > case IMMND_EVT_A2ND_IMM_ADMOP_ASYNC: /* Asyncronous AdminOp > */ > diff --git a/osaf/libs/common/immsv/include/immsv_evt.h > b/osaf/libs/common/immsv/include/immsv_evt.h > --- a/osaf/libs/common/immsv/include/immsv_evt.h > +++ b/osaf/libs/common/immsv/include/immsv_evt.h > @@ -93,6 +93,7 @@ typedef enum imma_evt_type { > IMMA_EVT_ND2A_OI_OBJ_CREATE_LONG_UC = 31, /*OBJ CREATE UP-CALL > with long DN. */ > IMMA_EVT_ND2A_OI_OBJ_MODIFY_LONG_UC = 32, /*OBJ MODIFY UP-CALL > with long DN. */ > IMMA_EVT_ND2A_OI_OBJ_DELETE_LONG_UC = 33, /*OBJ DELETE UP-CALL > with long DN. */ > + IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP = 34, /* Response for augumet > ccb get admin owner name from ccbid*/ > > IMMA_EVT_MAX > } IMMA_EVT_TYPE; > @@ -215,6 +216,7 @@ typedef enum immnd_evt_type { > IMMND_EVT_A2ND_OI_OBJ_CREATE_2 = 99, /* saImmOiRtObjectCreate_o3 */ > > IMMND_EVT_A2ND_OBJ_SAFE_READ = 100, /* saImmOmCcbObjectRead */ > + IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO = 101, /* Get Admin owner name from > CCbID */ > > IMMND_EVT_MAX > } IMMND_EVT_TYPE; > diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc > b/osaf/services/saf/immsv/immnd/ImmModel.cc > --- a/osaf/services/saf/immsv/immnd/ImmModel.cc > +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc > @@ -2380,6 +2380,14 @@ immModel_fetchRtUpdate(IMMND_CB *cb, > fetchRtUpdate(syncReq, rtModReq, syncFevsBase)?SA_TRUE:SA_FALSE; > } > > +SaAisErrorT immModel_getAdminOwnerFromCcbId(IMMND_CB *cb, > + SaUint32T ccbId, SaStringT *admOwnNameptr) > +{ > + > + return ImmModel::instance(&cb->immModel)-> > + getAdminOwnerFromCcbId(ccbId, admOwnNameptr); > + > +} > > SaAisErrorT > immModel_resourceDisplay(IMMND_CB *cb, > @@ -13179,6 +13187,37 @@ ImmModel::updateImmObject2(const ImmsvOm > } > > SaAisErrorT > +ImmModel::getAdminOwnerFromCcbId(const SaUint32T ccbId, SaStringT > *admOwnNameptr) > +{ > + SaAisErrorT err = SA_AIS_OK; > + CcbVector::iterator i; > + AdminOwnerVector::iterator j = sOwnerVector.end(); > + SaUint32T ownerId; > + TRACE_ENTER(); > + > + i = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId)); > + if (i == sCcbVector.end()) { > + LOG_NO("ERR_BAD_HANDLE: CCB %u does not exist", ccbId); > + err = SA_AIS_ERR_BAD_HANDLE; > + } else { > + ownerId = (*i)->mAdminOwnerId; > + j = std::find_if(sOwnerVector.begin(), sOwnerVector.end(), > IdIs(ownerId)); > + if((*i)->mAdminOwnerId && (j == sOwnerVector.end())) { > + LOG_NO("ERR_BAD_HANDLE: admin owner %u does not exist", > (*i)->mAdminOwnerId); > + err = SA_AIS_ERR_BAD_HANDLE; > + } else { > + TRACE_5(" admin owner '%s'", (*j)->mAdminOwnerName.c_str()); > + *admOwnNameptr = (char *) > malloc((*j)->mAdminOwnerName.length()+1); > + strcpy( *admOwnNameptr, (*j)->mAdminOwnerName.c_str()); > + } > + TRACE("Owner id %d", ownerId); > + } > + > + TRACE_LEAVE(); > + return err; > +} > + > +SaAisErrorT > ImmModel::resourceDisplay(const struct ImmsvAdminOperationParam *reqparams, > struct ImmsvAdminOperationParam **rparams, > SaUint64T searchcount) > { > diff --git a/osaf/services/saf/immsv/immnd/ImmModel.hh > b/osaf/services/saf/immsv/immnd/ImmModel.hh > --- a/osaf/services/saf/immsv/immnd/ImmModel.hh > +++ b/osaf/services/saf/immsv/immnd/ImmModel.hh > @@ -492,6 +492,9 @@ public: > const struct ImmsvAdminOperationParam > *reqparams, > struct ImmsvAdminOperationParam > **rparams, > SaUint64T searchcount); > + SaAisErrorT getAdminOwnerFromCcbId( > + SaUint32T ccbId, > + SaStringT *admOwnNameptr); > > void setScAbsenceAllowed(SaUint32T scAbsenceAllowed); > > diff --git a/osaf/services/saf/immsv/immnd/immnd_evt.c > b/osaf/services/saf/immsv/immnd/immnd_evt.c > --- a/osaf/services/saf/immsv/immnd/immnd_evt.c > +++ b/osaf/services/saf/immsv/immnd/immnd_evt.c > @@ -225,6 +225,7 @@ static void immnd_evt_ccb_abort(IMMND_CB > SaUint32T * clArrSize, SaUint32T *nodeId); > > static uint32_t immnd_evt_proc_reset(IMMND_CB *cb, IMMND_EVT *evt, > IMMSV_SEND_INFO *sinfo); > +static uint32_t immnd_evt_aug_ccb_get_admo(IMMND_CB *cb, IMMND_EVT *evt, > IMMSV_SEND_INFO *sinfo); > > #if 0 /* Only for debug */ > static void printImmValue(SaImmValueTypeT t, IMMSV_EDU_ATTR_VAL *v) > @@ -631,6 +632,10 @@ void immnd_process_evt(void) > rc = immnd_evt_proc_admop_rsp(cb, &evt->info.immnd, > &evt->sinfo, SA_TRUE, SA_TRUE); > break; > > + case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO: > + rc = immnd_evt_aug_ccb_get_admo(cb, &evt->info.immnd, > &evt->sinfo); > + break; > + > case IMMND_EVT_ND2ND_ADMOP_RSP: > case IMMND_EVT_ND2ND_ADMOP_RSP_2: > rc = immnd_evt_proc_admop_rsp(cb, &evt->info.immnd, > &evt->sinfo, SA_FALSE, SA_FALSE); > @@ -4445,6 +4450,66 @@ static void immnd_evt_sync_fevs_base(IMM > > } > > +/***************************************************************************** > + * Name : immnd_evt_aug_ccb_get_admo > + * > + * Description : Function to get adminoperation name from the CcbID. > + * When saImmOiAugmentCcbInitialize is called from completed > + callback. > + * > + * Arguments : IMMND_CB *cb - IMMND CB pointer > + * IMMSV_EVT *evt - Received Event structure > + * > + * Return Values : NCSCC_RC_SUCCESS/Error. > + * > + > *****************************************************************************/ > + > + > +static uint32_t immnd_evt_aug_ccb_get_admo(IMMND_CB *cb, IMMND_EVT *evt, > IMMSV_SEND_INFO *sinfo) > +{ > + IMMSV_EVT send_evt; > + SaAisErrorT err = SA_AIS_OK; > + uint32_t rc = NCSCC_RC_SUCCESS; > + SaStringT admOwnName = NULL; > + TRACE_ENTER(); > + > + err = immModel_getAdminOwnerFromCcbId(cb, evt->info.ccbId, &admOwnName); > + memset(&send_evt, '\0', sizeof(IMMSV_EVT)); > + > + if (err == SA_AIS_OK && admOwnName) { > + IMMSV_OM_RSP_SEARCH_NEXT * rsp = (IMMSV_OM_RSP_SEARCH_NEXT*) > calloc(1, sizeof(IMMSV_OM_RSP_SEARCH_NEXT)); > + /* The objectName is not sent by response, only the adminowner > information is sent as attribute*/ > + > + rsp->attrValuesList = (IMMSV_ATTR_VALUES_LIST *) calloc(1, > sizeof(IMMSV_ATTR_VALUES_LIST)); > + IMMSV_ATTR_VALUES* attr = &(rsp->attrValuesList->n); > + > + attr->attrName.size = (SaUint32T) > strlen("SaImmAttrAdminOwnerName")+1; > + attr->attrName.buf = strdup("SaImmAttrAdminOwnerName"); > + attr->attrValueType = SA_IMM_ATTR_SASTRINGT; > + attr->attrValuesNumber =1; > + attr->attrValue.val.x.size=(SaUint32T) strlen(admOwnName)+1; > + attr->attrValue.val.x.buf = (char *) > malloc(attr->attrValue.val.x.size); > + memcpy(attr->attrValue.val.x.buf, admOwnName, > attr->attrValue.val.x.size); > + TRACE("The AdminOwner Name is %s ", attr->attrValue.val.x.buf); > + > + send_evt.type = IMMSV_EVT_TYPE_IMMA; > + send_evt.info.imma.type = > IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP; > + send_evt.info.imma.info.searchNextRsp = rsp; > + } else { > + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; > + send_evt.info.imma.info.errRsp.error = err; > + send_evt.info.imma.info.errRsp.errStrings = NULL; > + } > + > + rc = immnd_mds_send_rsp(cb, sinfo, &send_evt); > + if (rc != NCSCC_RC_SUCCESS) { > + LOG_WA("Failed to send response to agent/client over MDS > rc:%u", rc); > + } > + if(admOwnName) > + free(admOwnName); > + return rc; > +} > + > static void immnd_evt_safe_read_lock(IMMND_CB *cb, IMMND_EVT *evt, > SaBoolT originatedAtThisNd, SaImmHandleT clnt_hdl, MDS_DEST > reply_dest) > { > diff --git a/osaf/services/saf/immsv/immnd/immnd_init.h > b/osaf/services/saf/immsv/immnd/immnd_init.h > --- a/osaf/services/saf/immsv/immnd/immnd_init.h > +++ b/osaf/services/saf/immsv/immnd/immnd_init.h > @@ -446,6 +446,9 @@ extern "C" { > const struct ImmsvAdminOperationParam *reqparams, > struct ImmsvAdminOperationParam **rparams); > > + SaAisErrorT immModel_getAdminOwnerFromCcbId(IMMND_CB *cb, > + SaUint32T ccbId, SaStringT *admOwnNameptr); > + > void > immModel_setCcbErrorString(IMMND_CB *cb, > SaUint32T ccbId, > ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
