osaf/services/saf/immsv/immnd/ImmModel.cc | 60 +++++++++++++++++++++++++++++++ osaf/services/saf/immsv/immnd/ImmModel.hh | 5 ++ osaf/services/saf/immsv/immnd/immnd_evt.c | 27 ++++++++++++- 3 files changed, 89 insertions(+), 3 deletions(-)
When an implementer is detached from an object/class, CCB operations return ERR_NOT_EXIST error code. The patch should give more information regarding the error code in the error string. 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 @@ -6950,6 +6950,10 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im TRACE_7("ERR_NOT_EXIST: object '%s' does not have an " "implementer and flag SA_IMM_CCB_REGISTERED_OI is set", objectName.c_str()); + setCcbErrorString(ccb, + "ERR_NOT_EXIST: object '%s' does not have an " + "implementer and flag SA_IMM_CCB_REGISTERED_OI is set", + objectName.c_str()); err = SA_AIS_ERR_NOT_EXIST; } } else { /* SA_IMM_CCB_REGISTERED_OI NOT set */ @@ -7790,6 +7794,10 @@ ImmModel::ccbObjectModify(const ImmsvOmC TRACE_7("ERR_NOT_EXIST: object '%s' does not have an " "implementer and flag SA_IMM_CCB_REGISTERED_OI is set", objectName.c_str()); + setCcbErrorString(ccb, + "ERR_NOT_EXIST: object '%s' does not have an " + "implementer and flag SA_IMM_CCB_REGISTERED_OI is set", + objectName.c_str()); err = SA_AIS_ERR_NOT_EXIST; } } else { /* SA_IMM_CCB_REGISTERED_OI NOT set */ @@ -8201,6 +8209,10 @@ ImmModel::deleteObject(ObjectMap::iterat TRACE_7("ERR_NOT_EXIST: object '%s' does not have an implementer " "and flag SA_IMM_CCB_REGISTERED_OI is set", oi->first.c_str()); + setCcbErrorString(ccb, + "ERR_NOT_EXIST: object '%s' does not have an implementer " + "and flag SA_IMM_CCB_REGISTERED_OI is set", + oi->first.c_str()); return SA_AIS_ERR_NOT_EXIST; } } else { /* SA_IMM_CCB_REGISTERED_OI NOT set */ @@ -8370,6 +8382,54 @@ ImmModel::deleteObject(ObjectMap::iterat return SA_AIS_OK; } +void +ImmModel::setCcbErrorString(CcbInfo *ccb, const char *errorString, ...) +{ + int errLen = strlen(errorString) + 1; + char *fmtError = (char *)malloc(errLen); + int len; + va_list vl; + + va_start(vl, errorString); + len = vsnprintf(fmtError, errLen, errorString, vl); + va_end(vl); + + osafassert(len >= 0); + len++; /* Reserve one byte for null-terminated sign '\0' */ + if(len > errLen) { + fmtError = (char *)realloc(fmtError, len); + va_start(vl, errorString); + osafassert(vsnprintf(fmtError, len, errorString, vl) >= 0); + va_end(vl); + } + + unsigned int ix=0; + ImmsvAttrNameList* errStr = ccb->mErrorStrings; + ImmsvAttrNameList** errStrTail = &(ccb->mErrorStrings); + while(errStr) { + if(!strncmp(fmtError, errStr->name.buf, len)) { + TRACE_5("Discarding duplicate error string '%s' for ccb id %u", + fmtError, ccb->mId); + free(fmtError); + return; + } + ++ix; + errStrTail = &(errStr->next); + errStr = errStr->next; + } + + if(ix >= IMMSV_MAX_ATTRIBUTES) { + TRACE_5("Discarding error string '%s' for ccb id %u (too many)", + fmtError, ccb->mId); + free(fmtError); + } else { + (*errStrTail) = (ImmsvAttrNameList *) malloc(sizeof(ImmsvAttrNameList)); + (*errStrTail)->next = NULL; + (*errStrTail)->name.size = len; + (*errStrTail)->name.buf = fmtError; + } +} + bool ImmModel::hasLocalClassAppliers(ClassInfo* classInfo) { 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 @@ -259,6 +259,11 @@ public: IdVector& continuations, unsigned int pbeIsLocal); + void setCcbErrorString( + CcbInfo *ccb, + const char *errorString, + ...); + bool hasLocalClassAppliers(ClassInfo* classInfo); bool hasLocalObjAppliers(const std::string& objName); 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 @@ -5732,11 +5732,18 @@ static void immnd_evt_proc_object_create memset(&send_evt, '\0', sizeof(IMMSV_EVT)); send_evt.type = IMMSV_EVT_TYPE_IMMA; send_evt.info.imma.info.errRsp.error = err; - send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; + send_evt.info.imma.info.errRsp.errStrings = immModel_ccbGrabErrStrings(cb, evt->info.objCreate.ccbId); + + if(send_evt.info.imma.info.errRsp.errStrings) { + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2; + } else { + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; + } if (immnd_mds_send_rsp(cb, &(cl_node->tmpSinfo), &send_evt) != NCSCC_RC_SUCCESS) { LOG_WA("Failed to send result to Agent over MDS"); } + immsv_evt_free_attrNames(send_evt.info.imma.info.errRsp.errStrings); } TRACE_LEAVE(); } @@ -5957,11 +5964,18 @@ static void immnd_evt_proc_object_modify memset(&send_evt, '\0', sizeof(IMMSV_EVT)); send_evt.type = IMMSV_EVT_TYPE_IMMA; send_evt.info.imma.info.errRsp.error = err; - send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; + send_evt.info.imma.info.errRsp.errStrings = immModel_ccbGrabErrStrings(cb, evt->info.objModify.ccbId); + + if(send_evt.info.imma.info.errRsp.errStrings) { + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2; + } else { + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; + } if (immnd_mds_send_rsp(cb, &(cl_node->tmpSinfo), &send_evt) != NCSCC_RC_SUCCESS) { LOG_WA("Failed to send result to Agent over MDS"); } + immsv_evt_free_attrNames(send_evt.info.imma.info.errRsp.errStrings); } done: @@ -6715,11 +6729,18 @@ static void immnd_evt_proc_object_delete memset(&send_evt, '\0', sizeof(IMMSV_EVT)); send_evt.type = IMMSV_EVT_TYPE_IMMA; send_evt.info.imma.info.errRsp.error = err; - send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; + send_evt.info.imma.info.errRsp.errStrings = immModel_ccbGrabErrStrings(cb, evt->info.objDelete.ccbId); + + if(send_evt.info.imma.info.errRsp.errStrings) { + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR_2; + } else { + send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR; + } if (immnd_mds_send_rsp(cb, &(cl_node->tmpSinfo), &send_evt) != NCSCC_RC_SUCCESS) { LOG_WA("Failed to send result to Agent over MDS"); } + immsv_evt_free_attrNames(send_evt.info.imma.info.errRsp.errStrings); } } ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel