in platform/posix/transport/src/plaintext_posix.c [181:242]
int32_t Plaintext_Send( NetworkContext_t * pNetworkContext,
const void * pBuffer,
size_t bytesToSend )
{
PlaintextParams_t * pPlaintextParams = NULL;
int32_t bytesSent = -1, pollStatus = -1;
struct pollfd pollFds;
assert( pNetworkContext != NULL && pNetworkContext->pParams != NULL );
assert( pBuffer != NULL );
assert( bytesToSend > 0 );
/* Get send timeout from the socket to use as the timeout for #select. */
pPlaintextParams = pNetworkContext->pParams;
/* Initialize the file descriptor. */
pollFds.events = POLLOUT;
pollFds.revents = 0;
/* Set the file descriptor for poll. */
pollFds.fd = pPlaintextParams->socketDescriptor;
/* Check if data can be written to the socket.
* Note: This is done to avoid blocking on send() when
* the socket is not ready to accept more data for network
* transmission (possibly due to a full TX buffer). */
pollStatus = poll( &pollFds, 1, 0 );
if( pollStatus > 0 )
{
/* The socket is available for sending data. */
bytesSent = ( int32_t ) send( pPlaintextParams->socketDescriptor,
pBuffer,
bytesToSend,
0 );
}
else if( pollStatus < 0 )
{
/* An error occurred while polling. */
bytesSent = -1;
}
else
{
/* Socket is not available for sending data. */
bytesSent = 0;
}
if( ( pollStatus > 0 ) && ( bytesSent == 0 ) )
{
/* Peer has closed the connection. Treat as an error. */
bytesSent = -1;
}
else if( bytesSent < 0 )
{
logTransportError( errno );
}
else
{
/* Empty else MISRA 15.7 */
}
return bytesSent;
}