From 3854acbd2b6708810df418f1188ead90b9635894 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Wed, 29 Nov 2017 18:12:51 +0100 Subject: [PATCH] Add convenience functions to create directories Signed-off-by: Michael Tremer --- src/libpakfire/include/pakfire/util.h | 3 ++ src/libpakfire/util.c | 58 +++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index dbe001abc..3574ff999 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -22,6 +22,7 @@ #define PAKFIRE_UTIL_H #include +#include #include void pakfire_oom(size_t num, size_t len); @@ -41,6 +42,8 @@ char* pakfire_path_join(const char* first, const char* second); char* pakfire_basename(const char* path); char* pakfire_dirname(const char* path); +int pakfire_access(const char* dir, const char* file, int mode); +int pakfire_mkdir(const char* path, mode_t mode); char* pakfire_sgets(char* str, int num, char** input); char* pakfire_remove_trailing_newline(char* str); diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index a4bf292cd..ed783e825 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -18,17 +18,22 @@ # # #############################################################################*/ +#include #include #include #include #include #include #include +#include +#include #include +#include #include #include +#include void pakfire_oom(size_t num, size_t len) { if (num) @@ -145,6 +150,59 @@ char* pakfire_dirname(const char* path) { return dirname(parent); } +int pakfire_access(const char* dir, const char* file, int mode) { + char* path = pakfire_path_join(dir, file); + + int r = access(path, mode); + + if (r) { + if (mode & R_OK) + DEBUG("%s is not readable\n", path); + + if (mode & W_OK) + DEBUG("%s is not writable\n", path); + + if (mode & X_OK) + DEBUG("%s is not executable\n", path); + + if (mode & F_OK) + DEBUG("%s does not exist\n", path); + } + + return r; +} + +int pakfire_mkdir(const char* path, mode_t mode) { + int r = 0; + + if ((strcmp(path, "/") == 0) || (strcmp(path, ".") == 0)) + return 0; + + // If parent does not exists, we try to create it. + char* parent = pakfire_dirname(path); + r = pakfire_access(parent, NULL, F_OK); + if (r) + r = pakfire_mkdir(parent, 0); + + pakfire_free(parent); + + if (r) + return r; + + // Finally, create the directory we want. + r = mkdir(path, mode); + if (r) { + switch (errno) { + // If the directory already exists, this is fine. + case EEXIST: + r = 0; + break; + } + } + + return r; +} + char* pakfire_sgets(char* str, int num, char** input) { char* next = *input; int numread = 0; -- 2.39.5