summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOssama Othman <ossama.othman@intel.com>2013-05-14 09:48:26 -0700
committerKristian Høgsberg <krh@bitplanet.net>2013-05-14 14:36:37 -0400
commita50e6e4c500e3080b8df7ec14c7e42741477a423 (patch)
tree0cae5b3f325814e7f2d859eaa3f2c2415c69eb33 /src
parent95eb3a2eb470bd341ab078c7e48a28ffebc6dde1 (diff)
downloadweston-a50e6e4c500e3080b8df7ec14c7e42741477a423.tar.gz
weston-a50e6e4c500e3080b8df7ec14c7e42741477a423.tar.bz2
weston-a50e6e4c500e3080b8df7ec14c7e42741477a423.zip
config-parser: Honor XDG_CONFIG_DIRS
This set of changes adds support for searching for a given config file in the directories listed in $XDG_CONFIG_DIRS if it wasn't found in $XDG_CONFIG_HOME or ~/.config. This allows packages to install custom config files in /etc/xdg/weston, for example, thus allowing them to avoid dealing with home directories. To avoid a TOCTOU race the config file is actually open()ed during the search. Its file descriptor is returned and stored in the compositor for later use when performing subsequent config file parses. Signed-off-by: Ossama Othman <ossama.othman@intel.com>
Diffstat (limited to 'src')
-rw-r--r--src/cms-static.c4
-rw-r--r--src/compositor-drm.c10
-rw-r--r--src/compositor-fbdev.c8
-rw-r--r--src/compositor-headless.c8
-rw-r--r--src/compositor-rdp.c4
-rw-r--r--src/compositor-rpi.c8
-rw-r--r--src/compositor-wayland.c8
-rw-r--r--src/compositor-x11.c10
-rw-r--r--src/compositor.c31
-rw-r--r--src/compositor.h8
-rw-r--r--src/shell.c8
-rw-r--r--src/tablet-shell.c2
-rw-r--r--src/text-backend.c9
-rw-r--r--src/xwayland/launcher.c2
14 files changed, 62 insertions, 58 deletions
diff --git a/src/cms-static.c b/src/cms-static.c
index be8e63eb..94fea99d 100644
--- a/src/cms-static.c
+++ b/src/cms-static.c
@@ -131,7 +131,7 @@ output_section_done(void *data)
WL_EXPORT int
module_init(struct weston_compositor *ec,
- int *argc, char *argv[], const char *config_file)
+ int *argc, char *argv[])
{
struct cms_static *cms;
struct weston_output *output;
@@ -157,7 +157,7 @@ module_init(struct weston_compositor *ec,
ARRAY_LENGTH(drm_config_keys), output_section_done },
};
- parse_config_file(config_file, config_section,
+ parse_config_file(ec->config_fd, config_section,
ARRAY_LENGTH(config_section), cms);
cms->destroy_listener.notify = cms_notifier_destroy;
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index 9dce8092..35019e06 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -2362,7 +2362,7 @@ planes_binding(struct weston_seat *seat, uint32_t time, uint32_t key, void *data
static struct weston_compositor *
drm_compositor_create(struct wl_display *display,
int connector, const char *seat, int tty, int pixman,
- int *argc, char *argv[], const char *config_file)
+ int *argc, char *argv[], int config_fd)
{
struct drm_compositor *ec;
struct udev_device *drm_device;
@@ -2385,7 +2385,7 @@ drm_compositor_create(struct wl_display *display,
ec->use_pixman = pixman;
if (weston_compositor_init(&ec->base, display, argc, argv,
- config_file) < 0) {
+ config_fd) < 0) {
weston_log("%s failed\n", __func__);
goto err_base;
}
@@ -2666,7 +2666,7 @@ output_section_done(void *data)
WL_EXPORT struct weston_compositor *
backend_init(struct wl_display *display, int *argc, char *argv[],
- const char *config_file)
+ int config_fd)
{
int connector = 0, tty = 0, use_pixman = 0;
const char *seat = default_seat;
@@ -2694,9 +2694,9 @@ backend_init(struct wl_display *display, int *argc, char *argv[],
ARRAY_LENGTH(drm_config_keys), output_section_done },
};
- parse_config_file(config_file, config_section,
+ parse_config_file(config_fd, config_section,
ARRAY_LENGTH(config_section), NULL);
return drm_compositor_create(display, connector, seat, tty, use_pixman,
- argc, argv, config_file);
+ argc, argv, config_fd);
}
diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c
index 0f458585..21028a51 100644
--- a/src/compositor-fbdev.c
+++ b/src/compositor-fbdev.c
@@ -835,7 +835,7 @@ switch_vt_binding(struct weston_seat *seat, uint32_t time, uint32_t key, void *d
static struct weston_compositor *
fbdev_compositor_create(struct wl_display *display, int *argc, char *argv[],
- const char *config_file, struct fbdev_parameters *param)
+ int config_fd, struct fbdev_parameters *param)
{
struct fbdev_compositor *compositor;
const char *seat = default_seat;
@@ -848,7 +848,7 @@ fbdev_compositor_create(struct wl_display *display, int *argc, char *argv[],
return NULL;
if (weston_compositor_init(&compositor->base, display, argc, argv,
- config_file) < 0)
+ config_fd) < 0)
goto out_free;
compositor->udev = udev_new();
@@ -906,7 +906,7 @@ out_free:
WL_EXPORT struct weston_compositor *
backend_init(struct wl_display *display, int *argc, char *argv[],
- const char *config_file)
+ int config_fd)
{
/* TODO: Ideally, available frame buffers should be enumerated using
* udev, rather than passing a device node in as a parameter. */
@@ -922,6 +922,6 @@ backend_init(struct wl_display *display, int *argc, char *argv[],
parse_options(fbdev_options, ARRAY_LENGTH(fbdev_options), argc, argv);
- return fbdev_compositor_create(display, argc, argv, config_file,
+ return fbdev_compositor_create(display, argc, argv, config_fd,
&param);
}
diff --git a/src/compositor-headless.c b/src/compositor-headless.c
index 47203294..0df0f7db 100644
--- a/src/compositor-headless.c
+++ b/src/compositor-headless.c
@@ -158,7 +158,7 @@ headless_destroy(struct weston_compositor *ec)
static struct weston_compositor *
headless_compositor_create(struct wl_display *display,
int width, int height, const char *display_name,
- int *argc, char *argv[], const char *config_file)
+ int *argc, char *argv[], int config_fd)
{
struct headless_compositor *c;
@@ -169,7 +169,7 @@ headless_compositor_create(struct wl_display *display,
memset(c, 0, sizeof *c);
if (weston_compositor_init(&c->base, display, argc, argv,
- config_file) < 0)
+ config_fd) < 0)
goto err_free;
weston_seat_init(&c->fake_seat, &c->base);
@@ -194,7 +194,7 @@ err_free:
WL_EXPORT struct weston_compositor *
backend_init(struct wl_display *display, int *argc, char *argv[],
- const char *config_file)
+ int config_fd)
{
int width = 1024, height = 640;
char *display_name = NULL;
@@ -208,5 +208,5 @@ backend_init(struct wl_display *display, int *argc, char *argv[],
ARRAY_LENGTH(headless_options), argc, argv);
return headless_compositor_create(display, width, height, display_name,
- argc, argv, config_file);
+ argc, argv, config_fd);
}
diff --git a/src/compositor-rdp.c b/src/compositor-rdp.c
index 51ef4756..0dae9639 100644
--- a/src/compositor-rdp.c
+++ b/src/compositor-rdp.c
@@ -928,7 +928,7 @@ rdp_incoming_peer(freerdp_listener *instance, freerdp_peer *client)
static struct weston_compositor *
rdp_compositor_create(struct wl_display *display,
struct rdp_compositor_config *config,
- int *argc, char *argv[], const char *config_file)
+ int *argc, char *argv[], int config_fd)
{
struct rdp_compositor *c;
char *fd_str;
@@ -941,7 +941,7 @@ rdp_compositor_create(struct wl_display *display,
memset(c, 0, sizeof *c);
if (weston_compositor_init(&c->base, display, argc, argv,
- config_file) < 0)
+ config_fd) < 0)
goto err_free;
weston_seat_init(&c->main_seat, &c->base);
diff --git a/src/compositor-rpi.c b/src/compositor-rpi.c
index 8f3f2e90..3cb2b56e 100644
--- a/src/compositor-rpi.c
+++ b/src/compositor-rpi.c
@@ -1441,7 +1441,7 @@ struct rpi_parameters {
static struct weston_compositor *
rpi_compositor_create(struct wl_display *display, int *argc, char *argv[],
- const char *config_file, struct rpi_parameters *param)
+ int config_fd, struct rpi_parameters *param)
{
struct rpi_compositor *compositor;
const char *seat = default_seat;
@@ -1464,7 +1464,7 @@ rpi_compositor_create(struct wl_display *display, int *argc, char *argv[],
return NULL;
if (weston_compositor_init(&compositor->base, display, argc, argv,
- config_file) < 0)
+ config_fd) < 0)
goto out_free;
compositor->udev = udev_new();
@@ -1554,7 +1554,7 @@ out_free:
WL_EXPORT struct weston_compositor *
backend_init(struct wl_display *display, int *argc, char *argv[],
- const char *config_file)
+ int config_fd)
{
struct rpi_parameters param = {
.tty = 0, /* default to current tty */
@@ -1571,5 +1571,5 @@ backend_init(struct wl_display *display, int *argc, char *argv[],
parse_options(rpi_options, ARRAY_LENGTH(rpi_options), argc, argv);
- return rpi_compositor_create(display, argc, argv, config_file, &param);
+ return rpi_compositor_create(display, argc, argv, config_fd, &param);
}
diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
index 44d234c0..4112401f 100644
--- a/src/compositor-wayland.c
+++ b/src/compositor-wayland.c
@@ -721,7 +721,7 @@ wayland_destroy(struct weston_compositor *ec)
static struct weston_compositor *
wayland_compositor_create(struct wl_display *display,
int width, int height, const char *display_name,
- int *argc, char *argv[], const char *config_file)
+ int *argc, char *argv[], int config_fd)
{
struct wayland_compositor *c;
struct wl_event_loop *loop;
@@ -734,7 +734,7 @@ wayland_compositor_create(struct wl_display *display,
memset(c, 0, sizeof *c);
if (weston_compositor_init(&c->base, display, argc, argv,
- config_file) < 0)
+ config_fd) < 0)
goto err_free;
c->parent.wl_display = wl_display_connect(display_name);
@@ -797,7 +797,7 @@ err_free:
WL_EXPORT struct weston_compositor *
backend_init(struct wl_display *display, int *argc, char *argv[],
- const char *config_file)
+ int config_fd)
{
int width = 1024, height = 640;
char *display_name = NULL;
@@ -812,5 +812,5 @@ backend_init(struct wl_display *display, int *argc, char *argv[],
ARRAY_LENGTH(wayland_options), argc, argv);
return wayland_compositor_create(display, width, height, display_name,
- argc, argv, config_file);
+ argc, argv, config_fd);
}
diff --git a/src/compositor-x11.c b/src/compositor-x11.c
index 21304a02..ea0d4b9e 100644
--- a/src/compositor-x11.c
+++ b/src/compositor-x11.c
@@ -1383,7 +1383,7 @@ x11_compositor_create(struct wl_display *display,
int fullscreen,
int no_input,
int use_pixman,
- int *argc, char *argv[], const char *config_file)
+ int *argc, char *argv[], int config_fd)
{
struct x11_compositor *c;
struct x11_configured_output *o;
@@ -1401,7 +1401,7 @@ x11_compositor_create(struct wl_display *display,
memset(c, 0, sizeof *c);
if (weston_compositor_init(&c->base, display, argc, argv,
- config_file) < 0)
+ config_fd) < 0)
goto err_free;
c->dpy = XOpenDisplay(NULL);
@@ -1574,7 +1574,7 @@ err_free:
WL_EXPORT struct weston_compositor *
backend_init(struct wl_display *display, int *argc, char *argv[],
- const char *config_file)
+ int config_fd)
{
int fullscreen = 0;
int no_input = 0;
@@ -1604,12 +1604,12 @@ backend_init(struct wl_display *display, int *argc, char *argv[],
ARRAY_LENGTH(x11_config_keys), output_section_done },
};
- parse_config_file(config_file, config_section,
+ parse_config_file(config_fd, config_section,
ARRAY_LENGTH(config_section), NULL);
return x11_compositor_create(display,
fullscreen,
no_input,
use_pixman,
- argc, argv, config_file);
+ argc, argv, config_fd);
}
diff --git a/src/compositor.c b/src/compositor.c
index c16bf0ce..89b9cefb 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -2686,7 +2686,7 @@ WL_EXPORT int
weston_compositor_init(struct weston_compositor *ec,
struct wl_display *display,
int *argc, char *argv[],
- const char *config_file)
+ int config_fd)
{
struct wl_event_loop *loop;
struct xkb_rule_names xkb_names;
@@ -2703,7 +2703,9 @@ weston_compositor_init(struct weston_compositor *ec,
};
memset(&xkb_names, 0, sizeof(xkb_names));
- parse_config_file(config_file, cs, ARRAY_LENGTH(cs), ec);
+
+ ec->config_fd = config_fd;
+ parse_config_file(config_fd, cs, ARRAY_LENGTH(cs), ec);
ec->wl_display = display;
wl_signal_init(&ec->destroy_signal);
@@ -2789,6 +2791,8 @@ weston_compositor_shutdown(struct weston_compositor *ec)
weston_plane_release(&ec->primary_plane);
wl_event_loop_destroy(ec->input_loop);
+
+ close(ec->config_fd);
}
WL_EXPORT void
@@ -2945,12 +2949,12 @@ load_module(const char *name, const char *entrypoint)
static int
load_modules(struct weston_compositor *ec, const char *modules,
- int *argc, char *argv[], const char *config_file)
+ int *argc, char *argv[])
{
const char *p, *end;
char buffer[256];
int (*module_init)(struct weston_compositor *ec,
- int *argc, char *argv[], const char *config_file);
+ int *argc, char *argv[]);
if (modules == NULL)
return 0;
@@ -2961,7 +2965,7 @@ load_modules(struct weston_compositor *ec, const char *modules,
snprintf(buffer, sizeof buffer, "%.*s", (int) (end - p), p);
module_init = load_module(buffer, "module_init");
if (module_init)
- module_init(ec, argc, argv, config_file);
+ module_init(ec, argc, argv);
p = end;
while (*p == ',')
p++;
@@ -3087,8 +3091,8 @@ int main(int argc, char *argv[])
struct wl_event_loop *loop;
struct weston_compositor
*(*backend_init)(struct wl_display *display,
- int *argc, char *argv[], const char *config_file);
- int i;
+ int *argc, char *argv[], int config_fd);
+ int i, config_fd;
char *backend = NULL;
const char *modules = "desktop-shell.so", *option_modules = NULL;
char *log = NULL;
@@ -3096,7 +3100,6 @@ int main(int argc, char *argv[])
int32_t help = 0;
char *socket_name = "wayland-0";
int32_t version = 0;
- char *config_file;
const struct config_key core_config_keys[] = {
{ "modules", CONFIG_KEY_STRING, &modules },
@@ -3162,14 +3165,14 @@ int main(int argc, char *argv[])
backend = WESTON_NATIVE_BACKEND;
}
- config_file = config_file_path("weston.ini");
- parse_config_file(config_file, cs, ARRAY_LENGTH(cs), NULL);
+ config_fd = open_config_file("weston.ini");
+ parse_config_file(config_fd, cs, ARRAY_LENGTH(cs), NULL);
backend_init = load_module(backend, "backend_init");
if (!backend_init)
exit(EXIT_FAILURE);
- ec = backend_init(display, &argc, argv, config_file);
+ ec = backend_init(display, &argc, argv, config_fd);
if (ec == NULL) {
weston_log("fatal: failed to create compositor\n");
exit(EXIT_FAILURE);
@@ -3182,13 +3185,11 @@ int main(int argc, char *argv[])
setenv("WAYLAND_DISPLAY", socket_name, 1);
- if (load_modules(ec, modules, &argc, argv, config_file) < 0)
+ if (load_modules(ec, modules, &argc, argv) < 0)
goto out;
- if (load_modules(ec, option_modules, &argc, argv, config_file) < 0)
+ if (load_modules(ec, option_modules, &argc, argv) < 0)
goto out;
- free(config_file);
-
for (i = 1; i < argc; i++)
weston_log("fatal: unhandled option: %s\n", argv[i]);
if (argc > 1) {
diff --git a/src/compositor.h b/src/compositor.h
index 99468a16..318fc0d3 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -545,6 +545,8 @@ struct weston_compositor {
struct xkb_rule_names xkb_names;
struct xkb_context *xkb_context;
struct weston_xkb_info xkb_info;
+
+ int config_fd;
};
struct weston_buffer_reference {
@@ -987,7 +989,7 @@ weston_compositor_get_time(void);
int
weston_compositor_init(struct weston_compositor *ec, struct wl_display *display,
- int *argc, char *argv[], const char *config_file);
+ int *argc, char *argv[], int config_fd);
void
weston_compositor_shutdown(struct weston_compositor *ec);
void
@@ -1125,11 +1127,11 @@ noop_renderer_init(struct weston_compositor *ec);
struct weston_compositor *
backend_init(struct wl_display *display, int *argc, char *argv[],
- const char *config_file);
+ int config_fd);
int
module_init(struct weston_compositor *compositor,
- int *argc, char *argv[], const char *config_file);
+ int *argc, char *argv[]);
void
weston_transformed_coord(int width, int height,
diff --git a/src/shell.c b/src/shell.c
index 5da649dd..d5b5fcf5 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -375,7 +375,7 @@ get_animation_type(char *animation)
}
static void
-shell_configuration(struct desktop_shell *shell, const char *config_file)
+shell_configuration(struct desktop_shell *shell, int config_fd)
{
char *path = NULL;
int duration = 60;
@@ -400,7 +400,7 @@ shell_configuration(struct desktop_shell *shell, const char *config_file)
{ "screensaver", saver_keys, ARRAY_LENGTH(saver_keys), NULL },
};
- parse_config_file(config_file, cs, ARRAY_LENGTH(cs), shell);
+ parse_config_file(config_fd, cs, ARRAY_LENGTH(cs), shell);
shell->screensaver.path = path;
shell->screensaver.duration = duration * 1000;
@@ -4286,7 +4286,7 @@ shell_add_bindings(struct weston_compositor *ec, struct desktop_shell *shell)
WL_EXPORT int
module_init(struct weston_compositor *ec,
- int *argc, char *argv[], const char *config_file)
+ int *argc, char *argv[])
{
struct weston_seat *seat;
struct desktop_shell *shell;
@@ -4333,7 +4333,7 @@ module_init(struct weston_compositor *ec,
wl_array_init(&shell->workspaces.array);
wl_list_init(&shell->workspaces.client_list);
- shell_configuration(shell, config_file);
+ shell_configuration(shell, ec->config_fd);
for (i = 0; i < shell->workspaces.num; i++) {
pws = wl_array_add(&shell->workspaces.array, sizeof *pws);
diff --git a/src/tablet-shell.c b/src/tablet-shell.c
index 7c75c1bb..cae8acfd 100644
--- a/src/tablet-shell.c
+++ b/src/tablet-shell.c
@@ -527,7 +527,7 @@ tablet_shell_destroy(struct wl_listener *listener, void *data)
WL_EXPORT int
module_init(struct weston_compositor *compositor,
- int *argc, char *argv[], const char *config_file)
+ int *argc, char *argv[])
{
struct tablet_shell *shell;
struct wl_event_loop *loop;
diff --git a/src/text-backend.c b/src/text-backend.c
index 92efd9f3..da62fd74 100644
--- a/src/text-backend.c
+++ b/src/text-backend.c
@@ -23,6 +23,7 @@
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "compositor.h"
#include "text-server-protocol.h"
@@ -885,7 +886,7 @@ handle_seat_created(struct wl_listener *listener,
static void
text_backend_configuration(struct text_backend *text_backend)
{
- char *config_file;
+ int config_fd;
char *path = NULL;
struct config_key input_method_keys[] = {
@@ -896,9 +897,9 @@ text_backend_configuration(struct text_backend *text_backend)
{ "input-method", input_method_keys, ARRAY_LENGTH(input_method_keys), NULL }
};
- config_file = config_file_path("weston.ini");
- parse_config_file(config_file, cs, ARRAY_LENGTH(cs), text_backend);
- free(config_file);
+ config_fd = open_config_file("weston.ini");
+ parse_config_file(config_fd, cs, ARRAY_LENGTH(cs), text_backend);
+ close(config_fd);
if (path)
text_backend->input_method.path = path;
diff --git a/src/xwayland/launcher.c b/src/xwayland/launcher.c
index e50177e6..664cf6ca 100644
--- a/src/xwayland/launcher.c
+++ b/src/xwayland/launcher.c
@@ -316,7 +316,7 @@ weston_xserver_destroy(struct wl_listener *l, void *data)
WL_EXPORT int
module_init(struct weston_compositor *compositor,
- int *argc, char *argv[], const char *config_file)
+ int *argc, char *argv[])
{
struct wl_display *display = compositor->wl_display;