]> git.ipfire.org Git - pakfire.git/commitdiff
buffer: Add a helper function that fills a buffer with a callback
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 24 Mar 2025 18:39:36 +0000 (18:39 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 24 Mar 2025 18:39:36 +0000 (18:39 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/buffer.c
src/pakfire/buffer.h

index caeb24cd4cdabb8b78bc9dcc70f9c4b7d5010eaa..b59ee128234ab4b3e7e1f03be95101275ffd4495 100644 (file)
@@ -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;
 
index 97a521a19bbdfa9e06b7f2e83559c104b4874d89..20987936d17a3a87fb8c4c53625c67e812738662 100644 (file)
 #ifndef PAKFIRE_BUFFER_H
 #define PAKFIRE_BUFFER_H
 
+#include <pakfire/ctx.h>
+
+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 */