]> git.ipfire.org Git - pakfire.git/commitdiff
xfer: Replace the send buffer with our own buffer implementation
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 16 Apr 2025 15:54:30 +0000 (15:54 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 16 Apr 2025 15:54:30 +0000 (15:54 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/buffer.c
src/pakfire/buffer.h
src/pakfire/xfer.c

index b59ee128234ab4b3e7e1f03be95101275ffd4495..7f32dcb3e9cc594b03ab392ff3bfc8f3f26ac32c 100644 (file)
@@ -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
index 20987936d17a3a87fb8c4c53625c67e812738662..b1f5473918802f3fa19b5fbdcc3064af22a77f7f 100644 (file)
@@ -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);
index 9f158fb3b68aae14bdfc4dcc3a397c2648206332..a3cb11f6b260c162b8ac40362168d14058c160c3 100644 (file)
@@ -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