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

Reply via email to