From b47e4c8192935e49fae165426d2a440de7402f5e Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Mon, 24 Mar 2025 19:38:31 +0000 Subject: [PATCH] jail: Move the filelist streaming helper from PTY Signed-off-by: Michael Tremer --- src/pakfire/build.c | 7 ++--- src/pakfire/jail.c | 67 +++++++++++++++++++++++++++++++++++++++++++++ src/pakfire/jail.h | 14 ++++++++++ src/pakfire/pty.c | 67 --------------------------------------------- src/pakfire/pty.h | 14 ---------- 5 files changed, 84 insertions(+), 85 deletions(-) diff --git a/src/pakfire/build.c b/src/pakfire/build.c index 56b5d993..b540122d 100644 --- a/src/pakfire/build.c +++ b/src/pakfire/build.c @@ -44,7 +44,6 @@ #include #include #include -#include #include #include #include @@ -820,19 +819,19 @@ static int pakfire_build_find_perl_deps(struct pakfire_build* build, if (r < 0) goto ERROR; - struct pakfire_pty_filelist input = { + struct pakfire_jail_filelist input = { .filelist = perlfiles, }; // Find provides r = pakfire_build_run_script(build, "perl.prov", args, - pakfire_pty_send_filelist, &input, pakfire_build_add_perl_provides, pkg); + pakfire_jail_send_filelist, &input, pakfire_build_add_perl_provides, pkg); if (r < 0) goto ERROR; // Find requires r = pakfire_build_run_script(build, "perl.req", args, - pakfire_pty_send_filelist, &input, pakfire_build_add_perl_requires, pkg); + pakfire_jail_send_filelist, &input, pakfire_build_add_perl_requires, pkg); if (r < 0) goto ERROR; diff --git a/src/pakfire/jail.c b/src/pakfire/jail.c index d91af07c..1a66065e 100644 --- a/src/pakfire/jail.c +++ b/src/pakfire/jail.c @@ -2288,3 +2288,70 @@ ssize_t pakfire_jail_send_buffer(struct pakfire_ctx* ctx, return length; } + +ssize_t pakfire_jail_send_filelist(struct pakfire_ctx* ctx, + void* data, char* buffer, size_t length) { + struct pakfire_jail_filelist* input = data; + struct pakfire_file* file = NULL; + int r; + + // If there is any path data left, we send that first + if (input->p) { + // How much data do we have left? + size_t l = strlen(input->p); + + // Cap the length of the buffer + if (l < length) + length = l; + + memcpy(buffer, input->p, length); + + // If we could not send all data, we will move the pointer forward + if (l > length) + input->p += length; + + // If we have sent all data, we reset the pointer + else if (l == length) + input->p = NULL; + + return length; + } + + // Read the next file + file = pakfire_filelist_get(input->filelist, input->i++); + + // If we could not fetch a file, we have reached the end of the list + if (!file) { + // Reset the counter so we can run again + input->i = 0; + + return 0; + } + + // Fetch the path + const char* path = pakfire_file_get_path(file); + if (!path) { + r = -EINVAL; + goto ERROR; + } + + // Copy the path to the buffer + r = pakfire_string_format(input->buffer, "%s\n", path); + if (r < 0) + goto ERROR; + + // Set the pointer to the start + input->p = input->buffer; + + // Free the file + pakfire_file_unref(file); + + // Send the buffer + return pakfire_jail_send_filelist(ctx, input, buffer, length); + +ERROR: + if (file) + pakfire_file_unref(file); + + return r; +} diff --git a/src/pakfire/jail.h b/src/pakfire/jail.h index 2e2223c2..7e6ace2c 100644 --- a/src/pakfire/jail.h +++ b/src/pakfire/jail.h @@ -105,4 +105,18 @@ struct pakfire_input_buffer { ssize_t pakfire_jail_send_buffer(struct pakfire_ctx* ctx, void* data, char* buffer, size_t length); +// Stream a filelist + +struct pakfire_jail_filelist { + struct pakfire_filelist* filelist; + size_t i; + + // Buffer for the path + char buffer[PATH_MAX]; + const char* p; +}; + +ssize_t pakfire_jail_send_filelist(struct pakfire_ctx* ctx, + void* data, char* buffer, size_t length); + #endif /* PAKFIRE_JAIL_H */ diff --git a/src/pakfire/pty.c b/src/pakfire/pty.c index f35d2f6c..7f49f874 100644 --- a/src/pakfire/pty.c +++ b/src/pakfire/pty.c @@ -1206,70 +1206,3 @@ int pakfire_pty_open(struct pakfire_pty* pty) { return 0; } - -ssize_t pakfire_pty_send_filelist(struct pakfire_ctx* ctx, - void* data, char* buffer, size_t length) { - struct pakfire_pty_filelist* input = data; - struct pakfire_file* file = NULL; - int r; - - // If there is any path data left, we send that first - if (input->p) { - // How much data do we have left? - size_t l = strlen(input->p); - - // Cap the length of the buffer - if (l < length) - length = l; - - memcpy(buffer, input->p, length); - - // If we could not send all data, we will move the pointer forward - if (l > length) - input->p += length; - - // If we have sent all data, we reset the pointer - else if (l == length) - input->p = NULL; - - return length; - } - - // Read the next file - file = pakfire_filelist_get(input->filelist, input->i++); - - // If we could not fetch a file, we have reached the end of the list - if (!file) { - // Reset the counter so we can run again - input->i = 0; - - return 0; - } - - // Fetch the path - const char* path = pakfire_file_get_path(file); - if (!path) { - r = -EINVAL; - goto ERROR; - } - - // Copy the path to the buffer - r = pakfire_string_format(input->buffer, "%s\n", path); - if (r < 0) - goto ERROR; - - // Set the pointer to the start - input->p = input->buffer; - - // Free the file - pakfire_file_unref(file); - - // Send the buffer - return pakfire_pty_send_filelist(ctx, input, buffer, length); - -ERROR: - if (file) - pakfire_file_unref(file); - - return r; -} diff --git a/src/pakfire/pty.h b/src/pakfire/pty.h index 50b24675..6abde736 100644 --- a/src/pakfire/pty.h +++ b/src/pakfire/pty.h @@ -37,18 +37,4 @@ struct pakfire_pty* pakfire_pty_unref(struct pakfire_pty* pty); int pakfire_pty_open(struct pakfire_pty* pty); -// Stream a filelist - -struct pakfire_pty_filelist { - struct pakfire_filelist* filelist; - size_t i; - - // Buffer for the path - char buffer[PATH_MAX]; - const char* p; -}; - -ssize_t pakfire_pty_send_filelist(struct pakfire_ctx* ctx, - void* data, char* buffer, size_t length); - #endif /* PAKFIRE_PTY_H */ -- 2.39.5