diff options
| author | Ron Yorston <rmy@pobox.com> | 2017-08-29 14:12:58 +0100 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2017-08-30 17:17:14 +0100 |
| commit | 8cd264102aa2d954be9bbdbf84d3f4ab75189904 (patch) | |
| tree | 11fc8c5c534753eaa474eb86122cec7d9cec4198 | |
| parent | 97e2c4a05e8efa0e3e3a3c256daa05676dc5484e (diff) | |
| download | busybox-w32-8cd264102aa2d954be9bbdbf84d3f4ab75189904.tar.gz busybox-w32-8cd264102aa2d954be9bbdbf84d3f4ab75189904.tar.bz2 busybox-w32-8cd264102aa2d954be9bbdbf84d3f4ab75189904.zip | |
win32: add a function to find executable on PATH
The function find_executable is more generic than needed here: it
can search for all matches on PATH whereas we only want the first.
Implement find_first_executable to do that.
| -rw-r--r-- | win32/process.c | 64 |
1 files changed, 30 insertions, 34 deletions
diff --git a/win32/process.c b/win32/process.c index e47fbac1e..07c2e49df 100644 --- a/win32/process.c +++ b/win32/process.c | |||
| @@ -173,6 +173,21 @@ quote_arg(const char *arg) | |||
| 173 | return q; | 173 | return q; |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | static char * | ||
| 177 | find_first_executable(const char *name) | ||
| 178 | { | ||
| 179 | char *tmp, *path = getenv("PATH"); | ||
| 180 | char *exe_path = NULL; | ||
| 181 | |||
| 182 | if (path) { | ||
| 183 | tmp = path = xstrdup(path); | ||
| 184 | exe_path = find_executable(name, &tmp); | ||
| 185 | free(path); | ||
| 186 | } | ||
| 187 | |||
| 188 | return exe_path; | ||
| 189 | } | ||
| 190 | |||
| 176 | static intptr_t | 191 | static intptr_t |
| 177 | spawnveq(int mode, const char *path, char *const *argv, char *const *env) | 192 | spawnveq(int mode, const char *path, char *const *argv, char *const *env) |
| 178 | { | 193 | { |
| @@ -238,7 +253,6 @@ mingw_spawn_interpreter(int mode, const char *prog, char *const *argv, char *con | |||
| 238 | (fullpath=file_is_win32_executable(int_path)) != NULL) { | 253 | (fullpath=file_is_win32_executable(int_path)) != NULL) { |
| 239 | new_argv[0] = fullpath ? fullpath : int_path; | 254 | new_argv[0] = fullpath ? fullpath : int_path; |
| 240 | ret = spawnveq(mode, new_argv[0], new_argv, envp); | 255 | ret = spawnveq(mode, new_argv[0], new_argv, envp); |
| 241 | free(fullpath); | ||
| 242 | } else | 256 | } else |
| 243 | #if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE | 257 | #if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE |
| 244 | if (find_applet_by_name(int_name) >= 0) { | 258 | if (find_applet_by_name(int_name) >= 0) { |
| @@ -246,22 +260,16 @@ mingw_spawn_interpreter(int mode, const char *prog, char *const *argv, char *con | |||
| 246 | ret = mingw_spawn_applet(mode, new_argv, envp); | 260 | ret = mingw_spawn_applet(mode, new_argv, envp); |
| 247 | } else | 261 | } else |
| 248 | #endif | 262 | #endif |
| 249 | { | 263 | if ((fullpath=find_first_executable(int_name)) != NULL) { |
| 250 | char *path = xstrdup(getenv("PATH")); | ||
| 251 | char *tmp = path; | ||
| 252 | |||
| 253 | fullpath = find_executable(int_name, &tmp); | ||
| 254 | free(path); | ||
| 255 | if (!fullpath) { | ||
| 256 | free(new_argv); | ||
| 257 | errno = ENOENT; | ||
| 258 | return -1; | ||
| 259 | } | ||
| 260 | new_argv[0] = fullpath; | 264 | new_argv[0] = fullpath; |
| 261 | ret = spawnveq(mode, fullpath, new_argv, envp); | 265 | ret = spawnveq(mode, fullpath, new_argv, envp); |
| 262 | free(fullpath); | 266 | } |
| 267 | else { | ||
| 268 | errno = ENOENT; | ||
| 269 | ret = -1; | ||
| 263 | } | 270 | } |
| 264 | 271 | ||
| 272 | free(fullpath); | ||
| 265 | free(new_argv); | 273 | free(new_argv); |
| 266 | return ret; | 274 | return ret; |
| 267 | } | 275 | } |
| @@ -269,36 +277,24 @@ mingw_spawn_interpreter(int mode, const char *prog, char *const *argv, char *con | |||
| 269 | static intptr_t | 277 | static intptr_t |
| 270 | mingw_spawn_1(int mode, const char *cmd, char *const *argv, char *const *envp) | 278 | mingw_spawn_1(int mode, const char *cmd, char *const *argv, char *const *envp) |
| 271 | { | 279 | { |
| 272 | intptr_t ret; | 280 | char *prog; |
| 273 | 281 | ||
| 274 | #if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE | 282 | #if ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE |
| 275 | if (find_applet_by_name(cmd) >= 0) | 283 | if (find_applet_by_name(cmd) >= 0) |
| 276 | return mingw_spawn_applet(mode, argv, envp); | 284 | return mingw_spawn_applet(mode, argv, envp); |
| 277 | else | 285 | else |
| 278 | #endif | 286 | #endif |
| 279 | if (strchr(cmd, '/') || strchr(cmd, '\\')) | 287 | if (strchr(cmd, '/') || strchr(cmd, '\\')) { |
| 280 | return mingw_spawn_interpreter(mode, cmd, argv, envp); | 288 | return mingw_spawn_interpreter(mode, cmd, argv, envp); |
| 281 | else { | 289 | } |
| 282 | char *tmp, *path = getenv("PATH"); | 290 | else if ((prog=find_first_executable(cmd)) != NULL) { |
| 283 | char *prog; | 291 | intptr_t ret = mingw_spawn_interpreter(mode, prog, argv, envp); |
| 284 | |||
| 285 | if (!path) { | ||
| 286 | errno = ENOENT; | ||
| 287 | return -1; | ||
| 288 | } | ||
| 289 | |||
| 290 | /* executable_exists() does not return new file name */ | ||
| 291 | tmp = path = xstrdup(path); | ||
| 292 | prog = find_executable(cmd, &tmp); | ||
| 293 | free(path); | ||
| 294 | if (!prog) { | ||
| 295 | errno = ENOENT; | ||
| 296 | return -1; | ||
| 297 | } | ||
| 298 | ret = mingw_spawn_interpreter(mode, prog, argv, envp); | ||
| 299 | free(prog); | 292 | free(prog); |
| 293 | return ret; | ||
| 300 | } | 294 | } |
| 301 | return ret; | 295 | |
| 296 | errno = ENOENT; | ||
| 297 | return -1; | ||
| 302 | } | 298 | } |
| 303 | 299 | ||
| 304 | pid_t FAST_FUNC | 300 | pid_t FAST_FUNC |
