Jacek Caban : winegcc: Lookup PATH in find_binary and don't try to run binaries that can't be found.

Alexandre Julliard julliard at winehq.org
Tue Mar 3 16:24:54 CST 2020


Module: wine
Branch: master
Commit: 945c61c32d86fa7b3bac0641840f26897e55f1ee
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=945c61c32d86fa7b3bac0641840f26897e55f1ee

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Mar  3 14:01:59 2020 +0100

winegcc: Lookup PATH in find_binary and don't try to run binaries that can't be found.

Based on winebuild.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/winegcc/utils.c   | 44 ++++++++++++++++++++++++++++++++++++++------
 tools/winegcc/winegcc.c |  7 ++++++-
 2 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/tools/winegcc/utils.c b/tools/winegcc/utils.c
index 52f46c491b..1a9bc0a63c 100644
--- a/tools/winegcc/utils.c
+++ b/tools/winegcc/utils.c
@@ -34,6 +34,12 @@
 # define min(x,y) (((x) < (y)) ? (x) : (y))
 #endif
 
+#if defined(_WIN32) && !defined(__CYGWIN__)
+# define PATH_SEPARATOR ';'
+#else
+# define PATH_SEPARATOR ':'
+#endif
+
 int verbose = 0;
 
 void error(const char* s, ...)
@@ -305,18 +311,44 @@ file_type get_lib_type(enum target_platform platform, strarray* path, const char
 
 const char *find_binary( const strarray* prefix, const char *name )
 {
+    char *file_name, *args;
+    static strarray *path;
     unsigned int i;
 
-    if (!prefix) return name;
     if (strchr( name, '/' )) return name;
 
-    for (i = 0; i < prefix->size; i++)
+    file_name = xstrdup( name );
+    if ((args = strchr( file_name, ' ' ))) *args++ = 0;
+
+    if (prefix)
+    {
+        for (i = 0; i < prefix->size; i++)
+        {
+            struct stat st;
+            char *prog = strmake( "%s/%s%s", prefix->base[i], file_name, EXEEXT );
+            if (stat( prog, &st ) == 0 && S_ISREG( st.st_mode ) && (st.st_mode & 0111))
+                return args ? strmake( "%s %s", prog, args ) : prog;
+            free( prog );
+        }
+    }
+    if (!path)
     {
-        struct stat st;
-        char *prog = strmake( "%s/%s%s", prefix->base[i], name, EXEEXT );
-        if (stat( prog, &st ) == 0 && S_ISREG( st.st_mode ) && (st.st_mode & 0111)) return prog;
+        path = strarray_alloc();
+
+        /* then append the PATH directories */
+        if (getenv( "PATH" ))
+        {
+            char *p = xstrdup( getenv( "PATH" ));
+            while (*p)
+            {
+                strarray_add( path, p );
+                while (*p && *p != PATH_SEPARATOR) p++;
+                if (!*p) break;
+                *p++ = 0;
+            }
+        }
     }
-    return name;
+    return prefix == path ? NULL : find_binary( path, name );
 }
 
 int spawn(const strarray* prefix, const strarray* args, int ignore_errors)
diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c
index 20c72ec3c5..f2802e2460 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -316,6 +316,7 @@ static char* get_temp_file(const char* prefix, const char* suffix)
 
 static const char* build_tool_name(struct options *opts, const char* base, const char* deflt)
 {
+    const char *path;
     char* str;
 
     if (opts->target && opts->version)
@@ -332,7 +333,10 @@ static const char* build_tool_name(struct options *opts, const char* base, const
     }
     else
         str = xstrdup(deflt);
-    return find_binary( opts->prefix, str );
+
+    if ((path = find_binary( opts->prefix, str ))) return path;
+    error( "Could not find %s\n", base );
+    return NULL;
 }
 
 static strarray* get_translator(struct options *opts)
@@ -877,6 +881,7 @@ static strarray *get_winebuild_args(struct options *opts)
         binary = strmake( "%s/winebuild%s", bindir, EXEEXT );
     else
         binary = find_binary( opts->prefix, "winebuild" );
+    if (!binary) error( "Could not find winebuild\n" );
     strarray_add( spec_args, binary );
     if (verbose) strarray_add( spec_args, "-v" );
     if (keep_generated) strarray_add( spec_args, "--save-temps" );




More information about the wine-cvs mailing list