From ae0520e57267dbd866fc8cd25f66f4e6af2ac118 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 13 Jul 2020 15:59:30 +0200 Subject: Move c files into src directory --- src/fileutils.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/fileutils.c (limited to 'src/fileutils.c') diff --git a/src/fileutils.c b/src/fileutils.c new file mode 100644 index 0000000..ea57550 --- /dev/null +++ b/src/fileutils.c @@ -0,0 +1,82 @@ +#include "fileutils.h" +#include "alloc.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +const char* get_home_dir() { + const char *home_dir = getenv("HOME"); + if(!home_dir) { + struct passwd *pw = getpwuid(getuid()); + home_dir = pw->pw_dir; + } + return home_dir; +} + +int file_get_content(const char *filepath, char **data, long *size) { + int result = 0; + FILE *file = fopen(filepath, "rb"); + if(!file) { + int err = -errno; + perror(filepath); + return err; + } + + fseek(file, 0, SEEK_END); + *size = ftell(file); + if(*size == -1) { + fprintf(stderr, "Failed to tell the size of file %s, is it not a file?\n", filepath); + result = -1; + goto cleanup; + } + fseek(file, 0, SEEK_SET); + + *data = alloc_or_crash(*size); + if((long)fread(*data, 1, *size, file) != *size) { + fprintf(stderr, "Failed to read all bytes in file %s\n", filepath); + result = -1; + goto cleanup; + } + + cleanup: + fclose(file); + return result; +} + +int create_directory_recursive(char *path) { + int path_len = strlen(path); + char *p = path; + char *end = path + path_len; + for(;;) { + char *slash_p = strchr(p, '/'); + + // Skips first '/', we don't want to try and create the root directory + if(slash_p == path) { + ++p; + continue; + } + + if(!slash_p) + slash_p = end; + + char prev_char = *slash_p; + *slash_p = '\0'; + int err = mkdir(path, S_IRWXU); + *slash_p = prev_char; + + if(err == -1 && errno != EEXIST) + return err; + + if(slash_p == end) + break; + else + p = slash_p + 1; + } + return 0; +} -- cgit v1.2.3