static eReportBuilderStatus prvWriteConnectionsArray()

in source/defender-tools/report_builder.c [278:362]


static eReportBuilderStatus prvWriteConnectionsArray( char * pcBuffer,
                                                      uint32_t ulBufferLength,
                                                      const Connection_t * pxConnectionsArray,
                                                      uint32_t ulConnectionsArrayLength,
                                                      uint32_t * pulOutCharsWritten )
{
    char * pcCurrentWritePos = pcBuffer;
    uint32_t i, ulRemainingBufferLength = ulBufferLength;
    int32_t lCharactersWritten;
    eReportBuilderStatus eStatus = eReportBuilderSuccess;
    const Connection_t * pxConn;

    configASSERT( pcBuffer != NULL );
    configASSERT( pxConnectionsArray != NULL );
    configASSERT( pulOutCharsWritten != NULL );

    /* Write the JSON array open marker. */
    if( ulRemainingBufferLength > 1 )
    {
        *pcCurrentWritePos = reportbuilderJSON_ARRAY_OPEN_MARKER;
        ulRemainingBufferLength -= 1;
        pcCurrentWritePos += 1;
    }
    else
    {
        eStatus = eReportBuilderBufferTooSmall;
    }

    /* Write the array elements. */
    for( i = 0; ( ( i < ulConnectionsArrayLength ) && ( eStatus == eReportBuilderSuccess ) ); i++ )
    {
        pxConn = &( pxConnectionsArray[ i ] );
        lCharactersWritten = snprintf( pcCurrentWritePos,
                                       ulRemainingBufferLength,
                                       reportbuilderJSON_CONNECTION_OBJECT_FORMAT,
                                       DEFENDER_REPORT_LOCAL_PORT_KEY,
                                       pxConn->usLocalPort,
                                       DEFENDER_REPORT_REMOTE_ADDR_KEY,
                                       ( pxConn->ulRemoteIp >> 24 ) & 0xFFUL,
                                       ( pxConn->ulRemoteIp >> 16 ) & 0xFFUL,
                                       ( pxConn->ulRemoteIp >> 8 ) & 0xFFUL,
                                       ( pxConn->ulRemoteIp ) & 0xFFUL,
                                       pxConn->usRemotePort );

        if( !reportbuilderSNPRINTF_SUCCESS( lCharactersWritten, ulRemainingBufferLength ) )
        {
            eStatus = eReportBuilderBufferTooSmall;
            break;
        }
        else
        {
            ulRemainingBufferLength -= lCharactersWritten;
            pcCurrentWritePos += lCharactersWritten;
        }
    }

    if( eStatus == eReportBuilderSuccess )
    {
        /* Discard the last comma. */
        if( ulConnectionsArrayLength > 0 )
        {
            pcCurrentWritePos -= 1;
            ulRemainingBufferLength += 1;
        }

        /* Write the JSON array close marker. */
        if( ulRemainingBufferLength > 1 )
        {
            *pcCurrentWritePos = reportbuilderJSON_ARRAY_CLOSE_MARKER;
            ulRemainingBufferLength -= 1;
            pcCurrentWritePos += 1;
        }
        else
        {
            eStatus = eReportBuilderBufferTooSmall;
        }
    }

    if( eStatus == eReportBuilderSuccess )
    {
        *pulOutCharsWritten = ulBufferLength - ulRemainingBufferLength;
    }

    return eStatus;
}