/** * The main routine for the IMM director daemon. * @param argc * @param argv * * @return int */ int main(int argc, char *argv[]) { SaAisErrorT error; NCS_SEL_OBJ mbx_fd; struct pollfd fds[3]; daemonize(argc, argv); if (immd_initialize() != NCSCC_RC_SUCCESS) { TRACE("initialize_immd failed"); goto done; } /* Get file descriptor for mailbox */ mbx_fd = ncs_ipc_get_sel_obj(&immd_cb->mbx); /* Set up all file descriptors to listen to */ fds[FD_USR1].fd = immd_cb->usr1_sel_obj.rmv_obj; fds[FD_USR1].events = POLLIN; fds[FD_MBCSV].fd = immd_cb->mbcsv_sel_obj; fds[FD_MBCSV].events = POLLIN; fds[FD_MBX].fd = mbx_fd.rmv_obj; fds[FD_MBX].events = POLLIN; while (1) { int ret = poll(fds, 3, -1); if (ret == -1) { if (errno == EINTR) continue; LOG_ER("poll failed - %s", strerror(errno)); break; } if (fds[FD_MBCSV].revents & POLLIN) { if (immd_mbcsv_dispatch(immd_cb) != NCSCC_RC_SUCCESS) { LOG_ER("MBCSv Dispatch Failed"); break; } } if (fds[FD_MBX].revents & POLLIN) immd_process_evt(); if (fds[FD_AMF].revents & POLLIN) { if (immd_cb->amf_hdl != 0) { error = saAmfDispatch(immd_cb->amf_hdl, SA_DISPATCH_ALL); if (error != SA_AIS_OK) { LOG_ER("saAmfDispatch failed: %u", error); break; } } else { TRACE("SIGUSR1 event rec"); ncs_sel_obj_rmv_ind(immd_cb->usr1_sel_obj, TRUE, TRUE); ncs_sel_obj_destroy(immd_cb->usr1_sel_obj); if (immd_amf_init(immd_cb) != NCSCC_RC_SUCCESS) break; TRACE("AMF Initialization SUCCESS......"); fds[FD_AMF].fd = immd_cb->amf_sel_obj; } } } done: LOG_ER("Failed, exiting..."); TRACE_LEAVE(); exit(1); }
/** * The main routine for the clms daemon. * @param argc * @param argv * * @return int */ int main(int argc, char *argv[]) { NCS_SEL_OBJ mbx_fd; SaAisErrorT error = SA_AIS_OK; uint32_t rc; osaf_cluster = NULL; int term_fd; int timeout = -1; daemonize(argc, argv); if (clms_init() != NCSCC_RC_SUCCESS) { LOG_ER("clms_init failed"); goto done; } mbx_fd = ncs_ipc_get_sel_obj(&clms_cb->mbx); daemon_sigterm_install(&term_fd); /* Set up all file descriptors to listen to */ fds[FD_TERM].fd = term_fd; fds[FD_TERM].events = POLLIN; fds[FD_AMF].fd = clms_cb->nid_started ? usr1_sel_obj.rmv_obj : clms_cb->amf_sel_obj; fds[FD_AMF].events = POLLIN; fds[FD_MBCSV].fd = clms_cb->mbcsv_sel_obj; fds[FD_MBCSV].events = POLLIN; fds[FD_MBX].fd = mbx_fd.rmv_obj; fds[FD_MBX].events = POLLIN; fds[FD_IMM].fd = clms_cb->imm_sel_obj; fds[FD_IMM].events = POLLIN; #ifdef ENABLE_AIS_PLM fds[FD_PLM].fd = clms_cb->plm_sel_obj; fds[FD_PLM].events = POLLIN; #endif while (1) { if (clms_cb->rtu_pending == true) { TRACE("There is an IMM task to be tried again. setting poll time out to 500"); timeout = 500; } else { timeout = -1; } if ((clms_cb->immOiHandle != 0) && (clms_cb->is_impl_set == true)) { fds[FD_IMM].fd = clms_cb->imm_sel_obj; fds[FD_IMM].events = POLLIN; nfds = NUM_FD; } else { nfds = NUM_FD - 1; } int ret = poll(fds, nfds, timeout); if (ret == -1) { if (errno == EINTR) continue; LOG_ER("poll failed - %s", strerror(errno)); break; } if (ret == 0) { /* Process any/all pending RTAttribute updates to IMM */ TRACE("poll time out processing pending updates"); clms_retry_pending_rtupdates(); continue; } if (fds[FD_TERM].revents & POLLIN) { daemon_exit(); } if (fds[FD_AMF].revents & POLLIN) { if (clms_cb->amf_hdl != 0) { if ((error = saAmfDispatch(clms_cb->amf_hdl, SA_DISPATCH_ALL)) != SA_AIS_OK) { LOG_ER("saAmfDispatch failed: %u", error); break; } } else { TRACE("SIGUSR1 event rec"); ncs_sel_obj_rmv_ind(usr1_sel_obj, true, true); ncs_sel_obj_destroy(usr1_sel_obj); if (clms_amf_init(clms_cb) != NCSCC_RC_SUCCESS) { LOG_ER("AMF Initialization failed"); break; } TRACE("AMF Initialization SUCCESS......"); fds[FD_AMF].fd = clms_cb->amf_sel_obj; } } if (fds[FD_MBCSV].revents & POLLIN) { if ((rc = clms_mbcsv_dispatch(clms_cb->mbcsv_hdl)) != NCSCC_RC_SUCCESS) { LOG_ER("MBCSv Dispatch Failed"); break; } } if (fds[FD_MBX].revents & POLLIN) { clms_process_mbx(&clms_cb->mbx); } #ifdef ENABLE_AIS_PLM /*Incase the Immnd restart is not supported fully,have to reint imm - TO Be Done */ if (clms_cb->reg_with_plm == SA_TRUE){ if (fds[FD_PLM].revents & POLLIN) { if ((error = saPlmDispatch(clms_cb->plm_hdl, SA_DISPATCH_ALL)) != SA_AIS_OK) { LOG_ER("saPlmDispatch FAILED: %u", error); break; } } } #endif if (clms_cb->immOiHandle && fds[FD_IMM].revents & POLLIN) { if ((error = saImmOiDispatch(clms_cb->immOiHandle, SA_DISPATCH_ALL)) != SA_AIS_OK) { if (error == SA_AIS_ERR_BAD_HANDLE) { TRACE("main :saImmOiDispatch returned BAD_HANDLE"); /* * Invalidate the IMM OI handle, this info is used in other * locations. E.g. giving TRY_AGAIN responses to a create and * close app stream requests. That is needed since the IMM OI * is used in context of these functions. * * Also closing the handle. Finalize is ok with a bad handle * that is bad because it is stale and this actually clears * the handle from internal agent structures. In any case * we ignore the return value from Finalize here. */ saImmOiFinalize(clms_cb->immOiHandle); clms_cb->immOiHandle = 0; clms_cb->is_impl_set = false; /* Initiate IMM reinitializtion in the background */ clm_imm_reinit_bg(clms_cb); } else if (error != SA_AIS_OK) { LOG_ER("saImmOiDispatch FAILED: %u", error); break; } } } /* Retry any pending updates */ if (clms_cb->rtu_pending == true) clms_retry_pending_rtupdates(); } /* End while (1) */ done: LOG_ER("Failed, exiting..."); TRACE_LEAVE(); exit(1); }