Cleanup/refactorings
All checks were successful
Run Unit Tests / build-and-run-unit-tests (push) Successful in 5s
All checks were successful
Run Unit Tests / build-and-run-unit-tests (push) Successful in 5s
Moved common functions to helpers.h, and similar cleanup/refactorings.
This commit is contained in:
parent
c30f2f3fd2
commit
4f0fdfa602
4 changed files with 109 additions and 93 deletions
127
src/archiver.c
127
src/archiver.c
|
@ -60,20 +60,6 @@ typedef struct SDArchiverInternalToWrite {
|
||||||
uint64_t size;
|
uint64_t size;
|
||||||
} SDArchiverInternalToWrite;
|
} SDArchiverInternalToWrite;
|
||||||
|
|
||||||
void free_FILE_helper(FILE **fd) {
|
|
||||||
if (fd && *fd) {
|
|
||||||
fclose(*fd);
|
|
||||||
*fd = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_malloced_memory(void **data) {
|
|
||||||
if (data && *data) {
|
|
||||||
free(*data);
|
|
||||||
*data = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_internal_to_write(void *data) {
|
void free_internal_to_write(void *data) {
|
||||||
SDArchiverInternalToWrite *to_write = data;
|
SDArchiverInternalToWrite *to_write = data;
|
||||||
free(to_write->buf);
|
free(to_write->buf);
|
||||||
|
@ -94,7 +80,7 @@ void cleanup_temp_filename_delete(void ***ptrs_array) {
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
||||||
if (ptrs_array && *ptrs_array) {
|
if (ptrs_array && *ptrs_array) {
|
||||||
if ((*ptrs_array)[1]) {
|
if ((*ptrs_array)[1]) {
|
||||||
free_FILE_helper((FILE **)(*ptrs_array)[1]);
|
simple_archiver_helper_cleanup_FILE((FILE **)(*ptrs_array)[1]);
|
||||||
}
|
}
|
||||||
if ((*ptrs_array)[0]) {
|
if ((*ptrs_array)[0]) {
|
||||||
unlink((char *)((*ptrs_array)[0]));
|
unlink((char *)((*ptrs_array)[0]));
|
||||||
|
@ -109,7 +95,7 @@ char *filename_to_absolute_path(const char *filename) {
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
|
#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
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *path =
|
__attribute__((cleanup(simple_archiver_helper_cleanup_malloced))) void *path =
|
||||||
malloc(strlen(filename) + 1);
|
malloc(strlen(filename) + 1);
|
||||||
strncpy(path, filename, strlen(filename) + 1);
|
strncpy(path, filename, strlen(filename) + 1);
|
||||||
|
|
||||||
|
@ -118,14 +104,15 @@ char *filename_to_absolute_path(const char *filename) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *dir_realpath =
|
__attribute__((
|
||||||
|
cleanup(simple_archiver_helper_cleanup_malloced))) void *dir_realpath =
|
||||||
realpath(path_dir, NULL);
|
realpath(path_dir, NULL);
|
||||||
if (!dir_realpath) {
|
if (!dir_realpath) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recreate "path" since it may have been modified by dirname().
|
// Recreate "path" since it may have been modified by dirname().
|
||||||
free_malloced_memory(&path);
|
simple_archiver_helper_cleanup_malloced(&path);
|
||||||
path = malloc(strlen(filename) + 1);
|
path = malloc(strlen(filename) + 1);
|
||||||
strncpy(path, filename, strlen(filename) + 1);
|
strncpy(path, filename, strlen(filename) + 1);
|
||||||
|
|
||||||
|
@ -192,20 +179,21 @@ int write_files_fn(void *data, void *ud) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (1);
|
} while (1);
|
||||||
__attribute__((cleanup(free_FILE_helper))) FILE *file_fd =
|
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE)))
|
||||||
fopen(file_info->filename, "rb");
|
FILE *file_fd = fopen(file_info->filename, "rb");
|
||||||
if (!file_fd) {
|
if (!file_fd) {
|
||||||
// Unable to open file for compressing and archiving.
|
// Unable to open file for compressing and archiving.
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
__attribute__((cleanup(free_FILE_helper))) FILE *tmp_fd =
|
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE)))
|
||||||
fopen(temp_filename, "wb");
|
FILE *tmp_fd = fopen(temp_filename, "wb");
|
||||||
if (!tmp_fd) {
|
if (!tmp_fd) {
|
||||||
fprintf(stderr, "ERROR: Unable to create temp file for compressing!\n");
|
fprintf(stderr, "ERROR: Unable to create temp file for compressing!\n");
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
|
#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
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *real_cwd =
|
__attribute__((
|
||||||
|
cleanup(simple_archiver_helper_cleanup_malloced))) void *real_cwd =
|
||||||
realpath(".", NULL);
|
realpath(".", NULL);
|
||||||
if (real_cwd) {
|
if (real_cwd) {
|
||||||
fprintf(stderr, "Tried to create temp file(s) in \"%s\"!\n",
|
fprintf(stderr, "Tried to create temp file(s) in \"%s\"!\n",
|
||||||
|
@ -335,7 +323,7 @@ int write_files_fn(void *data, void *ud) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (feof(file_fd)) {
|
if (feof(file_fd)) {
|
||||||
free_FILE_helper(&file_fd);
|
simple_archiver_helper_cleanup_FILE(&file_fd);
|
||||||
write_done = 1;
|
write_done = 1;
|
||||||
close(pipe_into_cmd[1]);
|
close(pipe_into_cmd[1]);
|
||||||
// fprintf(stderr, "write_done\n");
|
// fprintf(stderr, "write_done\n");
|
||||||
|
@ -365,7 +353,7 @@ int write_files_fn(void *data, void *ud) {
|
||||||
}
|
}
|
||||||
} else if (ret == 0) {
|
} else if (ret == 0) {
|
||||||
read_done = 1;
|
read_done = 1;
|
||||||
free_FILE_helper(&tmp_fd);
|
simple_archiver_helper_cleanup_FILE(&tmp_fd);
|
||||||
close(pipe_outof_cmd[0]);
|
close(pipe_outof_cmd[0]);
|
||||||
// fprintf(stderr, "read_done\n");
|
// fprintf(stderr, "read_done\n");
|
||||||
} else if (ret == -1) {
|
} else if (ret == -1) {
|
||||||
|
@ -517,7 +505,7 @@ int write_files_fn(void *data, void *ud) {
|
||||||
} while (1);
|
} while (1);
|
||||||
|
|
||||||
// Cleanup.
|
// Cleanup.
|
||||||
free_FILE_helper(&tmp_fd);
|
simple_archiver_helper_cleanup_FILE(&tmp_fd);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
uint16_t u16;
|
uint16_t u16;
|
||||||
|
@ -604,7 +592,7 @@ int write_files_fn(void *data, void *ud) {
|
||||||
simple_archiver_list_add(to_write, temp_to_write, free_internal_to_write);
|
simple_archiver_list_add(to_write, temp_to_write, free_internal_to_write);
|
||||||
|
|
||||||
// Write file length.
|
// Write file length.
|
||||||
__attribute__((cleanup(free_FILE_helper))) FILE *fd =
|
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE))) FILE *fd =
|
||||||
fopen(file_info->filename, "rb");
|
fopen(file_info->filename, "rb");
|
||||||
if (!fd) {
|
if (!fd) {
|
||||||
// Error.
|
// Error.
|
||||||
|
@ -735,17 +723,20 @@ int write_files_fn(void *data, void *ud) {
|
||||||
|
|
||||||
// Need to get abs_path for checking/setting a flag before storing flags.
|
// Need to get abs_path for checking/setting a flag before storing flags.
|
||||||
// Get absolute path.
|
// Get absolute path.
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *abs_path = NULL;
|
__attribute__((cleanup(
|
||||||
|
simple_archiver_helper_cleanup_malloced))) void *abs_path = NULL;
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
|
#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
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
||||||
abs_path = realpath(file_info->filename, NULL);
|
abs_path = realpath(file_info->filename, NULL);
|
||||||
#endif
|
#endif
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *rel_path = NULL;
|
__attribute__((cleanup(
|
||||||
|
simple_archiver_helper_cleanup_malloced))) void *rel_path = NULL;
|
||||||
if (abs_path) {
|
if (abs_path) {
|
||||||
// Get relative path.
|
// Get relative path.
|
||||||
// First get absolute path of link.
|
// First get absolute path of link.
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *link_abs_path =
|
__attribute__((cleanup(
|
||||||
|
simple_archiver_helper_cleanup_malloced))) void *link_abs_path =
|
||||||
filename_to_absolute_path(file_info->filename);
|
filename_to_absolute_path(file_info->filename);
|
||||||
if (!link_abs_path) {
|
if (!link_abs_path) {
|
||||||
fprintf(stderr, "WARNING: Failed to get absolute path of link!\n");
|
fprintf(stderr, "WARNING: Failed to get absolute path of link!\n");
|
||||||
|
@ -890,28 +881,13 @@ int write_files_fn(void *data, void *ud) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanup_nop_fn(__attribute__((unused)) void *unused) {}
|
|
||||||
void cleanup_free_fn(void *data) { free(data); }
|
|
||||||
|
|
||||||
void simple_archiver_internal_chdir_back2(char **original) {
|
|
||||||
if (original && *original) {
|
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX || \
|
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
|
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN
|
|
||||||
chdir(*original);
|
|
||||||
#endif
|
|
||||||
free(*original);
|
|
||||||
*original = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int filenames_to_abs_map_fn(void *data, void *ud) {
|
int filenames_to_abs_map_fn(void *data, void *ud) {
|
||||||
SDArchiverFileInfo *file_info = data;
|
SDArchiverFileInfo *file_info = data;
|
||||||
void **ptr_array = ud;
|
void **ptr_array = ud;
|
||||||
SDArchiverHashMap **abs_filenames = ptr_array[0];
|
SDArchiverHashMap **abs_filenames = ptr_array[0];
|
||||||
const char *user_cwd = ptr_array[1];
|
const char *user_cwd = ptr_array[1];
|
||||||
__attribute__((
|
__attribute__((cleanup(
|
||||||
cleanup(simple_archiver_internal_chdir_back2))) char *original_cwd = NULL;
|
simple_archiver_helper_cleanup_chdir_back))) char *original_cwd = NULL;
|
||||||
if (user_cwd) {
|
if (user_cwd) {
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
|
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
|
||||||
|
@ -929,12 +905,14 @@ int filenames_to_abs_map_fn(void *data, void *ud) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
simple_archiver_hash_map_insert(abs_filenames, fullpath, fullpath,
|
simple_archiver_hash_map_insert(
|
||||||
strlen(fullpath) + 1, cleanup_nop_fn, NULL);
|
abs_filenames, fullpath, fullpath, strlen(fullpath) + 1,
|
||||||
|
simple_archiver_helper_datastructure_cleanup_nop, NULL);
|
||||||
|
|
||||||
// Try putting all parent dirs up to current working directory.
|
// Try putting all parent dirs up to current working directory.
|
||||||
// First get absolute path to current working directory.
|
// First get absolute path to current working directory.
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *cwd_dirname = NULL;
|
__attribute__((cleanup(
|
||||||
|
simple_archiver_helper_cleanup_malloced))) void *cwd_dirname = NULL;
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
|
#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
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
||||||
|
@ -946,7 +924,8 @@ int filenames_to_abs_map_fn(void *data, void *ud) {
|
||||||
// fprintf(stderr, "cwd_dirname: %s\n", (char*)cwd_dirname);
|
// fprintf(stderr, "cwd_dirname: %s\n", (char*)cwd_dirname);
|
||||||
|
|
||||||
// Use copy of fullpath to avoid clobbering it.
|
// Use copy of fullpath to avoid clobbering it.
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *fullpath_copy =
|
__attribute__((
|
||||||
|
cleanup(simple_archiver_helper_cleanup_malloced))) void *fullpath_copy =
|
||||||
malloc(strlen(fullpath) + 1);
|
malloc(strlen(fullpath) + 1);
|
||||||
strncpy(fullpath_copy, fullpath, strlen(fullpath) + 1);
|
strncpy(fullpath_copy, fullpath, strlen(fullpath) + 1);
|
||||||
|
|
||||||
|
@ -964,7 +943,8 @@ int filenames_to_abs_map_fn(void *data, void *ud) {
|
||||||
strlen(fullpath_dirname) + 1);
|
strlen(fullpath_dirname) + 1);
|
||||||
simple_archiver_hash_map_insert(
|
simple_archiver_hash_map_insert(
|
||||||
abs_filenames, fullpath_dirname_copy, fullpath_dirname_copy,
|
abs_filenames, fullpath_dirname_copy, fullpath_dirname_copy,
|
||||||
strlen(fullpath_dirname_copy) + 1, cleanup_nop_fn, NULL);
|
strlen(fullpath_dirname_copy) + 1,
|
||||||
|
simple_archiver_helper_datastructure_cleanup_nop, NULL);
|
||||||
}
|
}
|
||||||
prev = fullpath_dirname;
|
prev = fullpath_dirname;
|
||||||
}
|
}
|
||||||
|
@ -1125,8 +1105,8 @@ int simple_archiver_write_all(FILE *out_f, SDArchiverState *state,
|
||||||
state->map = abs_filenames;
|
state->map = abs_filenames;
|
||||||
state->digits = simple_archiver_helper_num_digits(state->max);
|
state->digits = simple_archiver_helper_num_digits(state->max);
|
||||||
fprintf(stderr, "Begin archiving...\n");
|
fprintf(stderr, "Begin archiving...\n");
|
||||||
__attribute__((
|
__attribute__((cleanup(
|
||||||
cleanup(simple_archiver_internal_chdir_back2))) char *original_cwd = NULL;
|
simple_archiver_helper_cleanup_chdir_back))) char *original_cwd = NULL;
|
||||||
if (state->parsed->user_cwd) {
|
if (state->parsed->user_cwd) {
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
|
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
|
||||||
|
@ -1184,7 +1164,8 @@ int simple_archiver_parse_archive_info(FILE *in_f, int do_extract,
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *decompressor_cmd = NULL;
|
__attribute__((cleanup(
|
||||||
|
simple_archiver_helper_cleanup_malloced))) void *decompressor_cmd = NULL;
|
||||||
|
|
||||||
if ((buf[0] & 1) != 0) {
|
if ((buf[0] & 1) != 0) {
|
||||||
fprintf(stderr, "De/compressor flag is set.\n");
|
fprintf(stderr, "De/compressor flag is set.\n");
|
||||||
|
@ -1203,7 +1184,8 @@ int simple_archiver_parse_archive_info(FILE *in_f, int do_extract,
|
||||||
buf[1023] = 0;
|
buf[1023] = 0;
|
||||||
fprintf(stderr, "Compressor cmd: %s\n", buf);
|
fprintf(stderr, "Compressor cmd: %s\n", buf);
|
||||||
} else {
|
} else {
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *heap_buf =
|
__attribute__((
|
||||||
|
cleanup(simple_archiver_helper_cleanup_malloced))) void *heap_buf =
|
||||||
malloc(u16 + 1);
|
malloc(u16 + 1);
|
||||||
unsigned char *uc_heap_buf = heap_buf;
|
unsigned char *uc_heap_buf = heap_buf;
|
||||||
if (fread(uc_heap_buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
|
if (fread(uc_heap_buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
|
||||||
|
@ -1229,7 +1211,8 @@ int simple_archiver_parse_archive_info(FILE *in_f, int do_extract,
|
||||||
memcpy((char *)decompressor_cmd, buf, u16 + 1);
|
memcpy((char *)decompressor_cmd, buf, u16 + 1);
|
||||||
((char *)decompressor_cmd)[u16] = 0;
|
((char *)decompressor_cmd)[u16] = 0;
|
||||||
} else {
|
} else {
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *heap_buf =
|
__attribute__((
|
||||||
|
cleanup(simple_archiver_helper_cleanup_malloced))) void *heap_buf =
|
||||||
malloc(u16 + 1);
|
malloc(u16 + 1);
|
||||||
unsigned char *uc_heap_buf = heap_buf;
|
unsigned char *uc_heap_buf = heap_buf;
|
||||||
if (fread(uc_heap_buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
|
if (fread(uc_heap_buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
|
||||||
|
@ -1263,8 +1246,9 @@ int simple_archiver_parse_archive_info(FILE *in_f, int do_extract,
|
||||||
char *key = malloc(len);
|
char *key = malloc(len);
|
||||||
memcpy(key, *iter, len);
|
memcpy(key, *iter, len);
|
||||||
key[len - 1] = 0;
|
key[len - 1] = 0;
|
||||||
simple_archiver_hash_map_insert(&hash_map, key, key, len, cleanup_nop_fn,
|
simple_archiver_hash_map_insert(
|
||||||
cleanup_free_fn);
|
&hash_map, key, key, len,
|
||||||
|
simple_archiver_helper_datastructure_cleanup_nop, NULL);
|
||||||
// fprintf(stderr, "\"%s\" put in map\n", key);
|
// fprintf(stderr, "\"%s\" put in map\n", key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1276,8 +1260,10 @@ int simple_archiver_parse_archive_info(FILE *in_f, int do_extract,
|
||||||
return SDAS_INVALID_FILE;
|
return SDAS_INVALID_FILE;
|
||||||
}
|
}
|
||||||
simple_archiver_helper_16_bit_be(&u16);
|
simple_archiver_helper_16_bit_be(&u16);
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *out_f_name = NULL;
|
__attribute__((cleanup(
|
||||||
__attribute__((cleanup(free_FILE_helper))) FILE *out_f = NULL;
|
simple_archiver_helper_cleanup_malloced))) void *out_f_name = NULL;
|
||||||
|
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE))) FILE *out_f =
|
||||||
|
NULL;
|
||||||
if (u16 < 1024) {
|
if (u16 < 1024) {
|
||||||
if (fread(buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
|
if (fread(buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
|
||||||
return SDAS_INVALID_FILE;
|
return SDAS_INVALID_FILE;
|
||||||
|
@ -1286,8 +1272,8 @@ int simple_archiver_parse_archive_info(FILE *in_f, int do_extract,
|
||||||
fprintf(stderr, " Filename: %s\n", buf);
|
fprintf(stderr, " Filename: %s\n", buf);
|
||||||
if (do_extract) {
|
if (do_extract) {
|
||||||
if ((state->parsed->flags & 0x8) == 0) {
|
if ((state->parsed->flags & 0x8) == 0) {
|
||||||
__attribute__((cleanup(free_FILE_helper))) FILE *test_fd =
|
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE)))
|
||||||
fopen((const char *)buf, "rb");
|
FILE *test_fd = fopen((const char *)buf, "rb");
|
||||||
if (test_fd) {
|
if (test_fd) {
|
||||||
skip = 1;
|
skip = 1;
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
|
@ -1305,7 +1291,8 @@ int simple_archiver_parse_archive_info(FILE *in_f, int do_extract,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *heap_buf =
|
__attribute__((
|
||||||
|
cleanup(simple_archiver_helper_cleanup_malloced))) void *heap_buf =
|
||||||
malloc(u16 + 1);
|
malloc(u16 + 1);
|
||||||
unsigned char *uc_heap_buf = heap_buf;
|
unsigned char *uc_heap_buf = heap_buf;
|
||||||
if (fread(uc_heap_buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
|
if (fread(uc_heap_buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
|
||||||
|
@ -1315,8 +1302,8 @@ int simple_archiver_parse_archive_info(FILE *in_f, int do_extract,
|
||||||
fprintf(stderr, " Filename: %s\n", uc_heap_buf);
|
fprintf(stderr, " Filename: %s\n", uc_heap_buf);
|
||||||
if (do_extract) {
|
if (do_extract) {
|
||||||
if ((state->parsed->flags & 0x8) == 0) {
|
if ((state->parsed->flags & 0x8) == 0) {
|
||||||
__attribute__((cleanup(free_FILE_helper))) FILE *test_fd =
|
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE)))
|
||||||
fopen((const char *)buf, "rb");
|
FILE *test_fd = fopen((const char *)buf, "rb");
|
||||||
if (test_fd) {
|
if (test_fd) {
|
||||||
skip = 1;
|
skip = 1;
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
|
@ -1639,7 +1626,7 @@ int simple_archiver_parse_archive_info(FILE *in_f, int do_extract,
|
||||||
// EOF.
|
// EOF.
|
||||||
read_pipe_done = 1;
|
read_pipe_done = 1;
|
||||||
close(pipe_outof_cmd[0]);
|
close(pipe_outof_cmd[0]);
|
||||||
free_FILE_helper(&out_f);
|
simple_archiver_helper_cleanup_FILE(&out_f);
|
||||||
} else {
|
} else {
|
||||||
// Invalid state (unreachable?), error.
|
// Invalid state (unreachable?), error.
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
|
@ -1724,8 +1711,10 @@ int simple_archiver_parse_archive_info(FILE *in_f, int do_extract,
|
||||||
fprintf(stderr, " Absolute path is %s\n",
|
fprintf(stderr, " Absolute path is %s\n",
|
||||||
(abs_preferred ? "preferred" : "NOT preferred"));
|
(abs_preferred ? "preferred" : "NOT preferred"));
|
||||||
|
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *abs_path = NULL;
|
__attribute__((cleanup(
|
||||||
__attribute__((cleanup(free_malloced_memory))) void *rel_path = NULL;
|
simple_archiver_helper_cleanup_malloced))) void *abs_path = NULL;
|
||||||
|
__attribute__((cleanup(
|
||||||
|
simple_archiver_helper_cleanup_malloced))) void *rel_path = NULL;
|
||||||
|
|
||||||
if (fread(&u16, 2, 1, in_f) != 1) {
|
if (fread(&u16, 2, 1, in_f) != 1) {
|
||||||
return SDAS_INVALID_FILE;
|
return SDAS_INVALID_FILE;
|
||||||
|
|
|
@ -33,13 +33,42 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void simple_archiver_internal_free_c_string(char **str) {
|
void simple_archiver_helper_cleanup_FILE(FILE **fd) {
|
||||||
|
if (fd && *fd) {
|
||||||
|
fclose(*fd);
|
||||||
|
*fd = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void simple_archiver_helper_cleanup_malloced(void **data) {
|
||||||
|
if (data && *data) {
|
||||||
|
free(*data);
|
||||||
|
*data = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void simple_archiver_helper_cleanup_c_string(char **str) {
|
||||||
if (str && *str) {
|
if (str && *str) {
|
||||||
free(*str);
|
free(*str);
|
||||||
*str = NULL;
|
*str = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void simple_archiver_helper_cleanup_chdir_back(char **original) {
|
||||||
|
if (original && *original) {
|
||||||
|
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX || \
|
||||||
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
|
||||||
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN
|
||||||
|
chdir(*original);
|
||||||
|
#endif
|
||||||
|
free(*original);
|
||||||
|
*original = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void simple_archiver_helper_datastructure_cleanup_nop(
|
||||||
|
__attribute__((unused)) void *unused) {}
|
||||||
|
|
||||||
int simple_archiver_helper_is_big_endian(void) {
|
int simple_archiver_helper_is_big_endian(void) {
|
||||||
union {
|
union {
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
@ -152,7 +181,7 @@ int simple_archiver_helper_make_dirs(const char *file_path) {
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
||||||
__attribute__((
|
__attribute__((
|
||||||
cleanup(simple_archiver_internal_free_c_string))) char *path_dup =
|
cleanup(simple_archiver_helper_cleanup_c_string))) char *path_dup =
|
||||||
strdup(file_path);
|
strdup(file_path);
|
||||||
if (!path_dup) {
|
if (!path_dup) {
|
||||||
return 3;
|
return 3;
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#define SEODISPARATE_COM_SIMPLE_ARCHIVER_HELPERS_H_
|
#define SEODISPARATE_COM_SIMPLE_ARCHIVER_HELPERS_H_
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
static const unsigned int MAX_SYMBOLIC_LINK_SIZE = 512;
|
static const unsigned int MAX_SYMBOLIC_LINK_SIZE = 512;
|
||||||
|
|
||||||
|
@ -54,4 +55,11 @@ char *simple_archiver_helper_cut_substr(const char *s, unsigned int start_idx,
|
||||||
|
|
||||||
unsigned int simple_archiver_helper_num_digits(unsigned int value);
|
unsigned int simple_archiver_helper_num_digits(unsigned int value);
|
||||||
|
|
||||||
|
void simple_archiver_helper_cleanup_FILE(FILE **fd);
|
||||||
|
void simple_archiver_helper_cleanup_malloced(void **data);
|
||||||
|
void simple_archiver_helper_cleanup_c_string(char **str);
|
||||||
|
void simple_archiver_helper_cleanup_chdir_back(char **original);
|
||||||
|
|
||||||
|
void simple_archiver_helper_datastructure_cleanup_nop(void *unused);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
34
src/parser.c
34
src/parser.c
|
@ -103,18 +103,6 @@ void simple_archiver_parser_internal_remove_end_slash(char *filename) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void simple_archiver_internal_chdir_back(char **original) {
|
|
||||||
if (original && *original) {
|
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX || \
|
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
|
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN
|
|
||||||
chdir(*original);
|
|
||||||
#endif
|
|
||||||
free(*original);
|
|
||||||
*original = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void simple_archiver_internal_free_file_info_fn(void *data) {
|
void simple_archiver_internal_free_file_info_fn(void *data) {
|
||||||
SDArchiverFileInfo *file_info = data;
|
SDArchiverFileInfo *file_info = data;
|
||||||
if (file_info) {
|
if (file_info) {
|
||||||
|
@ -135,8 +123,6 @@ int list_get_last_fn(void *data, void *ud) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void container_no_free_fn(__attribute__((unused)) void *data) { return; }
|
|
||||||
|
|
||||||
int list_remove_same_str_fn(void *data, void *ud) {
|
int list_remove_same_str_fn(void *data, void *ud) {
|
||||||
if (strcmp((char *)data, (char *)ud) == 0) {
|
if (strcmp((char *)data, (char *)ud) == 0) {
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -389,8 +375,8 @@ SDArchiverLinkedList *simple_archiver_parsed_to_filenames(
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
|
#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
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
||||||
__attribute__((
|
__attribute__((cleanup(
|
||||||
cleanup(simple_archiver_internal_chdir_back))) char *original_cwd = NULL;
|
simple_archiver_helper_cleanup_chdir_back))) char *original_cwd = NULL;
|
||||||
if (parsed->user_cwd) {
|
if (parsed->user_cwd) {
|
||||||
original_cwd = realpath(".", NULL);
|
original_cwd = realpath(".", NULL);
|
||||||
if (chdir(parsed->user_cwd)) {
|
if (chdir(parsed->user_cwd)) {
|
||||||
|
@ -455,9 +441,10 @@ SDArchiverLinkedList *simple_archiver_parsed_to_filenames(
|
||||||
}
|
}
|
||||||
simple_archiver_list_add(files_list, file_info,
|
simple_archiver_list_add(files_list, file_info,
|
||||||
simple_archiver_internal_free_file_info_fn);
|
simple_archiver_internal_free_file_info_fn);
|
||||||
simple_archiver_hash_map_insert(&hash_map, &hash_map_sentinel, filename,
|
simple_archiver_hash_map_insert(
|
||||||
len - 1, container_no_free_fn,
|
&hash_map, &hash_map_sentinel, filename, len - 1,
|
||||||
container_no_free_fn);
|
simple_archiver_helper_datastructure_cleanup_nop,
|
||||||
|
simple_archiver_helper_datastructure_cleanup_nop);
|
||||||
} else {
|
} else {
|
||||||
free(filename);
|
free(filename);
|
||||||
}
|
}
|
||||||
|
@ -465,7 +452,9 @@ SDArchiverLinkedList *simple_archiver_parsed_to_filenames(
|
||||||
// Is a directory.
|
// Is a directory.
|
||||||
__attribute__((cleanup(simple_archiver_list_free)))
|
__attribute__((cleanup(simple_archiver_list_free)))
|
||||||
SDArchiverLinkedList *dir_list = simple_archiver_list_init();
|
SDArchiverLinkedList *dir_list = simple_archiver_list_init();
|
||||||
simple_archiver_list_add(dir_list, file_path, container_no_free_fn);
|
simple_archiver_list_add(
|
||||||
|
dir_list, file_path,
|
||||||
|
simple_archiver_helper_datastructure_cleanup_nop);
|
||||||
char *next;
|
char *next;
|
||||||
while (dir_list->count != 0) {
|
while (dir_list->count != 0) {
|
||||||
simple_archiver_list_get(dir_list, list_get_last_fn, &next);
|
simple_archiver_list_get(dir_list, list_get_last_fn, &next);
|
||||||
|
@ -553,8 +542,9 @@ SDArchiverLinkedList *simple_archiver_parsed_to_filenames(
|
||||||
simple_archiver_internal_free_file_info_fn);
|
simple_archiver_internal_free_file_info_fn);
|
||||||
simple_archiver_hash_map_insert(
|
simple_archiver_hash_map_insert(
|
||||||
&hash_map, &hash_map_sentinel, combined_path,
|
&hash_map, &hash_map_sentinel, combined_path,
|
||||||
combined_size - 1, container_no_free_fn,
|
combined_size - 1,
|
||||||
container_no_free_fn);
|
simple_archiver_helper_datastructure_cleanup_nop,
|
||||||
|
simple_archiver_helper_datastructure_cleanup_nop);
|
||||||
} else {
|
} else {
|
||||||
free(combined_path);
|
free(combined_path);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue