summaryrefslogtreecommitdiff
path: root/shared/config-parser.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2013-09-21 23:17:35 -0700
committerKristian Høgsberg <krh@bitplanet.net>2013-09-21 23:17:35 -0700
commiteeefc9e3119bbf2a659e5a71ce21dbc774251308 (patch)
tree74ff3b275c2f04f383754ca004ebd0baa4100140 /shared/config-parser.c
parent1abe0486bbb51c9c8517f8d5a347c6f46830de89 (diff)
compositor: Log the full path of the config file we're using
Diffstat (limited to 'shared/config-parser.c')
-rw-r--r--shared/config-parser.c73
1 files changed, 37 insertions, 36 deletions
diff --git a/shared/config-parser.c b/shared/config-parser.c
index 1cee946b..e1bf212f 100644
--- a/shared/config-parser.c
+++ b/shared/config-parser.c
@@ -41,18 +41,36 @@
const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
+struct weston_config_entry {
+ char *key;
+ char *value;
+ struct wl_list link;
+};
+
+struct weston_config_section {
+ char *name;
+ struct wl_list entry_list;
+ struct wl_list link;
+};
+
+struct weston_config {
+ struct wl_list section_list;
+ char path[PATH_MAX];
+};
+
static int
-open_config_file(const char *name)
+open_config_file(struct weston_config *c, const char *name)
{
const char *config_dir = getenv("XDG_CONFIG_HOME");
const char *home_dir = getenv("HOME");
const char *config_dirs = getenv("XDG_CONFIG_DIRS");
- char path[PATH_MAX];
const char *p, *next;
int fd;
- if (name[0] == '/')
+ if (name[0] == '/') {
+ snprintf(c->path, sizeof c->path, "%s", name);
return open(name, O_RDONLY | O_CLOEXEC);
+ }
/* Precedence is given to config files in the home directory,
* and then to directories listed in XDG_CONFIG_DIRS and
@@ -60,16 +78,17 @@ open_config_file(const char *name)
/* $XDG_CONFIG_HOME */
if (config_dir) {
- snprintf(path, sizeof path, "%s/%s", config_dir, name);
- fd = open(path, O_RDONLY | O_CLOEXEC);
+ snprintf(c->path, sizeof c->path, "%s/%s", config_dir, name);
+ fd = open(c->path, O_RDONLY | O_CLOEXEC);
if (fd >= 0)
return fd;
}
/* $HOME/.config */
if (home_dir) {
- snprintf(path, sizeof path, "%s/.config/%s", home_dir, name);
- fd = open(path, O_RDONLY | O_CLOEXEC);
+ snprintf(c->path, sizeof c->path,
+ "%s/.config/%s", home_dir, name);
+ fd = open(c->path, O_RDONLY | O_CLOEXEC);
if (fd >= 0)
return fd;
}
@@ -80,9 +99,9 @@ open_config_file(const char *name)
for (p = config_dirs; *p != '\0'; p = next) {
next = strchrnul(p, ':');
- snprintf(path, sizeof path,
+ snprintf(c->path, sizeof c->path,
"%.*s/weston/%s", (int)(next - p), p, name);
- fd = open(path, O_RDONLY | O_CLOEXEC);
+ fd = open(c->path, O_RDONLY | O_CLOEXEC);
if (fd >= 0)
return fd;
@@ -91,35 +110,11 @@ open_config_file(const char *name)
}
/* Current working directory. */
- snprintf(path, sizeof path, "./%s", name);
- fd = open(path, O_RDONLY | O_CLOEXEC);
-
- if (fd >= 0)
- fprintf(stderr,
- "using config in current working directory: %s\n",
- path);
- else
- fprintf(stderr, "config file \"%s\" not found.\n", name);
+ snprintf(c->path, sizeof c->path, "./%s", name);
- return fd;
+ return open(c->path, O_RDONLY | O_CLOEXEC);
}
-struct weston_config_entry {
- char *key;
- char *value;
- struct wl_list link;
-};
-
-struct weston_config_section {
- char *name;
- struct wl_list entry_list;
- struct wl_list link;
-};
-
-struct weston_config {
- struct wl_list section_list;
-};
-
static struct weston_config_entry *
config_section_get_entry(struct weston_config_section *section,
const char *key)
@@ -329,7 +324,7 @@ weston_config_parse(const char *name)
wl_list_init(&config->section_list);
- fd = open_config_file(name);
+ fd = open_config_file(config, name);
if (fd == -1) {
free(config);
return NULL;
@@ -387,6 +382,12 @@ weston_config_parse(const char *name)
return config;
}
+const char *
+weston_config_get_full_path(struct weston_config *config)
+{
+ return config->path;
+}
+
int
weston_config_next_section(struct weston_config *config,
struct weston_config_section **section,