From 5377ec8fba48b0704a88b49287558920e5efbf14 Mon Sep 17 00:00:00 2001 From: Tamas TEVESZ Date: Sat, 9 Oct 2010 01:52:14 +0200 Subject: [PATCH] wmmenugen: Add executable detection, make Wmconfig use it Add fileInPath, which determines whether or not a given file exists in $PATH (some heuristics apply). Make the Wconfig parser use it. Signed-off-by: Tamas TEVESZ --- util/wmmenugen.h | 1 + util/wmmenugen_misc.c | 45 +++++++++++++++++++++++++++++++++ util/wmmenugen_parse_wmconfig.c | 6 +++-- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/util/wmmenugen.h b/util/wmmenugen.h index a1d7ea56..920c6e3d 100644 --- a/util/wmmenugen.h +++ b/util/wmmenugen.h @@ -51,6 +51,7 @@ char *env_lang, *env_ctry, *env_enc, *env_mod; */ void parse_locale(const char *what, char **env_lang, char **env_ctry, char **env_enc, char **env_mod); char *find_terminal_emulator(void); +Bool fileInPath(const char *file); /* implemented parsers */ diff --git a/util/wmmenugen_misc.c b/util/wmmenugen_misc.c index 22b74d7b..694ef8bf 100644 --- a/util/wmmenugen_misc.c +++ b/util/wmmenugen_misc.c @@ -124,3 +124,48 @@ out: return; } + +/* determine whether (first token of) given file is in $PATH + */ +Bool fileInPath(const char *file) +{ + char *p, *t; + static char *path = NULL; + + if (!file || !*file) + return False; + + /* if it's an absolute path spec, don't override the user. + * s/he might just know better. + */ + if (*file == '/') + return True; + + /* if it has a directory separator at random places, + * we might know better. + */ + p = strchr(file, '/'); + if (p) + return False; + + if (!path) { + path = getenv("PATH"); + if (!path) + return False; + } + + p = wstrdup(file); + t = strpbrk(p, " \t"); + if (t) + *t = '\0'; + + t = wfindfile(path, p); + wfree(p); + + if (t) { + wfree(t); + return True; + } + + return False; +} diff --git a/util/wmmenugen_parse_wmconfig.c b/util/wmmenugen_parse_wmconfig.c index 103b1997..60c21f5a 100644 --- a/util/wmmenugen_parse_wmconfig.c +++ b/util/wmmenugen_parse_wmconfig.c @@ -185,8 +185,10 @@ static Bool wmc_to_wm(WMConfigMenuEntry **wmc, WMMenuEntry **wm) char *p; size_t slen; - /* only Exec is mandatory */ - if (!*wmc || !(*wmc)->Exec || !*(*wmc)->Exec) + /* only Exec is mandatory, and it's better exist in a known place */ + if (!*wmc || + !(*wmc)->Exec || !*(*wmc)->Exec || + !fileInPath((*wmc)->Exec)) return False; /* normalize Exec: wmconfig tends to stuck an ampersand