diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-01-13 00:27:34 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-01-13 00:27:34 (GMT) |
commit | abb191e42e356914bd09176a6d6c5bf89ec50bbf (patch) | |
tree | 851f3d195a991bff42d5958a7d40d75422ad1e83 /src | |
parent | 01750b1c29ade2865f608513b139597a98a95e57 (diff) |
Ensured that a path with directories exists.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@366 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 5 | ||||
-rwxr-xr-x | src/common/Makefile.am | 1 | ||||
-rw-r--r-- | src/common/xdg.c (renamed from src/xdg.c) | 98 | ||||
-rw-r--r-- | src/common/xdg.h (renamed from src/xdg.h) | 6 | ||||
-rw-r--r-- | src/configuration.c | 2 |
5 files changed, 102 insertions, 10 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 20db26a..623506e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -75,13 +75,12 @@ libchrysaplugin_la_LIBADD = \ # Programme principal ############################################################ -chrysalide_SOURCES = \ +chrysalide_SOURCES = \ configuration.h configuration.c \ editor.h editor.c \ main.c \ params.h params.c \ - project.h project.c \ - xdg.h xdg.c + project.h project.c INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/intl $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) `pkg-config --cflags gthread-2.0` $(LIBPYTHON_CFLAGS) diff --git a/src/common/Makefile.am b/src/common/Makefile.am index 9232fc4..d074200 100755 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -11,6 +11,7 @@ libcommon_la_SOURCES = \ leb128.h leb128.c \ macros.h \ net.h net.c \ + xdg.h xdg.c \ xml.h xml.c libcommon_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBXML_LIBS) diff --git a/src/xdg.c b/src/common/xdg.c index 6541e89..712f1c8 100644 --- a/src/xdg.c +++ b/src/common/xdg.c @@ -25,9 +25,12 @@ #include <dirent.h> +#include <glib.h> #include <malloc.h> +#include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/stat.h> @@ -67,8 +70,8 @@ char *get_xdg_config_dir(const char *suffix) result = (char *)calloc(strlen(env) + 2 + strlen(suffix) + 1, sizeof(char)); strcpy(result, env); - if (env[strlen(env) - 1] != '/') - strcat(result, "/"); + if (env[strlen(env) - 1] != G_DIR_SEPARATOR) + strcat(result, G_DIR_SEPARATOR_S); strcat(result, "."); strcat(result, suffix); @@ -86,14 +89,15 @@ char *get_xdg_config_dir(const char *suffix) env = getenv("HOME"); if (env == NULL || env[0] == '\0') return NULL; - result = (char *)calloc(strlen(env) + 1 + strlen(".config/") + strlen(suffix) + 1, sizeof(char)); + result = (char *)calloc(strlen(env) + 1 + strlen(".config" G_DIR_SEPARATOR_S) + + strlen(suffix) + 1, sizeof(char)); strcpy(result, env); - if (env[strlen(env) - 1] != '/') - strcat(result, "/"); + if (env[strlen(env) - 1] != G_DIR_SEPARATOR) + strcat(result, G_DIR_SEPARATOR_S); - strcat(result, ".config/"); + strcat(result, ".config" G_DIR_SEPARATOR_S); strcat(result, suffix); } @@ -101,3 +105,85 @@ 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/xdg.h b/src/common/xdg.h index c8cd97d..78aa5ca 100644 --- a/src/xdg.h +++ b/src/common/xdg.h @@ -25,10 +25,16 @@ #define _XDG_H +#include <stdbool.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 */ diff --git a/src/configuration.c b/src/configuration.c index 1369159..aba061f 100644 --- a/src/configuration.c +++ b/src/configuration.c @@ -32,8 +32,8 @@ #include <sys/stat.h> -#include "xdg.h" #include "common/extstr.h" +#include "common/xdg.h" #include "common/xml.h" |