]> git.ipfire.org Git - people/ms/pakfire.git/commitdiff
jail: Use the "fill buffer" function for logging, too
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 16 Dec 2023 13:24:45 +0000 (13:24 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 16 Dec 2023 13:24:45 +0000 (13:24 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/jail.c

index 45be6755ec437e226137dd172d1e9ae45de2c82b..1547ff9dc4e38dd67df3c8e9637d4119edcb1f3d 100644 (file)
@@ -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;