From a2bc14823fd84024285f04aaa18862ff76ea035e Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 22 Mar 2025 15:51:37 +0000 Subject: [PATCH] log stream: Add an experimental implementation to stream from PTY This is the first step to split all the complicated line buffering from the PTY code. Signed-off-by: Michael Tremer --- src/pakfire/log_stream.c | 27 +++++++++++++++++++++++++++ src/pakfire/log_stream.h | 2 ++ tests/libpakfire/log_stream.c | 27 +++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/src/pakfire/log_stream.c b/src/pakfire/log_stream.c index bbb8a5ad..a266e250 100644 --- a/src/pakfire/log_stream.c +++ b/src/pakfire/log_stream.c @@ -404,3 +404,30 @@ int pakfire_log_stream_close(struct pakfire_log_stream* stream) { return 0; } + +int pakfire_log_stream_pty(struct pakfire_ctx* ctx, void* data, const char* buffer, size_t length) { + struct pakfire_log_stream* self = data; + int r; + + size_t free_space = sizeof(self->buffer) - self->buffered; + + // Ask to be called again if we don't have any free space + if (free_space == 0) + return -EAGAIN; + + // Limit to the total buffer size + if (free_space < length) + length = free_space; + + // Copy the data into the buffer + memcpy(self->buffer + self->buffered, buffer, length); + self->buffered += length; + + // Drain the buffer + r = pakfire_log_stream_drain_buffer(self); + if (r < 0) + return r; + + // Return how many bytes we have consumed + return length; +} diff --git a/src/pakfire/log_stream.h b/src/pakfire/log_stream.h index a8bf1521..f660956c 100644 --- a/src/pakfire/log_stream.h +++ b/src/pakfire/log_stream.h @@ -49,4 +49,6 @@ int pakfire_log_stream_write(struct pakfire_log_stream* stream, int pakfire_log_stream_close(struct pakfire_log_stream* stream); +int pakfire_log_stream_pty(struct pakfire_ctx* ctx, void* data, const char* buffer, size_t length); + #endif /* PAKFIRE_LOG_STREAM_H */ diff --git a/tests/libpakfire/log_stream.c b/tests/libpakfire/log_stream.c index 38a804de..022cd29f 100644 --- a/tests/libpakfire/log_stream.c +++ b/tests/libpakfire/log_stream.c @@ -109,10 +109,37 @@ FAIL: return r; } +static int test_pty(const struct test* t) { + struct pakfire_log_stream* stream = NULL; + int r = EXIT_FAILURE; + int lines_read = 0; + + ASSERT_SUCCESS(pakfire_log_stream_create(&stream, t->ctx, log_callback, &lines_read)); + + // Write some individual parts and await until the streamer has found a line + ASSERT(pakfire_log_stream_pty(t->ctx, stream, "A", strlen("A")) == 1); + ASSERT_EQUALS(lines_read, 0); + ASSERT(pakfire_log_stream_pty(t->ctx, stream, "B", strlen("B")) == 1); + ASSERT_EQUALS(lines_read, 0); + ASSERT(pakfire_log_stream_pty(t->ctx, stream, "C", strlen("C")) == 1); + ASSERT_EQUALS(lines_read, 0); + ASSERT(pakfire_log_stream_pty(t->ctx, stream, "\n", strlen("\n")) == 1); + ASSERT_EQUALS(lines_read, 1); + + // Everything passed + r = EXIT_SUCCESS; + +FAIL: + if (stream) + pakfire_log_stream_unref(stream); + + return r; +} int main(int argc, const char* argv[]) { testsuite_add_test(test_simple, 0); testsuite_add_test(test_fork, 0); + testsuite_add_test(test_pty, 0); return testsuite_run(argc, argv); } -- 2.39.5