]> git.ipfire.org Git - pakfire.git/commitdiff
log stream: Add an experimental implementation to stream from PTY
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 22 Mar 2025 15:51:37 +0000 (15:51 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 22 Mar 2025 15:51:37 +0000 (15:51 +0000)
This is the first step to split all the complicated line buffering from
the PTY code.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/log_stream.c
src/pakfire/log_stream.h
tests/libpakfire/log_stream.c

index bbb8a5ad64d22299b102ef7b3b46531d755072eb..a266e250186e73301219c78548d38c6c530dae5c 100644 (file)
@@ -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;
+}
index a8bf152102dfd28c8e9afb8bb91a6bdaa59e21fb..f660956c55293d543a99bee60aee3b77cc700835 100644 (file)
@@ -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 */
index 38a804dee96de3b745904a49f4e049748059eebc..022cd29fae622a3ff6f35186041ef7ad090c662f 100644 (file)
@@ -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);
 }