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

Reply via email to