From: Michael Tremer Date: Wed, 16 Apr 2025 15:54:30 +0000 (+0000) Subject: xfer: Replace the send buffer with our own buffer implementation X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=191e4fa4026d8fcc44baaa131daf323f6a80a80a;p=pakfire.git xfer: Replace the send buffer with our own buffer implementation Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/buffer.c b/src/pakfire/buffer.c index b59ee128..7f32dcb3 100644 --- a/src/pakfire/buffer.c +++ b/src/pakfire/buffer.c @@ -50,9 +50,15 @@ int pakfire_buffer_is_full(struct pakfire_buffer* self) { return (self->used >= self->max_length); } +void pakfire_buffer_clear(struct pakfire_buffer* buffer) { + buffer->used = 0; +} + void pakfire_buffer_free(struct pakfire_buffer* buffer) { if (buffer->data) free(buffer->data); + + pakfire_buffer_clear(buffer); } // Rounds up length to the nearest chunk size diff --git a/src/pakfire/buffer.h b/src/pakfire/buffer.h index 20987936..b1f54739 100644 --- a/src/pakfire/buffer.h +++ b/src/pakfire/buffer.h @@ -43,6 +43,7 @@ size_t pakfire_buffer_length(struct pakfire_buffer* self); int pakfire_buffer_is_empty(struct pakfire_buffer* self); int pakfire_buffer_is_full(struct pakfire_buffer* self); +void pakfire_buffer_clear(struct pakfire_buffer* buffer); void pakfire_buffer_free(struct pakfire_buffer* buffer); int pakfire_buffer_push(struct pakfire_buffer* self, const char* data, size_t length); diff --git a/src/pakfire/xfer.c b/src/pakfire/xfer.c index 9f158fb3..a3cb11f6 100644 --- a/src/pakfire/xfer.c +++ b/src/pakfire/xfer.c @@ -120,10 +120,7 @@ struct pakfire_xfer { struct pakfire_buffer recv_buffer; // WebSocket Send Buffer - struct pakfire_send_buffer { - char* data; - size_t length; - } send_buffer; + struct pakfire_buffer send_buffer; // State enum pakfire_xfer_state { @@ -144,10 +141,9 @@ static void pakfire_xfer_free(struct pakfire_xfer* xfer) { if (xfer->event) sd_event_source_unref(xfer->event); - // Receive Buffer + // Send/Receive Buffers + pakfire_buffer_free(&xfer->send_buffer); pakfire_buffer_free(&xfer->recv_buffer); - if (xfer->send_buffer.data) - free(xfer->send_buffer.data); // Query Arguments if (xfer->queries) @@ -985,10 +981,13 @@ static int pakfire_xfer_socket_send(struct pakfire_xfer* self) { self->state |= PAKFIRE_XFER_READY_TO_SEND; // Finish sending any partially sent messages - if (self->send_buffer.data) { + if (!pakfire_buffer_is_empty(&self->send_buffer)) { r = pakfire_xfer_send_message(self, self->send_buffer.data, self->send_buffer.length); if (r < 0) return r; + + // Free the message as it has been sent + pakfire_buffer_free(&self->send_buffer); } // Just call the callback (if there is one) @@ -1640,22 +1639,6 @@ int pakfire_xfer_socket(struct pakfire_xfer* xfer, pakfire_xfer_open_callback op return 0; } -static int pakfire_xfer_store_message(struct pakfire_xfer* self, - const char* message, const size_t length) { - // Resize the buffer - self->send_buffer.data = pakfire_realloc(self->send_buffer.data, length); - if (!self->send_buffer.data) { - ERROR(self->ctx, "Failed to allocate memory: %m\n"); - return -errno; - } - - // Store the message - memcpy(self->send_buffer.data, message, length); - self->send_buffer.length = length; - - return 0; -} - /* This function sends a WebSocket message */ @@ -1685,7 +1668,7 @@ static int __pakfire_xfer_send_message(struct pakfire_xfer* xfer, xfer->state &= ~PAKFIRE_XFER_READY_TO_SEND; // Store the message - r = pakfire_xfer_store_message(xfer, message + offset, length - offset); + r = pakfire_buffer_push(&xfer->send_buffer, message + offset, length - offset); if (r < 0) return r; @@ -1705,14 +1688,15 @@ int pakfire_xfer_send_message(struct pakfire_xfer* self, int r; // Send any left over fragments from a previous message before sending a new one - if (self->send_buffer.length) { + if (!pakfire_buffer_is_empty(&self->send_buffer)) { r = __pakfire_xfer_send_message(self, self->send_buffer.data, self->send_buffer.length); if (r < 0) { ERROR(self->ctx, "Failed to send previous fragment: %s\n", strerror(-r)); return r; } - self->send_buffer.length = 0; + // Free the message as it has been sent + pakfire_buffer_clear(&self->send_buffer); } // Send the actual message