summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-01-13 00:27:34 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-01-13 00:27:34 (GMT)
commitabb191e42e356914bd09176a6d6c5bf89ec50bbf (patch)
tree851f3d195a991bff42d5958a7d40d75422ad1e83 /src
parent01750b1c29ade2865f608513b139597a98a95e57 (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.am5
-rwxr-xr-xsrc/common/Makefile.am1
-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.c2
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"