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;
+}
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);
}