From abb191e42e356914bd09176a6d6c5bf89ec50bbf Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Mon, 13 Jan 2014 00:27:34 +0000
Subject: Ensured that a path with directories exists.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@366 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog              |  20 ++++++
 src/Makefile.am        |   5 +-
 src/common/Makefile.am |   1 +
 src/common/xdg.c       | 189 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/common/xdg.h       |  40 +++++++++++
 src/configuration.c    |   2 +-
 src/xdg.c              | 103 ---------------------------
 src/xdg.h              |  34 ---------
 8 files changed, 253 insertions(+), 141 deletions(-)
 create mode 100644 src/common/xdg.c
 create mode 100644 src/common/xdg.h
 delete mode 100644 src/xdg.c
 delete mode 100644 src/xdg.h

diff --git a/ChangeLog b/ChangeLog
index 1b9e89a..05b898d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+14-01-13  Cyrille Bagard <nocbos@gmail.com>
+
+	* src/common/Makefile.am:
+	Add xdg.[ch] to libcommon_la_SOURCES.
+
+	* src/common/xdg.c:
+	* src/common/xdg.h:
+	New entries: ensure that a path with directories exists. Handle
+	directories in a portable way.
+
+	* src/configuration.c:
+	Update code.
+
+	* src/Makefile.am:
+	Remove xdg.[ch] from chrysalide_SOURCES.
+
+	* src/xdg.c:
+	* src/xdg.h:
+	Moved entries.
+
 14-01-02  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/format/mangling/Makefile.am:
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/common/xdg.c b/src/common/xdg.c
new file mode 100644
index 0000000..712f1c8
--- /dev/null
+++ b/src/common/xdg.c
@@ -0,0 +1,189 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * xdg.c - compléments mineurs au support Freedesktop
+ *
+ * Copyright (C) 2008 Cyrille Bagard
+ *
+ *  This file is part of OpenIDA.
+ *
+ *  OpenIDA is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  OpenIDA is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "xdg.h"
+
+
+#include <dirent.h>
+#include <glib.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : suffix = élément visé dans le répertoire de configuration.   *
+*                                                                             *
+*  Description : Détermine le chemin d'un répertoire selon les specs. XDG.    *
+*                                                                             *
+*  Retour      : Chemin d'accès aux configurations personnelles ou NULL.      *
+*                                                                             *
+*  Remarques   : cf. http://standards.freedesktop.org/basedir-spec/.          *
+*                                                                             *
+******************************************************************************/
+
+char *get_xdg_config_dir(const char *suffix)
+{
+    char *result;                           /* Chemin d'accès à renvoyer   */
+    const char *env;                        /* Valeur de l'environnement   */
+    DIR *directory;                         /* Répertoire avec contenu ?   */
+    struct dirent *entry;                   /* Elément de répertoire       */
+
+    result = NULL;
+
+    env = getenv("XDG_CONFIG_HOME");
+
+    if (env != NULL && env[0] != '\0')
+    {
+        directory = opendir(env);
+        if (directory == NULL) goto default_cfg_dir;
+
+        for (entry = readdir(directory); entry != NULL && result == NULL; entry = readdir(directory))
+        {
+            if (strcmp(entry->d_name, ".") == 0) continue;
+            if (strcmp(entry->d_name, "..") == 0) continue;
+
+            result = (char *)calloc(strlen(env) + 2 + strlen(suffix) + 1, sizeof(char));
+            strcpy(result, env);
+
+            if (env[strlen(env) - 1] != G_DIR_SEPARATOR)
+                strcat(result, G_DIR_SEPARATOR_S);
+
+            strcat(result, ".");
+            strcat(result, suffix);
+
+        }
+
+        closedir(directory);
+
+    }
+
+ default_cfg_dir:
+
+    if (result == NULL)
+    {
+        env = getenv("HOME");
+        if (env == NULL || env[0] == '\0') return NULL;
+
+        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] != G_DIR_SEPARATOR)
+            strcat(result, G_DIR_SEPARATOR_S);
+
+        strcat(result, ".config" G_DIR_SEPARATOR_S);
+        strcat(result, 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
new file mode 100644
index 0000000..78aa5ca
--- /dev/null
+++ b/src/common/xdg.h
@@ -0,0 +1,40 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * xdg.h - prototypes pour des compléments mineurs au support Freedesktop
+ *
+ * Copyright (C) 2008 Cyrille Bagard
+ *
+ *  This file is part of OpenIDA.
+ *
+ *  OpenIDA is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  OpenIDA is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _XDG_H
+#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"
 
 
diff --git a/src/xdg.c b/src/xdg.c
deleted file mode 100644
index 6541e89..0000000
--- a/src/xdg.c
+++ /dev/null
@@ -1,103 +0,0 @@
-
-/* OpenIDA - Outil d'analyse de fichiers binaires
- * xdg.c - compléments mineurs au support Freedesktop
- *
- * Copyright (C) 2008 Cyrille Bagard
- *
- *  This file is part of OpenIDA.
- *
- *  OpenIDA is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  OpenIDA is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#include "xdg.h"
-
-
-#include <dirent.h>
-#include <malloc.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : suffix = élément visé dans le répertoire de configuration.   *
-*                                                                             *
-*  Description : Détermine le chemin d'un répertoire selon les specs. XDG.    *
-*                                                                             *
-*  Retour      : Chemin d'accès aux configurations personnelles ou NULL.      *
-*                                                                             *
-*  Remarques   : cf. http://standards.freedesktop.org/basedir-spec/.          *
-*                                                                             *
-******************************************************************************/
-
-char *get_xdg_config_dir(const char *suffix)
-{
-    char *result;                           /* Chemin d'accès à renvoyer   */
-    const char *env;                        /* Valeur de l'environnement   */
-    DIR *directory;                         /* Répertoire avec contenu ?   */
-    struct dirent *entry;                   /* Elément de répertoire       */
-
-    result = NULL;
-
-    env = getenv("XDG_CONFIG_HOME");
-
-    if (env != NULL && env[0] != '\0')
-    {
-        directory = opendir(env);
-        if (directory == NULL) goto default_cfg_dir;
-
-        for (entry = readdir(directory); entry != NULL && result == NULL; entry = readdir(directory))
-        {
-            if (strcmp(entry->d_name, ".") == 0) continue;
-            if (strcmp(entry->d_name, "..") == 0) continue;
-
-            result = (char *)calloc(strlen(env) + 2 + strlen(suffix) + 1, sizeof(char));
-            strcpy(result, env);
-
-            if (env[strlen(env) - 1] != '/')
-                strcat(result, "/");
-
-            strcat(result, ".");
-            strcat(result, suffix);
-
-        }
-
-        closedir(directory);
-
-    }
-
- default_cfg_dir:
-
-    if (result == NULL)
-    {
-        env = getenv("HOME");
-        if (env == NULL || env[0] == '\0') return NULL;
-
-        result = (char *)calloc(strlen(env) + 1 + strlen(".config/") + strlen(suffix) + 1, sizeof(char));
-
-        strcpy(result, env);
-
-        if (env[strlen(env) - 1] != '/')
-            strcat(result, "/");
-
-        strcat(result, ".config/");
-        strcat(result, suffix);
-
-    }
-
-    return result;
-
-}
diff --git a/src/xdg.h b/src/xdg.h
deleted file mode 100644
index c8cd97d..0000000
--- a/src/xdg.h
+++ /dev/null
@@ -1,34 +0,0 @@
-
-/* OpenIDA - Outil d'analyse de fichiers binaires
- * xdg.h - prototypes pour des compléments mineurs au support Freedesktop
- *
- * Copyright (C) 2008 Cyrille Bagard
- *
- *  This file is part of OpenIDA.
- *
- *  OpenIDA is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  OpenIDA is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef _XDG_H
-#define _XDG_H
-
-
-
-/* Détermine le chemin d'un répertoire selon les specs. XDG. */
-char *get_xdg_config_dir(const char *);
-
-
-
-#endif  /* _XDG_H */
-- 
cgit v0.11.2-87-g4458