#include <pakfire/ctx.h>
#include <pakfire/daemon.h>
#include <pakfire/job.h>
+#include <pakfire/log_buffer.h>
#include <pakfire/logging.h>
#include <pakfire/string.h>
#include <pakfire/util.h>
-#define MAX_LINES 256
-
struct log {
FILE* f;
int fds[2];
sd_event_source* event;
-
- // Buffer any read lines
- char* lines[MAX_LINES];
- unsigned int num_lines;
};
struct pakfire_job {
struct {
struct log stdout;
struct log stderr;
+
+ struct pakfire_log_buffer* buffer;
} log;
// Events for reading logs from the child process
static void pakfire_job_free(struct pakfire_job* job) {
// Logging
+ if (job->log.buffer)
+ pakfire_log_buffer_unref(job->log.buffer);
if (job->log.stdout.event)
sd_event_source_unref(job->log.stdout.event);
if (job->log.stderr.event)
static int __pakfire_job_log_forward(struct pakfire_job* job, int priority, uint32_t events, struct log* log) {
char* line = NULL;
+ ssize_t length = 0;
size_t l = 0;
int r;
// Read all lines
if (events & EPOLLIN) {
for (;;) {
- r = getline(&line, &l, log->f);
- if (r < 0)
+ length = getline(&line, &l, log->f);
+ if (length < 0)
break;
- // XXX TODO
- printf("LINE %s\n", line);
+ // Enqueue the line in the log buffer
+ r = pakfire_log_buffer_enqueue(job->log.buffer, priority, line, length);
+ if (r < 0) {
+ switch (-r) {
+ case ENOSPC:
+ CTX_DEBUG(job->ctx, "Log buffer is full\n");
+ break;
+
+ default:
+ CTX_ERROR(job->ctx, "Could not enqueue to the log buffer: %s\n", strerror(-r));
+ return r;
+ }
+ }
}
}
// Initialize the PID file descriptor
j->pidfd = -1;
+ // Allocate the log buffer
+ r = pakfire_log_buffer_create(&j->log.buffer, j->ctx, 1024);
+ if (r < 0)
+ goto ERROR;
+
// Setup the log pipe
j->log.stdout.fds[0] = -1;
j->log.stdout.fds[1] = -1;