diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/db/cdb.c | 1 | ||||
-rw-r--r-- | src/common/pathname.c | 83 | ||||
-rw-r--r-- | src/common/pathname.h | 7 | ||||
-rw-r--r-- | src/common/xdg.c | 84 | ||||
-rw-r--r-- | src/common/xdg.h | 12 |
5 files changed, 94 insertions, 93 deletions
diff --git a/src/analysis/db/cdb.c b/src/analysis/db/cdb.c index 70e0dc5..a42f838 100644 --- a/src/analysis/db/cdb.c +++ b/src/analysis/db/cdb.c @@ -48,6 +48,7 @@ #include "../../common/cpp.h" #include "../../common/extstr.h" #include "../../common/io.h" +#include "../../common/pathname.h" #include "../../common/xdg.h" #include "../../common/xml.h" #include "../../core/collections.h" diff --git a/src/common/pathname.c b/src/common/pathname.c index 181fd1f..3a68599 100644 --- a/src/common/pathname.c +++ b/src/common/pathname.c @@ -28,6 +28,7 @@ #include <glib.h> #include <malloc.h> #include <string.h> +#include <sys/stat.h> #include "extstr.h" @@ -171,3 +172,85 @@ char *build_absolute_filename(const char *ref, const char *target) return result; } + + +/****************************************************************************** +* * +* Paramètres : path = chemin d'accès avec répertoires. * +* * +* Description : S'assure que le chemin fourni est bien en place. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool mkpath(const char *path) +{ + char tmp[PATH_MAX]; /* Recopie de travail */ + size_t len; /* Taille du chemin fourni */ + char *iter; /* Boucle de parcours */ + struct stat info; /* Information sur l'existant */ + int ret; /* Bilan d'un appel système */ + + snprintf(tmp, PATH_MAX, "%s", path); + len = strlen(tmp); + + /* Le chemin fournit ne contient que des répertoires ? */ + if (tmp[len - 1] == G_DIR_SEPARATOR) + tmp[len - 1] = '\0'; + + /* Sinon, on supprime le dernier élément, qui est un fichier */ + else + { + iter = strrchr(tmp, G_DIR_SEPARATOR); + if (iter == NULL) return true; + + *iter = '\0'; + + } + + for(iter = tmp + 1; *iter; iter++) + if(*iter == G_DIR_SEPARATOR) + { + *iter = '\0'; + + /* Analyse de l'existant */ + if (stat(tmp, &info) == 0) + { + if (S_ISDIR(info.st_mode) == 0) + return false; + else + { + *iter = G_DIR_SEPARATOR; + continue; + } + } + + ret = mkdir(tmp, S_IRWXU); + if (ret != 0) + { + perror("mkdir"); + return false; + } + + *iter = G_DIR_SEPARATOR; + + } + + /* Analyse de l'existant */ + if (stat(tmp, &info) == 0) + { + if (S_ISDIR(info.st_mode) == 0) + return false; + else + return true; + } + + ret = mkdir(tmp, S_IRWXU); + if (ret != 0) perror("mkdir"); + + return (ret == 0); + +} diff --git a/src/common/pathname.h b/src/common/pathname.h index 744a11b..72d6606 100644 --- a/src/common/pathname.h +++ b/src/common/pathname.h @@ -25,12 +25,19 @@ #define _COMMON_PATHNAME_H +#include <stdbool.h> + + + /* Calcule le chemin relatif entre deux fichiers donnés. */ char *build_relative_filename(const char *, const char *); /* Calcule le chemin absolu d'un fichier par rapport à un autre. */ char *build_absolute_filename(const char *, const char *); +/* S'assure que le chemin fourni est bien en place. */ +bool mkpath(const char *); + #endif /* _COMMON_PATHNAME_H */ diff --git a/src/common/xdg.c b/src/common/xdg.c index 29e4cb9..81bc7aa 100644 --- a/src/common/xdg.c +++ b/src/common/xdg.c @@ -27,10 +27,8 @@ #include <dirent.h> #include <glib.h> #include <malloc.h> -#include <stdio.h> #include <stdlib.h> #include <string.h> -#include <sys/stat.h> @@ -105,85 +103,3 @@ char *get_xdg_config_dir(const char *suffix) return result; } - - -/****************************************************************************** -* * -* Paramètres : path = chemin d'accès avec répertoires. * -* * -* Description : S'assure que le chemin fourni est bien en place. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool mkpath(const char *path) -{ - char tmp[PATH_MAX]; /* Recopie de travail */ - size_t len; /* Taille du chemin fourni */ - char *iter; /* Boucle de parcours */ - struct stat info; /* Information sur l'existant */ - int ret; /* Bilan d'un appel système */ - - snprintf(tmp, PATH_MAX, "%s", path); - len = strlen(tmp); - - /* Le chemin fournit ne contient que des répertoires ? */ - if (tmp[len - 1] == G_DIR_SEPARATOR) - tmp[len - 1] = '\0'; - - /* Sinon, on supprime le dernier élément, qui est un fichier */ - else - { - iter = strrchr(tmp, G_DIR_SEPARATOR); - if (iter == NULL) return true; - - *iter = '\0'; - - } - - for(iter = tmp + 1; *iter; iter++) - if(*iter == G_DIR_SEPARATOR) - { - *iter = '\0'; - - /* Analyse de l'existant */ - if (stat(tmp, &info) == 0) - { - if (S_ISDIR(info.st_mode) == 0) - return false; - else - { - *iter = G_DIR_SEPARATOR; - continue; - } - } - - ret = mkdir(tmp, S_IRWXU); - if (ret != 0) - { - perror("mkdir"); - return false; - } - - *iter = G_DIR_SEPARATOR; - - } - - /* Analyse de l'existant */ - if (stat(tmp, &info) == 0) - { - if (S_ISDIR(info.st_mode) == 0) - return false; - else - return true; - } - - ret = mkdir(tmp, S_IRWXU); - if (ret != 0) perror("mkdir"); - - return (ret == 0); - -} diff --git a/src/common/xdg.h b/src/common/xdg.h index a9aa254..19a507e 100644 --- a/src/common/xdg.h +++ b/src/common/xdg.h @@ -21,20 +21,14 @@ */ -#ifndef _XDG_H -#define _XDG_H - - -#include <stdbool.h> +#ifndef _COMMON_XDG_H +#define _COMMON_XDG_H /* Détermine le chemin d'un répertoire selon les specs. XDG. */ char *get_xdg_config_dir(const char *); -/* S'assure que le chemin fourni est bien en place. */ -bool mkpath(const char *); - -#endif /* _XDG_H */ +#endif /* _COMMON_XDG_H */ |