>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 /nonexistent
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

Reply via email to