]> git.ipfire.org Git - pakfire.git/commitdiff
jail: Refactor pakfire_jail_exec_script
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 6 Dec 2022 16:07:10 +0000 (16:07 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 6 Dec 2022 16:07:10 +0000 (16:07 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/jail.c

index 9ec387d395bb7f6ee76c15cdc4420ad105f28e1a..ba9a10059535d9371079aa2d320ef08a1539a868 100644 (file)
@@ -1577,48 +1577,41 @@ PAKFIRE_EXPORT int pakfire_jail_exec_script(struct pakfire_jail* jail,
                const char* script, const size_t size, const char* args[], char** output) {
        char path[PATH_MAX];
        const char** argv = NULL;
+       FILE* f = NULL;
        int r;
 
        const char* root = pakfire_get_path(jail->pakfire);
 
        // Write the scriptlet to disk
-       r = pakfire_path_join(path, root, "pakfire-script.XXXXXX");
+       r = pakfire_path_join(path, root, PAKFIRE_TMP_DIR "/pakfire-script.XXXXXX");
        if (r)
                goto ERROR;
 
-       // Open a temporary file
-       int fd = mkstemp(path);
-       if (fd < 0) {
-               ERROR(jail->pakfire, "Could not open a temporary file: %m\n");
-               r = 1;
+       // Create a temporary file
+       f = pakfire_mktemp(path, 0700);
+       if (!f) {
+               ERROR(jail->pakfire, "Could not create temporary file: %m\n");
                goto ERROR;
        }
 
        DEBUG(jail->pakfire, "Writing script to %s:\n%.*s\n", path, (int)size, script);
 
        // Write data
-       ssize_t bytes_written = write(fd, script, size);
-       if (bytes_written < (ssize_t)size) {
+       r = fprintf(f, "%s", script);
+       if (r < 0) {
                ERROR(jail->pakfire, "Could not write script to file %s: %m\n", path);
-               r = 1;
-               goto ERROR;
-       }
-
-       // Make the script executable
-       r = fchmod(fd, S_IRUSR|S_IWUSR|S_IXUSR);
-       if (r) {
-               ERROR(jail->pakfire, "Could not set executable permissions on %s: %m\n", path);
                goto ERROR;
        }
 
        // Close file
-       r = close(fd);
+       r = fclose(f);
        if (r) {
                ERROR(jail->pakfire, "Could not close script file %s: %m\n", path);
-               r = 1;
                goto ERROR;
        }
 
+       f = NULL;
+
        // Count how many arguments were passed
        unsigned int argc = 1;
        if (args) {
@@ -1645,6 +1638,8 @@ PAKFIRE_EXPORT int pakfire_jail_exec_script(struct pakfire_jail* jail,
 ERROR:
        if (argv)
                free(argv);
+       if (f)
+               fclose(f);
 
        // Remove script from disk
        if (*path)