diff options
Diffstat (limited to 'src/common')
-rwxr-xr-x | src/common/Makefile.am | 1 | ||||
-rw-r--r-- | src/common/xdg.c | 189 | ||||
-rw-r--r-- | src/common/xdg.h | 40 |
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 */ |