diff options
Diffstat (limited to 'src/xdg.c')
-rw-r--r-- | src/xdg.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/xdg.c b/src/xdg.c new file mode 100644 index 0000000..6541e89 --- /dev/null +++ b/src/xdg.c @@ -0,0 +1,103 @@ + +/* 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; + +} |