From 0b63dd12ee2d55585b403decd91adf8e4bb0cfd9 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 25 Jul 2024 10:42:31 +0900 Subject: [PATCH] Impl. being able to set dir for temporary files --- src/archiver.c | 22 ++++++++++++++-------- src/parser.c | 6 ++++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/archiver.c b/src/archiver.c index 36a59bc..07d38f4 100644 --- a/src/archiver.c +++ b/src/archiver.c @@ -39,7 +39,7 @@ #include "helpers.h" -#define TEMP_FILENAME_CMP "simple_archiver_compressed_%u.tmp" +#define TEMP_FILENAME_CMP "%s%ssimple_archiver_compressed_%u.tmp" #if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \ SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \ @@ -168,15 +168,21 @@ int write_files_fn(void *data, void *ud) { SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \ SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX // Use temp file to store compressed data. - char temp_filename[128]; + char temp_filename[512]; unsigned int idx = 0; - snprintf(temp_filename, 128, TEMP_FILENAME_CMP, idx); + unsigned int temp_dir_end = strlen(state->parsed->temp_dir); + snprintf(temp_filename, 512, TEMP_FILENAME_CMP, state->parsed->temp_dir, + state->parsed->temp_dir[temp_dir_end - 1] == '/' ? "" : "/", + idx); do { FILE *test_fd = fopen(temp_filename, "rb"); if (test_fd) { // File exists. fclose(test_fd); - snprintf(temp_filename, 128, TEMP_FILENAME_CMP, ++idx); + snprintf(temp_filename, 512, TEMP_FILENAME_CMP, + state->parsed->temp_dir, + state->parsed->temp_dir[temp_dir_end - 1] == '/' ? "" : "/", + ++idx); } else if (idx > 0xFFFF) { // Sanity check. return 1; @@ -192,14 +198,14 @@ int write_files_fn(void *data, void *ud) { } __attribute__((cleanup(free_FILE_helper))) FILE *tmp_fd = fopen(temp_filename, "wb"); + if (!tmp_fd) { + fprintf(stderr, "ERROR: Unable to create temp file for compressing!\n"); + return 1; + } __attribute__((cleanup(cleanup_temp_filename_delete))) void **ptrs_array = malloc(sizeof(void *) * 2); ptrs_array[0] = temp_filename; ptrs_array[1] = &tmp_fd; - if (!tmp_fd) { - // Unable to create temp file. - return 1; - } // Handle SIGPIPE. signal(SIGPIPE, handle_sig_pipe); diff --git a/src/parser.c b/src/parser.c index 747e1ae..b18b5e7 100644 --- a/src/parser.c +++ b/src/parser.c @@ -174,6 +174,7 @@ SDArchiverParsed simple_archiver_create_parsed(void) { parsed.compressor = NULL; parsed.decompressor = NULL; parsed.working_files = NULL; + parsed.temp_dir = NULL; return parsed; } @@ -202,6 +203,7 @@ int simple_archiver_parse_args(int argc, const char **argv, while (argc > 0) { if (!is_remaining_args) { if (strcmp(argv[0], "-h") == 0 || strcmp(argv[0], "--help") == 0) { + simple_archiver_free_parsed(out); simple_archiver_print_usage(); exit(0); } else if (strcmp(argv[0], "-c") == 0) { @@ -319,6 +321,10 @@ int simple_archiver_parse_args(int argc, const char **argv, ++argv; } + if (!out->temp_dir) { + out->temp_dir = "./"; + } + return 0; }