summaryrefslogtreecommitdiff
path: root/src/common
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/common
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/common')
-rwxr-xr-xsrc/common/Makefile.am1
-rw-r--r--src/common/xdg.c189
-rw-r--r--src/common/xdg.h40
3 files changed, 230 insertions, 0 deletions
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 */