diff --git a/libs/freetdm/src/include/zap_buffer.h b/libs/freetdm/src/include/zap_buffer.h index cd16825787..eaa71524f9 100644 --- a/libs/freetdm/src/include/zap_buffer.h +++ b/libs/freetdm/src/include/zap_buffer.h @@ -124,6 +124,7 @@ void zap_buffer_destroy(zap_buffer_t **buffer); /** @} */ +zap_size_t zap_buffer_zwrite(zap_buffer_t *buffer, const void *data, zap_size_t datalen); #endif /* For Emacs: diff --git a/libs/freetdm/src/zap_buffer.c b/libs/freetdm/src/zap_buffer.c index 1db918665d..9cfb354ad4 100644 --- a/libs/freetdm/src/zap_buffer.c +++ b/libs/freetdm/src/zap_buffer.c @@ -187,8 +187,7 @@ zap_size_t zap_buffer_write(zap_buffer_t *buffer, const void *data, zap_size_t d } actual_freespace = buffer->datalen - buffer->actually_used; - - if (actual_freespace < datalen) { + if (actual_freespace < datalen && (!buffer->max_len || (buffer->datalen + datalen <= buffer->max_len))) { memmove(buffer->data, buffer->head, buffer->used); buffer->head = buffer->data; buffer->actually_used = buffer->used; @@ -246,6 +245,18 @@ void zap_buffer_zero(zap_buffer_t *buffer) buffer->head = buffer->data; } +zap_size_t zap_buffer_zwrite(zap_buffer_t *buffer, const void *data, zap_size_t datalen) +{ + zap_size_t w; + + if (!(w = zap_buffer_write(buffer, data, datalen))) { + zap_buffer_zero(buffer); + return zap_buffer_write(buffer, data, datalen); + } + + return w; +} + void zap_buffer_destroy(zap_buffer_t **buffer) { if (*buffer) {