/** * Configuration changes are done fill in and send corresponding notification. * */ static void saImmOiCcbApplyCallback(SaImmOiHandleT immOiHandle, SaImmOiCcbIdT ccbId) { struct CcbUtilCcbData *ccbUtilCcbData; struct CcbUtilOperationData *ccbUtilOperationData; int internal_rc = 0; SaStringT rdn_attr_name; SaNameT *invoke_name_ptr; SaBoolT ccbLast = SA_FALSE; SaUint64T ccb_entries_cnt = 0; TRACE_ENTER(); if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) { LOG_ER("%s: Failed to find CCB object for ccb Id %llu",__FUNCTION__, ccbId); internal_rc = (-1); goto done; } /* Count the number of ccb entries in order to know which is the last one */ ccbUtilOperationData = ccbUtilCcbData->operationListHead; ccb_entries_cnt = 0; while (ccbUtilOperationData != NULL) { ccb_entries_cnt++; ccbUtilOperationData = ccbUtilOperationData->next; } ccbUtilOperationData = ccbUtilCcbData->operationListHead; while (ccbUtilOperationData != NULL) { if (ccb_entries_cnt > 0) { ccb_entries_cnt--; } if (ccb_entries_cnt == 0) { ccbLast = SA_TRUE; } switch (ccbUtilOperationData->operationType) { case CCBUTIL_CREATE: rdn_attr_name = get_rdn_attr_name( ccbUtilOperationData->param.create.className); internal_rc = ntfimcn_send_object_create_notification( ccbUtilOperationData, rdn_attr_name, ccbLast); if (internal_rc != 0) { LOG_ER("%s send_object_create_notification fail", __FUNCTION__); goto done; } break; case CCBUTIL_DELETE: invoke_name_ptr = (SaNameT *)ccbUtilCcbData->userData; internal_rc = ntfimcn_send_object_delete_notification(ccbUtilOperationData, invoke_name_ptr, ccbLast); if (internal_rc != 0) { LOG_ER("%s send_object_delete_notification fail", __FUNCTION__); goto done; } break; case CCBUTIL_MODIFY: invoke_name_ptr = ccbUtilCcbData->userData; /* send_object_modify_notification */ internal_rc = ntfimcn_send_object_modify_notification( ccbUtilOperationData, invoke_name_ptr, ccbLast); if (internal_rc != 0) { LOG_ER("%s send_object_modify_notification fail", __FUNCTION__); goto done; } break; } ccbUtilOperationData = ccbUtilOperationData->next; } done: if (ccbUtilCcbData != NULL) { ccbutil_deleteCcbData(ccbUtilCcbData); } TRACE_LEAVE(); if (internal_rc != 0) { /* If we fail to send a notification we exit. This will signal that * a notification is missing. */ imcn_exit(EXIT_FAILURE); } }
/** * Save the CCB. Will be handled and freed in apply callback * */ static SaAisErrorT saImmOiCcbObjectModifyCallback(SaImmOiHandleT immOiHandle, SaImmOiCcbIdT ccbId, const SaNameT *objectName, const SaImmAttrModificationT_2 **attrMods) { SaAisErrorT rc = SA_AIS_OK; struct CcbUtilCcbData *ccbUtilCcbData; SaNameT *invoke_name_ptr = NULL; struct CcbUtilOperationData *ccbUtilOperationData; int internal_rc = 0; TRACE_ENTER(); if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) { if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) { LOG_ER("%s: Failed to get CCB object for ccb Id %llu",__FUNCTION__, ccbId); rc = SA_AIS_ERR_NO_MEMORY; goto done; } invoke_name_ptr = get_operation_invoke_name_modify(ccbId, attrMods); ccbUtilCcbData->userData = invoke_name_ptr; } /* "memorize the modification request" */ ccbutil_ccbAddModifyOperation(ccbUtilCcbData, objectName, attrMods); SaNameT *invoker_name_ptr; invoker_name_ptr = ccbUtilCcbData->userData; if (ccbId == 0) { /* Attribute change object create */ ccbUtilOperationData = ccbUtilCcbData->operationListHead; internal_rc = ntfimcn_send_object_modify_notification( ccbUtilOperationData, invoker_name_ptr, SA_FALSE); if (ccbUtilCcbData != NULL) { ccbutil_deleteCcbData(ccbUtilCcbData); } if (internal_rc != 0) { LOG_ER("%s send_object_modify_notification fail", __FUNCTION__); goto done; } } done: if (internal_rc != 0) { /* If we fail to send a notification we exit. This will signal that * a notification is missing. */ LOG_ER("saImmOiCcbObjectCreateCallback Fail, internal_rc=%d", internal_rc); imcn_exit(EXIT_FAILURE); } TRACE_LEAVE(); return rc; }
/* * Exit if anything fails. This will cause ntfs to restart ntfimcn */ int main(int argc, char** argv) { const char* logPath; const char* trace_label = "osafntfimcnd"; SaAisErrorT ais_error = SA_AIS_OK; /* * Activate Log Trace */ openlog(basename(argv[0]), LOG_PID, LOG_LOCAL0); if ((logPath = getenv("NTFSCN_TRACE_PATHNAME"))) { category_mask = 0xffffffff; } else { logPath = PKGLOGDIR "/" NTFIMCN_DEFAULT_LOG; } if (logtrace_init(trace_label, logPath, category_mask) == -1) { syslog(LOG_ERR, "osafntfimcnd logtrace_init FAILED"); /* We allow to execute anyway. */ } /* * Initiate HA state */ if (strcmp(argv[1],"active") == 0) { ntfimcn_cb.haState = SA_AMF_HA_ACTIVE; } else { ntfimcn_cb.haState = SA_AMF_HA_STANDBY; } /* * Initiate external functionallity * Exit on fail. This will cause ntfs to restart ntfimcn */ if (ntfimcn_ntf_init(&ntfimcn_cb) == NTFIMCN_INTERNAL_ERROR) { LOG_ER("ntfimcn_ntf_init() Fail"); _Exit(EXIT_FAILURE); } if (ntfimcn_imm_init(&ntfimcn_cb) == NTFIMCN_INTERNAL_ERROR) { LOG_ER("ntfimcn_imm_init() Fail"); imcn_exit(EXIT_FAILURE); } /* Signal for TRACE on/off */ if (signal(SIGUSR2, sigusr2_handler) == SIG_ERR) { LOG_ER("signal USR2 failed: %s", strerror(errno)); /* We allow to execute anyway. */ } if (ntfimcn_send_lost_cm_notification() == NTFIMCN_INTERNAL_ERROR) { LOG_ER("send_lost_cm_notification() Fail"); imcn_exit(EXIT_FAILURE); } /* Termination signal with handler */ if (ncs_sel_obj_create(&term_sel_obj) != NCSCC_RC_SUCCESS) { LOG_ER("ncs_sel_obj_create failed"); _Exit(EXIT_FAILURE); } if (signal(SIGTERM, sigterm_handler) == SIG_ERR) { LOG_ER("signal TERM failed: %s", strerror(errno)); _Exit(EXIT_FAILURE); } /* * Initiate polling */ fds[FD_IMM].fd = ntfimcn_cb.immSelectionObject; fds[FD_IMM].events = POLLIN; fds[FD_TERM].fd = term_sel_obj.rmv_obj; fds[FD_TERM].events = POLLIN; LOG_NO("Started"); while (1) { if (poll(fds, nfds, -1) == (-1)) { if (errno == EINTR) { continue; } LOG_ER("poll Fail - %s", strerror(errno)); imcn_exit(EXIT_FAILURE); } if (fds[FD_TERM].revents & POLLIN) { handle_sigterm_event(); } if (fds[FD_IMM].revents & POLLIN) { ais_error = saImmOiDispatch(ntfimcn_cb.immOiHandle, SA_DISPATCH_ALL); if (ais_error != SA_AIS_OK) { LOG_NO("saImmOiDispatch() Fail %s",saf_error(ais_error)); imcn_exit(EXIT_FAILURE); } } } return 0; /* Dummy */ }
/** * Save the CCB. Will be handled and freed in apply callback * @param immOiHandle[in] * @param ccbId[in] * @param objectName[in] * * @return SaAisErrorT */ static SaAisErrorT saImmOiCcbObjectDeleteCallback(SaImmOiHandleT immOiHandle, SaImmOiCcbIdT ccbId, const SaNameT *objectName) { SaAisErrorT rc = SA_AIS_OK; struct CcbUtilCcbData *ccbUtilCcbData; struct CcbUtilOperationData *ccbUtilOperationData; const SaNameT invoke_name = { .length = 0, .value[0]='\0' }; int internal_rc = 0; TRACE_ENTER(); if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) { if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) { LOG_ER("%s Failed to get CCB object for %llu",__FUNCTION__,ccbId); rc = SA_AIS_ERR_NO_MEMORY; goto done; } } /* "memorize the delete request" */ ccbutil_ccbAddDeleteOperation(ccbUtilCcbData, objectName); if (ccbId == 0) { /* Runtime object delete */ ccbUtilOperationData = ccbUtilCcbData->operationListHead; internal_rc = ntfimcn_send_object_delete_notification(ccbUtilOperationData, &invoke_name, SA_FALSE); if (internal_rc != 0) { LOG_ER("%s send_object_delete_notification fail", __FUNCTION__); goto done; } if (ccbUtilCcbData != NULL) { ccbutil_deleteCcbData(ccbUtilCcbData); } if (internal_rc != 0) { LOG_ER("%s send_object_create_notification fail", __FUNCTION__); goto done; } } done: if (internal_rc != 0) { /* If we fail to send a notification we exit. This will signal that * a notification is missing. */ LOG_ER("saImmOiCcbObjectCreateCallback Fail, internal_rc=%d", internal_rc); imcn_exit(EXIT_FAILURE); } TRACE_LEAVE(); return rc; } /** * Save the CCB. Will be handled and freed in apply callback * If ccbId = 0: * This means that a runtime object is created and the * corresponding notification shall be sent from here * * @param immOiHandle[in] * @param ccbId[in] * @param className[in] * @param parentName[in] * @param attr[in] * * @return SaAisErrorT */ static SaAisErrorT saImmOiCcbObjectCreateCallback(SaImmOiHandleT immOiHandle, SaImmOiCcbIdT ccbId, const SaImmClassNameT className, const SaNameT *parentName, const SaImmAttrValuesT_2 **attr) { SaAisErrorT rc = SA_AIS_OK; CcbUtilCcbData_t *ccbUtilCcbData; SaNameT *dn_ptr; SaNameT *invoke_name_ptr = NULL; struct CcbUtilOperationData *ccbUtilOperationData; SaStringT rdn_attr_name; int internal_rc = 0; TRACE_ENTER(); dn_ptr = get_created_dn(className, parentName, attr); if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) { if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) { LOG_ER("%s: Failed to get CCB object for ccb Id %llu",__FUNCTION__, ccbId); rc = SA_AIS_ERR_NO_MEMORY; goto done; } invoke_name_ptr = get_operation_invoke_name_create(ccbId, attr); ccbUtilCcbData->userData = invoke_name_ptr; } /* "memorize the create request" */ ccbutil_ccbAddCreateOperation_2(ccbUtilCcbData, dn_ptr, className, parentName, attr); if (ccbId == 0) { /* Runtime object create */ ccbUtilOperationData = ccbUtilCcbData->operationListHead; rdn_attr_name = get_rdn_attr_name( ccbUtilOperationData->param.create.className); internal_rc = ntfimcn_send_object_create_notification( ccbUtilOperationData, rdn_attr_name, SA_FALSE); if (ccbUtilCcbData != NULL) { ccbutil_deleteCcbData(ccbUtilCcbData); } if (internal_rc != 0) { LOG_ER("%s send_object_create_notification fail", __FUNCTION__); goto done; } } done: if (internal_rc != 0) { /* If we fail to send a notification we exit. This will signal that * a notification is missing. */ LOG_ER("saImmOiCcbObjectCreateCallback Fail, internal_rc=%d", internal_rc); imcn_exit(EXIT_FAILURE); } TRACE_LEAVE(); return rc; }
/** * TERM event handler */ static void handle_sigterm_event(void) { LOG_NO("exiting on signal %d", SIGTERM); imcn_exit(EXIT_SUCCESS); }