diff options
author | 2017-01-12 12:40:42 +0000 | |
---|---|---|
committer | 2017-01-12 14:08:35 +0000 | |
commit | da20a73e6f8a8e4fa1ac15ee345d70ea92647e46 (patch) | |
tree | f5f24179f89f355e8a51d7668236c49679111fa3 /src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java | |
parent | c828053419d41bfe9377bcb5a01032c00800308a (diff) |
Windows, JNI: arg for argv0 in nativeCreateProcess
Add a separate argument to nativeCreateProcess for
argv[0] specifically, and another for the rest of
the args.
In a subsequent change I'll add code to compute
the 8dot3 style short name of the argv[0] so we
can use longer paths for executables in
CreateProcessA than we normally could. This is the
same approach as used in commit 44ecf9a0c7c25496a43f59f1c8f20df9527e12cb
See https://github.com/bazelbuild/bazel/issues/2107
See https://github.com/bazelbuild/bazel/issues/2181
--
PiperOrigin-RevId: 144311562
MOS_MIGRATED_REVID=144311562
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java b/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java index 965a18672e..9f6f0eb565 100644 --- a/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java +++ b/src/main/java/com/google/devtools/build/lib/windows/WindowsSubprocessFactory.java @@ -18,9 +18,9 @@ import com.google.common.base.Charsets; import com.google.devtools.build.lib.shell.Subprocess; import com.google.devtools.build.lib.shell.SubprocessBuilder; import com.google.devtools.build.lib.shell.SubprocessBuilder.StreamAction; - import java.io.File; import java.io.IOException; +import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -38,22 +38,30 @@ public class WindowsSubprocessFactory implements Subprocess.Factory { public Subprocess create(SubprocessBuilder builder) throws IOException { WindowsJniLoader.loadJni(); - String commandLine = WindowsProcesses.quoteCommandLine(builder.getArgv()); + List<String> argv = builder.getArgv(); + String argv0 = WindowsProcesses.quoteCommandLine(argv.subList(0, 1)); + String argvRest = + argv.size() > 1 ? WindowsProcesses.quoteCommandLine(argv.subList(1, argv.size())) : ""; byte[] env = builder.getEnv() == null ? null : convertEnvToNative(builder.getEnv()); String stdoutPath = getRedirectPath(builder.getStdout(), builder.getStdoutFile()); String stderrPath = getRedirectPath(builder.getStderr(), builder.getStderrFile()); - long nativeProcess = WindowsProcesses.nativeCreateProcess( - commandLine, env, builder.getWorkingDirectory().getPath(), stdoutPath, stderrPath); + long nativeProcess = + WindowsProcesses.nativeCreateProcess( + argv0, argvRest, env, builder.getWorkingDirectory().getPath(), stdoutPath, stderrPath); String error = WindowsProcesses.nativeProcessGetLastError(nativeProcess); if (!error.isEmpty()) { WindowsProcesses.nativeDeleteProcess(nativeProcess); throw new IOException(error); } - return new WindowsSubprocess(nativeProcess, commandLine, stdoutPath != null, - stderrPath != null, builder.getTimeoutMillis()); + return new WindowsSubprocess( + nativeProcess, + argv0 + " " + argvRest, + stdoutPath != null, + stderrPath != null, + builder.getTimeoutMillis()); } private String getRedirectPath(StreamAction action, File file) { |