blob: d4a64b507bfd399147d571432eccecb80c7508b7 [file] [log] [blame]
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. SPDX-License-Identifier: CC-BY-4.0
.. CAUTION: this document is generated from source in doc/src/rtd.
.. To make changes edit the source and recompile the document.
.. Do NOT make changes directly to .rst or .md files.
============================================================================================
Man Page: rmr_realloc_payload
============================================================================================
RMR Library Functions
============================================================================================
NAME
--------------------------------------------------------------------------------------------
rmr_realloc_payload
SYNOPSIS
--------------------------------------------------------------------------------------------
::
#include <rmr/rmr.h>
extern rmr_mbuf_t* rmr_realloc_payload( rmr_mbuf_t* msg, int new_len, int copy, int clone );
DESCRIPTION
--------------------------------------------------------------------------------------------
The rmr_realloc_payload function will return a pointer to an
RMR message buffer struct (rmr_mbuf_t) which has a payload
large enough to accomodate *new_len* bytes. If necessary, the
underlying payload is reallocated, and the bytes from the
original payload are copied if the *copy* parameter is true
(1). If the message passed in has a payload large enough,
there is no additional memory allocation and copying.
Cloning The Message Buffer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This function can also be used to generate a separate copy of
the original message, with the desired payload size, without
destroying the original message buffer or the original
payload. A standalone copy is made only when the *clone*
parameter is true (1). When cloning, the payload is copied to
the cloned message **only** if the *copy* parameter is true.
Message Buffer Metadata
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The metadata in the original message buffer (message type,
subscription ID, and payload length) will be preserved if the
*copy* parameter is true. When this parameter is not true
(0), then these values are set to the uninitialised value
(-1) for type and ID, and the length is set to 0.
RETURN VALUE
--------------------------------------------------------------------------------------------
The rmr_realloc_payload function returns a pointer to the
message buffer with the payload which is large enough to hold
*new_len* bytes. If the *clone* option is true, this will be
a pointer to the newly cloned message buffer; the original
message buffer pointer may still be used to reference that
message. It is the calling application's responsibility to
free the memory associateed with both messages using the
rmr_free_msg() function.
When the *clone* option is not used, it is still good
practice by the calling application to capture and use this
reference as it is possible that the message buffer, and not
just the payload buffer, was reallocated. In the event of an
error, a nil pointer will be returned and the value of
*errno* will be set to reflect the problem.
ERRORS
--------------------------------------------------------------------------------------------
These value of *errno* will reflect the error condition if a
nil pointer is returned:
ENOMEM
Memory allocation of the new payload failed.
EINVAL
The pointer passed in was nil, or refrenced an invalid
message, or the required length was not valid.
EXAMPLE
--------------------------------------------------------------------------------------------
The following code bit illustrates how this function can be
used to reallocate a buffer for a return to sender
acknowledgement message which is larger than the message
received.
::
if( rmr_payload_size( msg ) < ack_sz ) { // received message too small for ack
msg = rmr_realloc_payload( msg, ack_sz, 0, 0 ); // reallocate the message with a payload big enough
if( msg == NULL ) {
fprintf( stderr, "[ERR] realloc returned a nil pointer: %s\\n", strerror( errno ) );
} else {
// populate and send ack message
}
}
SEE ALSO
--------------------------------------------------------------------------------------------
rmr_alloc_msg(3), rmr_free_msg(3), rmr_init(3),
rmr_payload_size(3), rmr_send_msg(3), rmr_rcv_msg(3),
rmr_rcv_specific(3), rmr_rts_msg(3), rmr_ready(3),
rmr_fib(3), rmr_has_str(3), rmr_set_stimeout(3),
rmr_tokenise(3), rmr_mk_ring(3), rmr_ring_free(3)