From 03912690d8108362c8af653d4bddafb30a552a5b Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Mon, 24 Mar 2025 18:39:36 +0000 Subject: [PATCH] buffer: Add a helper function that fills a buffer with a callback Signed-off-by: Michael Tremer --- src/pakfire/buffer.c | 29 +++++++++++++++++++++++++++++ src/pakfire/buffer.h | 8 ++++++++ 2 files changed, 37 insertions(+) diff --git a/src/pakfire/buffer.c b/src/pakfire/buffer.c index caeb24cd..b59ee128 100644 --- a/src/pakfire/buffer.c +++ b/src/pakfire/buffer.c @@ -199,6 +199,35 @@ int pakfire_buffer_write(struct pakfire_buffer* self, int fd) { return bytes_written; } +int pakfire_buffer_fill(struct pakfire_buffer* self, + struct pakfire_ctx* ctx, pakfire_buffer_input_callback callback, void* data) { + ssize_t bytes_written = 0; + int r; + + // This is not supported if there is no maximum length + if (!self->max_length) + return -ENOTSUP; + + // Nothing to do if the buffer is full + if (pakfire_buffer_is_full(self)) + return 0; + + // Grow the buffer to its maximum length + r = pakfire_buffer_resize(self, self->max_length); + if (r < 0) + return r; + + // Call the callback + bytes_written = callback(ctx, data, self->data + self->used, self->length - self->used); + if (bytes_written < 0) + return bytes_written; + + // Update the used space + self->used += bytes_written; + + return bytes_written; +} + size_t pakfire_buffer_find_line(struct pakfire_buffer* self) { char* p = NULL; diff --git a/src/pakfire/buffer.h b/src/pakfire/buffer.h index 97a521a1..20987936 100644 --- a/src/pakfire/buffer.h +++ b/src/pakfire/buffer.h @@ -21,6 +21,11 @@ #ifndef PAKFIRE_BUFFER_H #define PAKFIRE_BUFFER_H +#include + +typedef ssize_t (*pakfire_buffer_input_callback) + (struct pakfire_ctx* ctx, void* data, char* buffer, size_t length); + struct pakfire_buffer { char* data; size_t length; @@ -46,6 +51,9 @@ int pakfire_buffer_pop(struct pakfire_buffer* self, size_t length); int pakfire_buffer_read(struct pakfire_buffer* self, int fd); int pakfire_buffer_write(struct pakfire_buffer* self, int fd); +int pakfire_buffer_fill(struct pakfire_buffer* self, + struct pakfire_ctx* ctx, pakfire_buffer_input_callback callback, void* data); + size_t pakfire_buffer_find_line(struct pakfire_buffer* self); #endif /* PAKFIRE_BUFFER_H */ -- 2.39.5