From abb191e42e356914bd09176a6d6c5bf89ec50bbf Mon Sep 17 00:00:00 2001 From: Cyrille Bagard 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 + + * 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 * 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 . + */ + + +#include "xdg.h" + + +#include +#include +#include +#include +#include +#include +#include + + + +/****************************************************************************** +* * +* 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 . + */ + + +#ifndef _XDG_H +#define _XDG_H + + +#include + + + +/* 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 -#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 . - */ - - -#include "xdg.h" - - -#include -#include -#include -#include - - - -/****************************************************************************** -* * -* 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 . - */ - - -#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