From 3f3ee4c979fe72942431b576648b8e3f35ffd920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Wed, 23 Jun 2021 10:58:48 +0200 Subject: [PATCH] refactor: do not use dynamic allocation where not needed --- file-browser/include/file_access.h | 8 +- file-browser/include/local_file_utils.h | 10 +++ file-browser/include/path.h | 3 +- file-browser/src/local_file_access.c | 110 ++++-------------------- file-browser/src/local_file_utils.c | 60 +++++++++++++ file-browser/src/path.c | 12 +-- 6 files changed, 98 insertions(+), 105 deletions(-) create mode 100644 file-browser/include/local_file_utils.h create mode 100644 file-browser/src/local_file_utils.c diff --git a/file-browser/include/file_access.h b/file-browser/include/file_access.h index afa5c3617451e46264dc61abc93cd29febc9e8a2..ec8613ccb924e66b09ceab2900b181241f4590bd 100644 --- a/file-browser/include/file_access.h +++ b/file-browser/include/file_access.h @@ -118,11 +118,11 @@ struct fileaccess_t { typedef struct fileaccess_connector_t fileaccess_connector_t; typedef file_operation_error_t (*file_copy_fn)( - fileaccess_connector_t *connector, void *first_state, void *second_state, - file_t *file, char *destination); + fileaccess_connector_t *connector, fileaccess_state_t first_state, + fileaccess_state_t second_state, file_t *file, char *destination); typedef file_operation_error_t (*file_move_fn)( - fileaccess_connector_t *connector, void *first_state, void *second_state, - file_t *file, char *destination); + fileaccess_connector_t *connector, fileaccess_state_t first_state, + fileaccess_state_t second_state, file_t *file, char *destination); struct fileaccess_connector_t { const fileaccess_t *first; diff --git a/file-browser/include/local_file_utils.h b/file-browser/include/local_file_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..c17af9392f15b26803acfdb5ad8ada03e61b2e3b --- /dev/null +++ b/file-browser/include/local_file_utils.h @@ -0,0 +1,10 @@ +#include "file_access.h" +#include + +int file_delete(const char *path); +int directory_delete(const char *path); + +size_t file_get_full_path_memory_size(fileaccess_state_t state, + directory_t *directory, file_t *file); +bool file_get_full_path(fileaccess_state_t state, directory_t *directory, + file_t *file, char *dest); diff --git a/file-browser/include/path.h b/file-browser/include/path.h index fcdb0511260df457de08a42125414923bc11c29e..8ed8313f33df77ef45284cd4b65e1da3a29ae46b 100644 --- a/file-browser/include/path.h +++ b/file-browser/include/path.h @@ -4,6 +4,7 @@ #include #include -char *path_join(char *base, char *relative); +size_t path_join_memory_size(char *base, char *relative); +bool path_join(char *base, char *relative, char *out); #endif // __PATH_H__ diff --git a/file-browser/src/local_file_access.c b/file-browser/src/local_file_access.c index 3013f5b6b856de1bd3f27efd065222ad35cf7197..0027ebf8c7f241d9a801ae89f64cad9982b7148f 100644 --- a/file-browser/src/local_file_access.c +++ b/file-browser/src/local_file_access.c @@ -1,5 +1,6 @@ #include "local_file_access.h" #include "file_access.h" +#include "local_file_utils.h" #include "path.h" #include #include @@ -11,54 +12,6 @@ #include #define ROOT "/" -static int nfw_callback(const char *fpath, const struct stat *sb, int typeflag); -static int delete_file(const char *path); -static int delete_directory(const char *path); - -static char *file_get_full_path(fileaccess_state_t state, - directory_t *directory, file_t *file) { - char *base_path = path_join((char*)state.state, directory->path); - - if (base_path == NULL) { - return NULL; - } - - char *full_path = path_join(base_path, file->name); - free(base_path); - - return full_path; -} - -static int delete_directory(const char *path) { - int err = ftw(path, nfw_callback, 5); - if (err != 1) { - err = FILOPER_UNKNOWN; - } - - if (err != 0) { - return err; - } - - return delete_file(path); -} - -static int delete_file(const char *path) { - int err = 0; - if (remove(path) == -1) { - err = file_operation_error_from_errno(errno); - } - - return err; -} - -static int nfw_callback(const char *fpath, const struct stat *sb, - int typeflag) { - if (typeflag == FTW_D) { - return delete_directory(fpath); - } else { - return delete_file(fpath); - } -} fileaccess_state_t local_fileaccess_init_state(void *data) { fileaccess_state_t state = {.state = ROOT, .fileaccess = &local_file_access}; @@ -83,16 +36,12 @@ static file_operation_error_t file_get_information(void **malloced, } *malloced = new; - char *full_path = file_get_full_path(state, file.directory, &file); - if (full_path == NULL) { - free(new); - return FILOPER_UNKNOWN; - } + char full_path[file_get_full_path_memory_size(state, file.directory, &file)]; + file_get_full_path(state, file.directory, &file, full_path); // load info struct stat stats; int status = stat(full_path, &stats); - free(full_path); if (status == -1) { free(new); @@ -118,12 +67,8 @@ static file_operation_error_t file_get_information(void **malloced, directory_or_error_t local_fileaccess_directory_list(fileaccess_state_t state, char *path) { directory_or_error_t ret; - char *full_path = path_join((char *)state.state, path); - if (full_path == NULL) { - ret.error = true; - ret.payload.error = FILOPER_UNKNOWN; - return ret; - } + char full_path[path_join_memory_size(state.state, path)]; + path_join((char *)state.state, path, full_path); uint64_t malloc_offset = sizeof(directory_t) + strlen(path) + 1; uint64_t bytes_malloced = sizeof(directory_t) + strlen(path) + 1; @@ -133,7 +78,6 @@ directory_or_error_t local_fileaccess_directory_list(fileaccess_state_t state, if (directory == NULL) { ret.error = true; ret.payload.error = FILOPER_UNKNOWN; - free(full_path); return ret; } @@ -142,7 +86,6 @@ directory_or_error_t local_fileaccess_directory_list(fileaccess_state_t state, DIR *dirptr = opendir(full_path); - free(full_path); if (dirptr == NULL) { ret.error = true; ret.payload.error = file_operation_error_from_errno(errno); @@ -201,12 +144,8 @@ directory_or_error_t local_fileaccess_root_list(fileaccess_state_t state) { directory_or_error_t local_fileaccess_directory_create(fileaccess_state_t state, char *path) { directory_or_error_t ret; - char *full_path = path_join((char *)state.state, path); - if (full_path == NULL) { - ret.error = true; - ret.payload.error = FILOPER_UNKNOWN; - return ret; - } + char full_path[path_join_memory_size(state.state, path)]; + path_join((char *)state.state, path, full_path); int status = mkdir(full_path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); @@ -217,24 +156,20 @@ directory_or_error_t local_fileaccess_directory_create(fileaccess_state_t state, ret = local_fileaccess_directory_list(state, full_path); } - free(full_path); return ret; } file_operation_error_t local_fileaccess_directory_delete(fileaccess_state_t state, char *path) { file_operation_error_t error = FILOPER_SUCCESS; - char *full_path = path_join((char *)state.state, path); - if (full_path == NULL) { - return FILOPER_UNKNOWN; - } + char full_path[path_join_memory_size(state.state, path)]; + path_join((char *)state.state, path, full_path); - int status = delete_directory(full_path); + int status = directory_delete(full_path); if (status != 0) { error = status; } - free(full_path); return error; } @@ -253,10 +188,8 @@ local_fileaccess_file_get_mime_type(fileaccess_state_t state, file_t *file, magic_t magic = magic_open(MAGIC_MIME_TYPE); magic_load(magic, NULL); - char *full_path = file_get_full_path(state, file->directory, file); - if (full_path == NULL) { - return FILOPER_UNKNOWN; - } + char full_path[file_get_full_path_memory_size(state, file->directory, file)]; + file_get_full_path(state, file->directory, file, full_path); const char *data = magic_file(magic, full_path); if (data == NULL) { @@ -269,7 +202,6 @@ local_fileaccess_file_get_mime_type(fileaccess_state_t state, file_t *file, } mime[i] = '\0'; - free(full_path); magic_close(magic); return error; } @@ -277,15 +209,10 @@ local_fileaccess_file_get_mime_type(fileaccess_state_t state, file_t *file, executing_file_or_error_t local_fileaccess_file_execute(fileaccess_state_t state, file_t *file, char *args) { executing_file_or_error_t ret; - char *full_path = file_get_full_path(state, file->directory, file); + char full_path[file_get_full_path_memory_size(state, file->directory, file)]; + file_get_full_path(state, file->directory, file, full_path); // TODO: check permissions - if (full_path == NULL) { - ret.error = true; - ret.payload.error = FILOPER_UNKNOWN; - return ret; - } - executing_file_error_t efile = executing_file_execute(full_path, args); if (efile.error == true) { ret.error = true; @@ -295,18 +222,14 @@ executing_file_or_error_t local_fileaccess_file_execute(fileaccess_state_t state ret.payload.file = efile.file; } - free(full_path); return ret; } file_operation_error_t local_fileaccess_file_delete(fileaccess_state_t state, char *path) { file_operation_error_t error = FILOPER_SUCCESS; - char *full_path = path_join((char *)state.state, path); - - if (full_path == NULL) { - return FILOPER_UNKNOWN; - } + char full_path[path_join_memory_size(state.state, path)]; + path_join((char *)state.state, path, full_path); int status = remove(path); @@ -314,7 +237,6 @@ file_operation_error_t local_fileaccess_file_delete(fileaccess_state_t state, error = file_operation_error_from_errno(errno); } - free(full_path); return error; } diff --git a/file-browser/src/local_file_utils.c b/file-browser/src/local_file_utils.c new file mode 100644 index 0000000000000000000000000000000000000000..ee81a275bf4029f8d35b94978e81ba9cd2c9b0db --- /dev/null +++ b/file-browser/src/local_file_utils.c @@ -0,0 +1,60 @@ +#include "local_file_utils.h" +#include +#include +#include "path.h" +#include +#include +#include +#include + +static int nfw_callback(const char *fpath, const struct stat *sb, int typeflag); + +size_t file_get_full_path_memory_size(fileaccess_state_t state, directory_t *directory, file_t *file) { + return strlen(file->name) + strlen(state.state) + strlen(file->name) + 3; +} + +bool file_get_full_path(fileaccess_state_t state, + directory_t *directory, file_t *file, char *out) { + char base_path[path_join_memory_size(state.state, directory->path)]; + if (!path_join((char*)state.state, directory->path, base_path)) { + return false; + } + + if (!path_join(base_path, file->name, out)) { + return false; + } + + return true; +} + +int directory_delete(const char *path) { + int err = ftw(path, nfw_callback, 5); + if (err != 1) { + err = FILOPER_UNKNOWN; + } + + if (err != 0) { + return err; + } + + return file_delete(path); +} + +int file_delete(const char *path) { + int err = 0; + if (remove(path) == -1) { + err = file_operation_error_from_errno(errno); + } + + return err; +} + +static int nfw_callback(const char *fpath, const struct stat *sb, + int typeflag) { + if (typeflag == FTW_D) { + return directory_delete(fpath); + } else { + return file_delete(fpath); + } +} + diff --git a/file-browser/src/path.c b/file-browser/src/path.c index d005daac7cdd7ce2198678e5e349fbb72be6cf1f..9cf5b127ecd39415385e042f258a5045c4d7e93f 100644 --- a/file-browser/src/path.c +++ b/file-browser/src/path.c @@ -2,7 +2,11 @@ #include #include -char *path_join(char *base, char *relative) { +size_t path_join_memory_size(char *base, char *relative) { + return strlen(base) + strlen(relative) + 1; +} + +bool path_join(char *base, char *relative, char *out) { size_t base_len = strlen(base); size_t relative_len = strlen(relative); @@ -16,15 +20,11 @@ char *path_join(char *base, char *relative) { } size_t new_len = base_len + relative_len + 1; // length of the string - char *out = malloc((new_len + 1) * sizeof(out)); // length of the string plus one for \0 - if (out == NULL) { - return NULL; - } out[new_len] = '\0'; out[base_len] = '/'; memcpy(out, base, base_len); memcpy(out + base_len + 1, relative, relative_len); - return out; + return true; }