From: Michael Tremer Date: Sat, 16 Dec 2023 13:24:45 +0000 (+0000) Subject: jail: Use the "fill buffer" function for logging, too X-Git-Url: http://git.ipfire.org/?p=people%2Fms%2Fpakfire.git;a=commitdiff_plain;h=bb1a7acd3c7155a2ddac8fb96d5e636919ceee2a jail: Use the "fill buffer" function for logging, too Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/jail.c b/src/libpakfire/jail.c index 45be6755..1547ff9d 100644 --- a/src/libpakfire/jail.c +++ b/src/libpakfire/jail.c @@ -595,6 +595,70 @@ static int pakfire_jail_log_buffer_is_full(const struct pakfire_log_buffer* buff return (sizeof(buffer->data) == buffer->used); } +static int pakfire_jail_fill_buffer(struct pakfire_jail* jail, int fd, struct pakfire_log_buffer* buffer) { + int r; + + // Skip this if there is not space left in the buffer + if (buffer->used >= sizeof(buffer->data)) + return 0; + + // Fill the buffer + r = read(fd, buffer->data + buffer->used, sizeof(buffer->data) - buffer->used); + + // Handle errors + if (r < 0) { + switch (errno) { + case EAGAIN: + case EIO: + break; + + default: + return -errno; + } + + // EOF + } else if (r == 0) { + // XXX What to do here? + + // Successful read + } else { + buffer->used += r; + } + + return 0; +} + +static int pakfire_jail_drain_buffer(struct pakfire_jail* jail, int fd, struct pakfire_log_buffer* buffer) { + int r; + + // Nothing to do if the buffer is empty + if (!buffer->used) + return 0; + + // Drain the buffer + r = write(fd, buffer->data, buffer->used); + + // Handle errors + if (r < 0) { + switch (errno) { + case EAGAIN: + case EIO: + break; + + default: + return -errno; + } + + // Successful write + } else { + memmove(buffer->data, buffer->data + r, buffer->used - r); + + buffer->used -= r; + } + + return 0; +} + /* This function reads as much data as it can from the file descriptor. If it finds a whole line in it, it will send it to the logger and repeat the process. @@ -604,21 +668,12 @@ static int pakfire_jail_handle_log(struct pakfire_jail* jail, struct pakfire_jail_exec* ctx, int priority, int fd, struct pakfire_log_buffer* buffer, pakfire_jail_communicate_out callback, void* data) { char line[BUFFER_SIZE + 1]; + int r; // Fill up buffer from fd - if (buffer->used < sizeof(buffer->data)) { - ssize_t bytes_read = read(fd, buffer->data + buffer->used, - sizeof(buffer->data) - buffer->used); - - // Handle errors - if (bytes_read < 0) { - ERROR(jail->pakfire, "Could not read from fd %d: %m\n", fd); - return -1; - } - - // Update buffer size - buffer->used += bytes_read; - } + r = pakfire_jail_fill_buffer(jail, fd, buffer); + if (r) + return r; // See if we have any lines that we can write while (buffer->used) { @@ -650,7 +705,7 @@ static int pakfire_jail_handle_log(struct pakfire_jail* jail, // Log the line if (callback) { - int r = callback(jail->pakfire, data, priority, line, length); + r = callback(jail->pakfire, data, priority, line, length); if (r) { ERROR(jail->pakfire, "The logging callback returned an error: %d\n", r); return r; @@ -991,70 +1046,6 @@ static int pakfire_jail_setup_pty_forwarding(struct pakfire_jail* jail, return 0; } -static int pakfire_jail_fill_buffer(struct pakfire_jail* jail, int fd, struct pakfire_log_buffer* buffer) { - int r; - - // Skip this if there is not space left in the buffer - if (buffer->used >= sizeof(buffer->data)) - return 0; - - // Fill the buffer - r = read(fd, buffer->data + buffer->used, sizeof(buffer->data) - buffer->used); - - // Handle errors - if (r < 0) { - switch (errno) { - case EAGAIN: - case EIO: - break; - - default: - return -errno; - } - - // EOF - } else if (r == 0) { - // XXX What to do here? - - // Successful read - } else { - buffer->used += r; - } - - return 0; -} - -static int pakfire_jail_drain_buffer(struct pakfire_jail* jail, int fd, struct pakfire_log_buffer* buffer) { - int r; - - // Nothing to do if the buffer is empty - if (!buffer->used) - return 0; - - // Drain the buffer - r = write(fd, buffer->data, buffer->used); - - // Handle errors - if (r < 0) { - switch (errno) { - case EAGAIN: - case EIO: - break; - - default: - return -errno; - } - - // Successful write - } else { - memmove(buffer->data, buffer->data + r, buffer->used - r); - - buffer->used -= r; - } - - return 0; -} - static int pakfire_jail_forward_pty(struct pakfire_jail* jail, struct pakfire_jail_exec* ctx) { int r;