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 Reddy [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
