>From 16ccada22f02e3182017f6fdb99768e770953e9d Mon Sep 17 00:00:00 2001
From: Tamas TEVESZ <[email protected]>
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 <[email protected]>
---
util/wmmenugen.h | 1 +
util/wmmenugen_misc.c | 46 +++++++++++++++++++++++++++++++++++++++
util/wmmenugen_parse_wmconfig.c | 6 +++-
3 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/util/wmmenugen.h b/util/wmmenugen.h
index a1d7ea5..920c6e3 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 22b74d7..63300cf 100644
--- a/util/wmmenugen_misc.c
+++ b/util/wmmenugen_misc.c
@@ -124,3 +124,49 @@ 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 a03e62e..26d1f7a 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
--
1.7.0.4
--
[-]
mkdir /nonexistentFrom 16ccada22f02e3182017f6fdb99768e770953e9d Mon Sep 17 00:00:00 2001
From: Tamas TEVESZ <[email protected]>
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 <[email protected]>
---
util/wmmenugen.h | 1 +
util/wmmenugen_misc.c | 46 +++++++++++++++++++++++++++++++++++++++
util/wmmenugen_parse_wmconfig.c | 6 +++-
3 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/util/wmmenugen.h b/util/wmmenugen.h
index a1d7ea5..920c6e3 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 22b74d7..63300cf 100644
--- a/util/wmmenugen_misc.c
+++ b/util/wmmenugen_misc.c
@@ -124,3 +124,49 @@ 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 a03e62e..26d1f7a 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
--
1.7.0.4