#include "parse.h"
#include <glib.h>
#include <string.h>
+#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
struct Callback {
gchar *tag;
ParseCallback func;
- void *data;
+ gpointer data;
};
struct _ObParseInst {
}
void parse_register(ObParseInst *i, const gchar *tag,
- ParseCallback func, void *data)
+ ParseCallback func, gpointer data)
{
struct Callback *c;
void parse_paths_startup()
{
- gchar *path;
+ const gchar *path;
if (xdg_start)
return;
xdg_start = TRUE;
- path = getenv("XDG_CONFIG_HOME");
+ path = g_getenv("XDG_CONFIG_HOME");
if (path && path[0] != '\0') /* not unset or empty */
xdg_config_home_path = g_build_filename(path, NULL);
else
xdg_config_home_path = g_build_filename(g_get_home_dir(), ".config",
NULL);
- path = getenv("XDG_DATA_HOME");
+ path = g_getenv("XDG_DATA_HOME");
if (path && path[0] != '\0') /* not unset or empty */
xdg_data_home_path = g_build_filename(path, NULL);
else
xdg_data_home_path = g_build_filename(g_get_home_dir(), ".local",
"share", NULL);
- path = getenv("XDG_CONFIG_DIRS");
+ path = g_getenv("XDG_CONFIG_DIRS");
if (path && path[0] != '\0') /* not unset or empty */
xdg_config_dir_paths = split_paths(path);
else {
xdg_config_home_path,
(GSListFunc) g_slist_prepend);
- path = getenv("XDG_DATA_DIRS");
+ path = g_getenv("XDG_DATA_DIRS");
if (path && path[0] != '\0') /* not unset or empty */
xdg_data_dir_paths = split_paths(path);
else {
return ret;
}
-void parse_mkdir_path(const gchar *path, gint mode)
+gboolean parse_mkdir(const gchar *path, gint mode)
+{
+ gboolean ret = TRUE;
+
+ g_return_val_if_fail(path != NULL, FALSE);
+ g_return_val_if_fail(path[0] != '\0', FALSE);
+
+ if (!g_file_test(path, G_FILE_TEST_IS_DIR))
+ if (mkdir(path, mode) == -1)
+ ret = FALSE;
+
+ return ret;
+}
+
+gboolean parse_mkdir_path(const gchar *path, gint mode)
{
- gchar *c, *e;
+ gboolean ret = TRUE;
+
+ g_return_val_if_fail(path != NULL, FALSE);
+ g_return_val_if_fail(path[0] == '/', FALSE);
- g_assert(path[0] == '/');
+ if (!g_file_test(path, G_FILE_TEST_IS_DIR)) {
+ gchar *c, *e;
+
+ c = g_strdup(path);
+ e = c;
+ while ((e = strchr(e + 1, '/'))) {
+ *e = '\0';
+ if (!(ret = parse_mkdir(c, mode)))
+ goto parse_mkdir_path_end;
+ *e = '/';
+ }
+ ret = parse_mkdir(c, mode);
- c = g_strdup(path);
- e = c;
- while ((e = strchr(e + 1, '/'))) {
- *e = '\0';
- mkdir(c, mode);
- *e = '/';
+ parse_mkdir_path_end:
+ g_free(c);
}
- mkdir(c, mode);
- g_free(c);
+
+ return ret;
}
const gchar* parse_xdg_config_home_path()