void saftest_daemon_handle_selection_object_request( saftest_map_table_entry_t *map_entry, saftest_msg_t *request, saftest_msg_t **reply) { clm_session_t *clm_session = NULL; SaSelectionObjectT *selection_object = NULL; SaAisErrorT status; saftest_log("Received a select object get request for id %d\n", saftest_msg_get_ubit32_value(request, "CLM_SESSION_ID")); clm_session = lookup_clm_session_from_request(request); if (0 == strcmp("FALSE", saftest_msg_get_str_value(request, "NULL_SELECTION_OBJECT"))) { selection_object = &clm_session->selection_object; } status = saClmSelectionObjectGet(clm_session->clm_handle, selection_object); (*reply) = saftest_reply_msg_create(request, map_entry->reply_op, status); }
int main(int argc, char* argv[]) { /* Use syslog for logging (/var/log/messages) */ openlog(basename(argv[0]), LOG_PID, LOG_USER); //setenv("CLMSV_TRACE_PATHNAME","/tmp/clma.log",1); //only work if export before run this program SaAisErrorT rc; SaClmHandleT clmHandle; SaClmCallbacksT_4 clmCallbacks = { 0 }; SaVersionT version = { 'B', 4, 1 }; clmCallbacks.saClmClusterTrackCallback = clmClusterTrackCallback; rc = saClmInitialize_4(&clmHandle, &clmCallbacks, &version); if (rc != SA_AIS_OK) { syslog(LOG_ERR,"saClmInitialize_4 FAILED %u", rc); return 1; } SaSelectionObjectT clmFd; rc = saClmSelectionObjectGet(clmHandle, &clmFd); if (rc != SA_AIS_OK) { syslog(LOG_ERR,"saClmSelectionObjectGet FAILED %u", rc); return 1; } int clusterSize = 4; size_t sizeOfNotificationBuffer = (clusterSize * sizeof(SaClmClusterNotificationT_4)); SaClmClusterNotificationBufferT_4 clmlusterNotificationBuffer; clmlusterNotificationBuffer.viewNumber = 0; clmlusterNotificationBuffer.numberOfItems = clusterSize; clmlusterNotificationBuffer.notification = (SaClmClusterNotificationT_4*) calloc(1, sizeOfNotificationBuffer); if (clmlusterNotificationBuffer.notification == NULL) { syslog(LOG_ERR,"FAILED to allocate resources"); return 1; } SaUint8T trackFlags = SA_TRACK_CURRENT | SA_TRACK_CHANGES | SA_TRACK_START_STEP; //SA_TRACK_VALIDATE_STEP is supported with PLM only rc = saClmClusterTrack_4(clmHandle, trackFlags, &clmlusterNotificationBuffer); if (rc != SA_AIS_OK) { syslog(LOG_ERR,"saClmClusterTrack_4 FAILED %u", rc); if (rc == SA_AIS_ERR_NO_SPACE) { syslog(LOG_ERR,"rc = SA_AIS_ERR_NO_SPACE, numberOfItems = %d", clmlusterNotificationBuffer.numberOfItems); } free(clmlusterNotificationBuffer.notification); clmlusterNotificationBuffer.notification = NULL; return 1; } struct pollfd fds; fds.fd = clmFd; fds.events = POLLIN; while(1){ int res = poll(&fds, 1, -1); if (res == -1) { if (errno == EINTR) continue; else { syslog(LOG_ERR,"poll FAILED - %s", strerror(errno)); return 1; } } if (fds.revents & POLLIN) { syslog(LOG_INFO,"========= CLM event ==========="); rc = saClmDispatch(clmHandle, SA_DISPATCH_ONE); if (SA_AIS_OK != rc) { syslog(LOG_ERR,"saClmDispatch FAILED %u", rc); return 1; } } } }
int main(void) { SaSelectionObjectT st; SaErrorT ret; SaClmNodeIdT nid; SaClmCallbacksT my_callbacks = { .saClmClusterTrackCallback = (SaClmClusterTrackCallbackT)track_callback, .saClmClusterNodeGetCallback = (SaClmClusterNodeGetCallbackT)getnode_callback }; if ((ret = saClmInitialize(&hd, &my_callbacks, NULL)) != SA_OK) { fprintf(stderr, "saClmInitialize error, errno [%d]\n",ret); return 1; } if ((ret = saClmSelectionObjectGet(&hd, &st)) != SA_OK) { fprintf(stderr, "saClmSelectionObjectGet error, errno [%d]\n" , ret); return 1; } nid = 0; /* Synchronously get nodeId information */ printf("-------------------------------------------------\n"); printf("Get nodeId [%lu] info by SaClmClusterNodeGet\n", nid); if ((ret = saClmClusterNodeGet(nid, 10, &cn)) != SA_OK) { if (ret == SA_ERR_INVALID_PARAM) { fprintf(stderr, "NodeId [%lu] record not found!\n",nid); } else { fprintf(stderr , "saClmClusterNodeGet error, errno [%d]\n" , ret); return 1; } } else { dump_nodeinfo(&cn); } /* Asynchronously get my nodeId information */ nid = 1; printf("-------------------------------------------------\n"); printf("Get nodeId [%lu] info by SaClmClusterNodeGetAsync\n", nid); if ((ret = saClmClusterNodeGetAsync(&hd, 1234, nid, &cn)) != SA_OK) { if (ret == SA_ERR_INVALID_PARAM) { fprintf(stderr, "NodeId [%lu] record not found!\n",nid); } else { fprintf(stderr , "saClmClusterNodeGet error, errno [%d]\n" , ret); return 1; } } /* Start to track cluster membership changes events */ track_start(SIGUSR1); signal(SIGUSR2, &track_stop); for (;;) { fd_set rset; FD_ZERO(&rset); FD_SET(st, &rset); if (select(st + 1, &rset, NULL, NULL, NULL) == -1) { /* TODO should we use pselect here? */ if (errno == EINTR) continue; else { perror("select"); return 1; } } if ((ret = saClmDispatch(&hd, SA_DISPATCH_ALL)) != SA_OK) { if (ret == SA_ERR_LIBRARY) { fprintf(stderr, "I am evicted!\n"); return 1; } fprintf(stderr, "saClmDispatch error, errno [%d]\n" , ret); return 1; } } return 0; }