Hi Paul, > note that > on Windows, which is the only place this matters, so far, IIRC it is > illegal to use "prog.exe.exe" so if an extension is already provided > the system won't search again
Indeed, the native Windows execlp() function behaves like this: - If the caller specifies "prog.exe.exe" or "prog.foo.exe" and that file will be exists, it will be found and executed. - If the caller specifies "prog.exe" or "prog.foo" but that file does not exist, the search will NOT extend to "prog.exe.exe" or "prog.foo.exe", respectively. I'm updating the code (patch below). > I actually don't see any need for this optimization, especially > compared to the added complexity of the API and docs: the suffix check > needs to be done somewhere after all. But on platforms like Cygwin, it would be done twice. 2019-09-14 Bruno Haible <br...@clisp.org> findprog-in: Better mimic the system on native Windows. Reported by Paul Smith <psm...@gnu.org>. * lib/findprog-in.c (find_in_given_path): On native Windows, don't try non-empty suffixes when the file name already contains a '.'. diff --git a/lib/findprog-in.c b/lib/findprog-in.c index 99b3c31..d601e06 100644 --- a/lib/findprog-in.c +++ b/lib/findprog-in.c @@ -118,8 +118,9 @@ find_in_given_path (const char *progname, const char *path, const char *suffix = suffixes[i]; #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */ - /* File names without a '.' are not considered executable. */ - if (*suffix != '\0' || strchr (progbasename, '.') != NULL) + /* File names without a '.' are not considered executable, and + for file names with a '.' no additional suffix is tried. */ + if ((*suffix != '\0') != (strchr (progbasename, '.') != NULL)) #endif { /* Concatenate progname and suffix. */ @@ -185,8 +186,9 @@ find_in_given_path (const char *progname, const char *path, const char *suffix = suffixes[i]; #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */ - /* File names without a '.' are not considered executable. */ - if (*suffix != '\0' || strchr (progname, '.') != NULL) + /* File names without a '.' are not considered executable, and + for file names with a '.' no additional suffix is tried. */ + if ((*suffix != '\0') != (strchr (progname, '.') != NULL)) #endif { /* Concatenate dir, progname, and suffix. */