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.
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) {
// 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;
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;