From 95b1305613dada364c437cf8005398f4d0769dd6 Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Wed, 25 Jan 2017 14:06:41 +0100 Subject: [PATCH] Refactor config fallback Before this, there was a function which attempted to load different configuration files in the right order. There was a boolean argument that decided if we are actually loading it or just checking for syntax error (for the --check argument of awesome). This lead to some not-so-nice code since we do not want to fall-back to another config when checking for syntax errors. Refactor this so that there is now a function which calls a callback function with the different paths that should be tried. This function returns as soon as the callback function returns true. Since just checking if the config syntax is ok does not depend on any Lua state, an empty Lua state is now used for this. Signed-off-by: Uli Schlachter --- awesome.c | 25 +++++++++++++++++++++++-- luaa.c | 51 ++++++++++++++++++++++++--------------------------- luaa.h | 5 ++++- 3 files changed, 51 insertions(+), 30 deletions(-) diff --git a/awesome.c b/awesome.c index 2f0213ca..325b7842 100644 --- a/awesome.c +++ b/awesome.c @@ -433,6 +433,12 @@ restart_on_signal(gpointer data) return TRUE; } +static bool +true_config_callback(const char *unused) +{ + return true; +} + /** Print help and exit(2) with given exit_code. * \param exit_code The exit code. */ @@ -564,7 +570,22 @@ main(int argc, char **argv) if (run_test) { - if(!luaA_parserc(&xdg, confpath, false)) + bool success = true; + /* Get the first config that will be tried */ + const char *config = luaA_find_config(&xdg, confpath, true_config_callback); + + /* Try to parse it */ + lua_State *L = luaL_newstate(); + if(luaL_loadfile(L, config)) + { + const char *err = lua_tostring(L, -1); + fprintf(stderr, "%s\n", err); + success = false; + } + p_delete(&config); + lua_close(L); + + if(!success) { fprintf(stderr, "✘ Configuration file syntax error.\n"); return EXIT_FAILURE; @@ -738,7 +759,7 @@ main(int argc, char **argv) root_update_wallpaper(); /* Parse and run configuration file */ - if (!luaA_parserc(&xdg, confpath, true)) + if (!luaA_parserc(&xdg, confpath)) fatal("couldn't find any rc file"); p_delete(&confpath); diff --git a/luaa.c b/luaa.c index 0f139d65..26e78bdb 100644 --- a/luaa.c +++ b/luaa.c @@ -804,7 +804,7 @@ luaA_startup_error(const char *err) } static bool -luaA_loadrc(const char *confpath, bool run) +luaA_loadrc(const char *confpath) { lua_State *L = globalconf_get_lua_State(); if(luaL_loadfile(L, confpath)) @@ -816,12 +816,6 @@ luaA_loadrc(const char *confpath, bool run) return false; } - if(!run) - { - lua_pop(L, 1); - return true; - } - /* Set the conffile right now so it can be used inside the * configuration file. */ conffile = a_strdup(confpath); @@ -852,21 +846,28 @@ luaA_loadrc(const char *confpath, bool run) * \param run Run the configuration file. */ bool -luaA_parserc(xdgHandle* xdg, const char *confpatharg, bool run) +luaA_parserc(xdgHandle* xdg, const char *confpatharg) +{ + const char *confpath = luaA_find_config(xdg, confpatharg, luaA_loadrc); + bool ret = confpath != NULL; + p_delete(&confpath); + + return ret; +} + +/** Find a config file for which the given callback returns true. + * \param xdg An xdg handle to use to get XDG basedir. + * \param confpatharg The configuration file to load. + * \param callback The callback to call. + */ +const char * +luaA_find_config(xdgHandle* xdg, const char *confpatharg, luaA_config_callback *callback) { char *confpath = NULL; - bool ret = false; - /* try to load, return if it's ok */ - if(confpatharg) + if(confpatharg && callback(confpatharg)) { - if(luaA_loadrc(confpatharg, run)) - { - ret = true; - goto bailout; - } - else if(!run) - goto bailout; + return a_strdup(confpatharg); } confpath = xdgConfigFind("awesome/rc.lua", xdg); @@ -876,21 +877,17 @@ luaA_parserc(xdgHandle* xdg, const char *confpatharg, bool run) /* confpath is "string1\0string2\0string3\0\0" */ while(*tmp) { - if(luaA_loadrc(tmp, run)) + if(callback(tmp)) { - ret = true; - goto bailout; + const char *ret = a_strdup(tmp); + p_delete(&confpath); + return ret; } - else if(!run) - goto bailout; tmp += a_strlen(tmp) + 1; } -bailout: - p_delete(&confpath); - - return ret; + return NULL; } int diff --git a/luaa.h b/luaa.h index 01a03ec6..d1420d3d 100644 --- a/luaa.h +++ b/luaa.h @@ -303,8 +303,11 @@ luaA_registerfct(lua_State *L, int idx, int *fct) return luaA_register(L, idx, fct); } +typedef bool luaA_config_callback(const char *); + void luaA_init(xdgHandle *, string_array_t *); -bool luaA_parserc(xdgHandle *, const char *, bool); +const char *luaA_find_config(xdgHandle *, const char *, luaA_config_callback *); +bool luaA_parserc(xdgHandle *, const char *); /** Global signals */ signal_array_t global_signals;