aboutsummaryrefslogtreecommitdiff
path: root/std/child_process.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-06-19 19:01:28 -0400
committerAndrew Kelley <andrew@ziglang.org>2019-06-19 19:01:28 -0400
commit04c25efe112e374facaf1bc8b58bbdb6999a39e3 (patch)
tree66a70b185ad8e44a69c8be27dd7dbc23425b040c /std/child_process.zig
parent4ffab5b85f03f63a7e724698482f8497cacc7212 (diff)
parent381c6a38b145665a22440f7aa816f0ddd9b70ee5 (diff)
downloadzig-04c25efe112e374facaf1bc8b58bbdb6999a39e3.tar.gz
zig-04c25efe112e374facaf1bc8b58bbdb6999a39e3.zip
Merge remote-tracking branch 'origin/master' into copy-elision-3
Diffstat (limited to 'std/child_process.zig')
-rw-r--r--std/child_process.zig37
1 files changed, 22 insertions, 15 deletions
diff --git a/std/child_process.zig b/std/child_process.zig
index 8e4c086d1d..6e6cca335a 100644
--- a/std/child_process.zig
+++ b/std/child_process.zig
@@ -543,25 +543,32 @@ pub const ChildProcess = struct {
const PATH = try process.getEnvVarOwned(self.allocator, "PATH");
defer self.allocator.free(PATH);
+ const PATHEXT = try process.getEnvVarOwned(self.allocator, "PATHEXT");
+ defer self.allocator.free(PATHEXT);
var it = mem.tokenize(PATH, ";");
- while (it.next()) |search_path| {
- const joined_path = try fs.path.join(self.allocator, [_][]const u8{ search_path, app_name });
- defer self.allocator.free(joined_path);
-
- const joined_path_w = try unicode.utf8ToUtf16LeWithNull(self.allocator, joined_path);
- defer self.allocator.free(joined_path_w);
-
- if (windowsCreateProcess(joined_path_w.ptr, cmd_line_w.ptr, envp_ptr, cwd_w_ptr, &siStartInfo, &piProcInfo)) |_| {
- break;
- } else |err| if (err == error.FileNotFound) {
- continue;
- } else {
- return err;
+ retry: while (it.next()) |search_path| {
+ var ext_it = mem.tokenize(PATHEXT, ";");
+ while (ext_it.next()) |app_ext| {
+ const app_basename = try mem.concat(self.allocator, u8, [_][]const u8{app_name[0..app_name.len - 1], app_ext});
+ defer self.allocator.free(app_basename);
+
+ const joined_path = try fs.path.join(self.allocator, [_][]const u8{ search_path, app_basename });
+ defer self.allocator.free(joined_path);
+
+ const joined_path_w = try unicode.utf8ToUtf16LeWithNull(self.allocator, joined_path);
+ defer self.allocator.free(joined_path_w);
+
+ if (windowsCreateProcess(joined_path_w.ptr, cmd_line_w.ptr, envp_ptr, cwd_w_ptr, &siStartInfo, &piProcInfo)) |_| {
+ break :retry;
+ } else |err| switch (err) {
+ error.FileNotFound => { continue; },
+ error.AccessDenied => { continue; },
+ else => { return err; },
+ }
}
} else {
- // Every other error would have been returned earlier.
- return error.FileNotFound;
+ return no_path_err; // return the original error
}
};