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,69 +41,6 @@ const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) -static int -open_config_file(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] == '/') - 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 - * finally to the current working directory. */ - - /* $XDG_CONFIG_HOME */ - if (config_dir) { - snprintf(path, sizeof path, "%s/%s", config_dir, name); - fd = open(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); - if (fd >= 0) - return fd; - } - - /* For each $XDG_CONFIG_DIRS: weston/ */ - if (!config_dirs) - config_dirs = "/etc/xdg"; /* See XDG base dir spec. */ - - for (p = config_dirs; *p != '\0'; p = next) { - next = strchrnul(p, ':'); - snprintf(path, sizeof path, - "%.*s/weston/%s", (int)(next - p), p, name); - fd = open(path, O_RDONLY | O_CLOEXEC); - if (fd >= 0) - return fd; - - if (*next == ':') - next++; - } - - /* 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); - - return fd; -} - struct weston_config_entry { char *key; char *value; @@ -118,8 +55,66 @@ struct weston_config_section { struct weston_config { struct wl_list section_list; + char path[PATH_MAX]; }; +static int +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"); + const char *p, *next; + int fd; + + 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 + * finally to the current working directory. */ + + /* $XDG_CONFIG_HOME */ + if (config_dir) { + 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(c->path, sizeof c->path, + "%s/.config/%s", home_dir, name); + fd = open(c->path, O_RDONLY | O_CLOEXEC); + if (fd >= 0) + return fd; + } + + /* For each $XDG_CONFIG_DIRS: weston/ */ + if (!config_dirs) + config_dirs = "/etc/xdg"; /* See XDG base dir spec. */ + + for (p = config_dirs; *p != '\0'; p = next) { + next = strchrnul(p, ':'); + snprintf(c->path, sizeof c->path, + "%.*s/weston/%s", (int)(next - p), p, name); + fd = open(c->path, O_RDONLY | O_CLOEXEC); + if (fd >= 0) + return fd; + + if (*next == ':') + next++; + } + + /* Current working directory. */ + snprintf(c->path, sizeof c->path, "./%s", name); + + return open(c->path, O_RDONLY | O_CLOEXEC); +} + 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, diff --git a/shared/config-parser.h b/shared/config-parser.h index 56e390f6..745562bc 100644 --- a/shared/config-parser.h +++ b/shared/config-parser.h @@ -95,6 +95,9 @@ weston_config_section_get_bool(struct weston_config_section *section, struct weston_config * weston_config_parse(const char *name); +const char * +weston_config_get_full_path(struct weston_config *config); + void weston_config_destroy(struct weston_config *config); diff --git a/src/compositor.c b/src/compositor.c index 0abc93bf..35a5605b 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -3487,6 +3487,8 @@ int main(int argc, char *argv[]) } config = weston_config_parse("weston.ini"); + weston_log("Using config file '%s'\n", + weston_config_get_full_path(config)); section = weston_config_get_section(config, "core", NULL, NULL); weston_config_section_get_string(section, "modules", &modules, "");