void silc_buffer_free(SilcBuffer sb)
{
if (sb) {
-#ifdef SILC_DEBUG
- memset(sb->head, 'F', sb->truelen);
+#if defined(SILC_DEBUG)
+ if (sb->head)
+ memset(sb->head, 'F', sb->truelen);
#endif
silc_free(sb->head);
silc_free(sb);
}
}
+/****f* silcutil/SilcBufferAPI/silc_buffer_steal
+ *
+ * SYNOPSIS
+ *
+ * static inline
+ * unsigned char *silc_buffer_steal(SilcBuffer sb, SilcUInt32 *data_len);
+ *
+ * DESCRIPTION
+ *
+ * Steals the data from the buffer `sb'. This returns pointer to the
+ * start of the buffer and the true length of that buffer. The `sb'
+ * cannot be used anymore after calling this function because the
+ * data buffer was stolen. The `sb' must be freed with silc_buffer_free.
+ * The caller is responsible of freeing the stolen data buffer with
+ * silc_free.
+ *
+ ***/
+
+static inline
+unsigned char *silc_buffer_steal(SilcBuffer sb, SilcUInt32 *data_len)
+{
+ unsigned char *buf = sb->head;
+ if (data_len)
+ *data_len = sb->truelen;
+ sb->head = sb->data = sb->tail = sb->end = NULL;
+ sb->len = sb->truelen = 0;
+ return buf;
+}
+
/****f* silcutil/SilcBufferAPI/silc_buffer_set
*
* SYNOPSIS
{
unsigned char *old_data = sb->data;
-#ifdef SILC_DEBUG
+#if defined(SILC_DEBUG)
assert(len <= (SilcUInt32)(sb->tail - sb->data));
#endif
{
unsigned char *old_data = sb->data;
-#ifdef SILC_DEBUG
+#if defined(SILC_DEBUG)
assert((sb->data - len) >= sb->head);
#endif
{
unsigned char *old_tail = sb->tail;
-#ifdef SILC_DEBUG
+#if defined(SILC_DEBUG)
assert((SilcUInt32)(sb->end - sb->tail) >= len);
#endif
{
unsigned char *old_tail = sb->tail;
-#ifdef SILC_DEBUG
+#if defined(SILC_DEBUG)
assert((sb->tail - len) >= sb->data);
#endif
const unsigned char *data,
SilcUInt32 len)
{
-#ifdef SILC_DEBUG
+#if defined(SILC_DEBUG)
assert((SilcUInt32)(sb->data - sb->head) >= len);
#endif
return (unsigned char *)memcpy(sb->head, data, len);
const unsigned char *data,
SilcUInt32 len)
{
-#ifdef SILC_DEBUG
+#if defined(SILC_DEBUG)
assert((SilcUInt32)(sb->tail - sb->data) >= len);
#endif
return (unsigned char *)memcpy(sb->data, data, len);
const unsigned char *data,
SilcUInt32 len)
{
-#ifdef SILC_DEBUG
+#if defined(SILC_DEBUG)
assert((SilcUInt32)(sb->end - sb->tail) >= len);
#endif
return (unsigned char *)memcpy(sb->tail, data, len);
static inline
void silc_buffer_clear(SilcBuffer sb)
{
+ if (!sb)
+ return;
memset(sb->head, 0, sb->truelen);
sb->data = sb->head;
sb->tail = sb->head;