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;