diff options
| author | Phil Ruffwind <rf@rufflewind.com> | 2014-05-04 03:11:42 -0400 |
|---|---|---|
| committer | Phil Ruffwind <rf@rufflewind.com> | 2014-05-13 17:19:00 -0400 |
| commit | e12aeb39bc4221421890011006c5ae23154cc695 (patch) | |
| tree | 88152484211b4ac51c81c8217dcd23135dba5700 /src/libnative | |
| parent | 4537f13a877850d8a390acc2e3a80964532505b3 (diff) | |
| download | rust-e12aeb39bc4221421890011006c5ae23154cc695.tar.gz rust-e12aeb39bc4221421890011006c5ae23154cc695.zip | |
Use CreateProcessW instead of CreateProcessA
Changed libnative to use CreateProcessW instead of CreateProcessA. In addition, the lpEnvironment parameter now uses Unicode. Added a helper function os::win32::as_mut_utf16_p, which does basically the same thing as os::win32::as_utf16_p except the pointer is mutable.
Diffstat (limited to 'src/libnative')
| -rw-r--r-- | src/libnative/io/process.rs | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/src/libnative/io/process.rs b/src/libnative/io/process.rs index 81c76bba7a0..dbb191911e7 100644 --- a/src/libnative/io/process.rs +++ b/src/libnative/io/process.rs @@ -258,7 +258,7 @@ fn spawn_process_os(config: p::ProcessConfig, GetCurrentProcess, DuplicateHandle, CloseHandle, - CreateProcessA + CreateProcessW }; use libc::funcs::extra::msvcrt::get_osfhandle; @@ -318,15 +318,15 @@ fn spawn_process_os(config: p::ProcessConfig, let mut create_err = None; // stolen from the libuv code. - let mut flags = 0; + let mut flags = libc::CREATE_UNICODE_ENVIRONMENT; if config.detach { flags |= libc::DETACHED_PROCESS | libc::CREATE_NEW_PROCESS_GROUP; } with_envp(env, |envp| { with_dirp(dir, |dirp| { - cmd.with_c_str(|cmdp| { - let created = CreateProcessA(ptr::null(), mem::transmute(cmdp), + os::win32::as_mut_utf16_p(cmd, |cmdp| { + let created = CreateProcessW(ptr::null(), cmdp, ptr::mut_null(), ptr::mut_null(), TRUE, flags, envp, dirp, &mut si, &mut pi); @@ -691,7 +691,7 @@ fn with_envp<T>(env: Option<~[(~str, ~str)]>, cb: |*mut c_void| -> T) -> T { for pair in env.iter() { let kv = format!("{}={}", *pair.ref0(), *pair.ref1()); - blk.push_all(kv.as_bytes()); + blk.push_all(kv.to_utf16().as_slice()); blk.push(0); } @@ -704,9 +704,12 @@ fn with_envp<T>(env: Option<~[(~str, ~str)]>, cb: |*mut c_void| -> T) -> T { } #[cfg(windows)] -fn with_dirp<T>(d: Option<&Path>, cb: |*libc::c_char| -> T) -> T { +fn with_dirp<T>(d: Option<&Path>, cb: |*u16| -> T) -> T { match d { - Some(dir) => dir.with_c_str(|buf| cb(buf)), + Some(dir) => match dir.as_str() { + Some(dir_str) => os::win32::as_utf16_p(dir_str, cb), + None => cb(ptr::null()) + }, None => cb(ptr::null()) } } |
