void saClmFinalize_01(void)
{
    safassert(saClmInitialize(&clmHandle, &clmCallbacks_1, &clmVersion_1), SA_AIS_OK);
    rc = saClmFinalize(clmHandle);
    test_validate(rc, SA_AIS_OK);
    safassert(saClmInitialize_4(&clmHandle, &clmCallbacks_4, &clmVersion_4), SA_AIS_OK);
    rc = saClmFinalize(clmHandle);
    test_validate(rc, SA_AIS_OK);
}
Example #2
0
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;
            }
        }
    }
}