#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 || \
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;
}
__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);
parsed.compressor = NULL;
parsed.decompressor = NULL;
parsed.working_files = NULL;
+ parsed.temp_dir = NULL;
return parsed;
}
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) {
++argv;
}
+ if (!out->temp_dir) {
+ out->temp_dir = "./";
+ }
+
return 0;
}