diff options
-rw-r--r-- | clients/desktop-shell.c | 8 | ||||
-rw-r--r-- | clients/tablet-shell.c | 8 | ||||
-rw-r--r-- | clients/terminal.c | 8 | ||||
-rw-r--r-- | clients/window.c | 8 | ||||
-rw-r--r-- | man/weston.ini.man | 12 | ||||
-rw-r--r-- | shared/config-parser.c | 96 | ||||
-rw-r--r-- | shared/config-parser.h | 6 | ||||
-rw-r--r-- | src/cms-static.c | 4 | ||||
-rw-r--r-- | src/compositor-drm.c | 10 | ||||
-rw-r--r-- | src/compositor-fbdev.c | 8 | ||||
-rw-r--r-- | src/compositor-headless.c | 8 | ||||
-rw-r--r-- | src/compositor-rdp.c | 4 | ||||
-rw-r--r-- | src/compositor-rpi.c | 8 | ||||
-rw-r--r-- | src/compositor-wayland.c | 8 | ||||
-rw-r--r-- | src/compositor-x11.c | 10 | ||||
-rw-r--r-- | src/compositor.c | 31 | ||||
-rw-r--r-- | src/compositor.h | 8 | ||||
-rw-r--r-- | src/shell.c | 8 | ||||
-rw-r--r-- | src/tablet-shell.c | 2 | ||||
-rw-r--r-- | src/text-backend.c | 9 | ||||
-rw-r--r-- | src/xwayland/launcher.c | 2 | ||||
-rw-r--r-- | tests/weston-test.c | 2 |
22 files changed, 158 insertions, 110 deletions
diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c index 38af6c6e..39499759 100644 --- a/clients/desktop-shell.c +++ b/clients/desktop-shell.c @@ -1090,7 +1090,7 @@ add_default_launcher(struct desktop *desktop) int main(int argc, char *argv[]) { struct desktop desktop = { 0 }; - char *config_file; + int config_fd; struct output *output; int ret; @@ -1122,11 +1122,11 @@ int main(int argc, char *argv[]) grab_surface_create(&desktop); - config_file = config_file_path("weston.ini"); - ret = parse_config_file(config_file, + config_fd = open_config_file("weston.ini"); + ret = parse_config_file(config_fd, config_sections, ARRAY_LENGTH(config_sections), &desktop); - free(config_file); + close(config_fd); if (ret < 0) add_default_launcher(&desktop); diff --git a/clients/tablet-shell.c b/clients/tablet-shell.c index 99d66f2b..3d5e79ae 100644 --- a/clients/tablet-shell.c +++ b/clients/tablet-shell.c @@ -456,7 +456,7 @@ int main(int argc, char *argv[]) { struct tablet tablet = { 0 }; struct display *display; - char *config_file; + int config_fd; struct output *output; display = display_create(&argc, argv); @@ -478,11 +478,11 @@ int main(int argc, char *argv[]) wl_list_init(&tablet.homescreen->launcher_list); - config_file = config_file_path("weston.ini"); - parse_config_file(config_file, + config_fd = open_config_file("weston.ini"); + parse_config_file(config_fd, config_sections, ARRAY_LENGTH(config_sections), &tablet); - free(config_file); + close(config_fd); signal(SIGCHLD, sigchild_handler); diff --git a/clients/terminal.c b/clients/terminal.c index e80e0e5f..f11a6cc8 100644 --- a/clients/terminal.c +++ b/clients/terminal.c @@ -2671,17 +2671,17 @@ int main(int argc, char *argv[]) { struct display *d; struct terminal *terminal; - char *config_file; + int config_fd; option_shell = getenv("SHELL"); if (!option_shell) option_shell = "/bin/bash"; - config_file = config_file_path("weston.ini"); - parse_config_file(config_file, + config_fd = open_config_file("weston.ini"); + parse_config_file(config_fd, config_sections, ARRAY_LENGTH(config_sections), NULL); - free(config_file); + close(config_fd); parse_options(terminal_options, ARRAY_LENGTH(terminal_options), &argc, argv); diff --git a/clients/window.c b/clients/window.c index 15629579..a742b2f0 100644 --- a/clients/window.c +++ b/clients/window.c @@ -1188,7 +1188,7 @@ static const struct cursor_alternatives cursors[] = { static void create_cursors(struct display *display) { - char *config_file; + int config_fd; char *theme = NULL; unsigned int size = 32; unsigned int i, j; @@ -1201,9 +1201,9 @@ create_cursors(struct display *display) { "shell", shell_keys, ARRAY_LENGTH(shell_keys), NULL }, }; - config_file = config_file_path("weston.ini"); - parse_config_file(config_file, cs, ARRAY_LENGTH(cs), NULL); - free(config_file); + config_fd = open_config_file("weston.ini"); + parse_config_file(config_fd, cs, ARRAY_LENGTH(cs), NULL); + close(config_fd); display->cursor_theme = wl_cursor_theme_load(theme, size, display->shm); display->cursors = diff --git a/man/weston.ini.man b/man/weston.ini.man index 22877306..d37654aa 100644 --- a/man/weston.ini.man +++ b/man/weston.ini.man @@ -24,7 +24,10 @@ server is started: .nf .BR "$XDG_CONFIG_HOME/weston.ini " "(if $XDG_CONFIG_HOME is set)" .BR "$HOME/.config/weston.ini " "(if $HOME is set)" -.BR "<current dir>/weston.ini " "(if both variables were not set)" +.B "weston/weston.ini in each" +.BR "\ \ \ \ $XDG_CONFIG_DIR " "(if $XDG_CONFIG_DIRS is set)" +.BR "/etc/xdg/weston/weston.ini " "(if $XDG_CONFIG_DIRS is not set)" +.BR "<current dir>/weston.ini " "(if no variables were set)" .fi .RE .PP @@ -32,7 +35,12 @@ where environment variable .B $HOME is the user's home directory, and .B $XDG_CONFIG_HOME -is the user specific configuration directory. +is the user specific configuration directory, and +.B $XDG_CONFIG_DIRS +is a colon +.B ':' +delimited listed of configuration base directories, such as +.BR /etc/xdg-foo:/etc/xdg . .PP The .I weston.ini diff --git a/shared/config-parser.c b/shared/config-parser.c index 10ff86a9..652da1fc 100644 --- a/shared/config-parser.c +++ b/shared/config-parser.c @@ -20,11 +20,17 @@ * OF THIS SOFTWARE. */ +#define _GNU_SOURCE /* for stchrnul() */ #include <string.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <ctype.h> +#include <limits.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> #include "config-parser.h" @@ -86,7 +92,7 @@ handle_key(const struct config_key *key, const char *value) } int -parse_config_file(const char *path, +parse_config_file(int fd, const struct config_section *sections, int num_sections, void *data) { @@ -95,12 +101,17 @@ parse_config_file(const char *path, const struct config_section *current = NULL; int i; - fp = fopen(path, "r"); + if (fd == -1) + return -1; + + fp = fdopen(dup(fd), "r"); if (fp == NULL) { - fprintf(stderr, "couldn't open %s\n", path); + perror("couldn't open config file"); return -1; } + rewind(fp); + while (fgets(line, sizeof line, fp)) { if (line[0] == '#' || line[0] == '\n') { continue; @@ -151,37 +162,62 @@ parse_config_file(const char *path, return 0; } -char * -config_file_path(const char *name) +int +open_config_file(const char *name) { - const char dotconf[] = "/.config/"; - const char *config_dir; - const char *home_dir; - char *path; - size_t size; - - config_dir = getenv("XDG_CONFIG_HOME"); - if (!config_dir) { - home_dir = getenv("HOME"); - if (!home_dir) { - fprintf(stderr, "HOME is not set, using cwd.\n"); - return strdup(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; + + /* 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; + } - size = strlen(home_dir) + sizeof dotconf + strlen(name); - path = malloc(size); - if (!path) - return NULL; + /* For each $XDG_CONFIG_DIRS: weston/<config_file> */ + if (!config_dirs) + config_dirs = "/etc/xdg"; /* See XDG base dir spec. */ - snprintf(path, size, "%s%s%s", home_dir, dotconf, name); - return path; + 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++; } - size = strlen(config_dir) + 1 + strlen(name) + 1; - path = malloc(size); - if (!path) - return NULL; + /* 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(path, size, "%s/%s", config_dir, name); - return path; + return fd; } diff --git a/shared/config-parser.h b/shared/config-parser.h index 1d0ee3fc..b4347d72 100644 --- a/shared/config-parser.h +++ b/shared/config-parser.h @@ -48,12 +48,12 @@ struct config_section { }; int -parse_config_file(const char *path, +parse_config_file(int config_fd, const struct config_section *sections, int num_sections, void *data); -char * -config_file_path(const char *name); +int +open_config_file(const char *name); enum weston_option_type { WESTON_OPTION_INTEGER, 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, ¶m); } 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, ¶m); + return rpi_compositor_create(display, argc, argv, config_fd, ¶m); } 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; diff --git a/tests/weston-test.c b/tests/weston-test.c index 612841b5..b629c86c 100644 --- a/tests/weston-test.c +++ b/tests/weston-test.c @@ -225,7 +225,7 @@ idle_launch_client(void *data) WL_EXPORT int module_init(struct weston_compositor *ec, - int *argc, char *argv[], const char *config_file) + int *argc, char *argv[]) { struct weston_test *test; struct wl_event_loop *loop; |