Skip to content

Commit baa1c18

Browse files
committed
auto merge of #6140 : Dretch/rust/run-with-rust, r=brson
Even more of `core::run` could be rust-ified -- I believe that access to the C extern environ can be done with rust now. I did not do this because some special casing is needed for OSX and I don't have a mac I can test with. I think this will also fix #6096.
2 parents 73733c9 + bd979c1 commit baa1c18

File tree

5 files changed

+492
-250
lines changed

5 files changed

+492
-250
lines changed

src/libcore/libc.rs

+127-4
Original file line numberDiff line numberDiff line change
@@ -582,12 +582,16 @@ pub mod types {
582582

583583
pub type LPWSTR = *mut WCHAR;
584584
pub type LPSTR = *mut CHAR;
585+
pub type LPTSTR = *mut CHAR;
585586

586587
// Not really, but opaque to us.
587588
pub type LPSECURITY_ATTRIBUTES = LPVOID;
588589

589590
pub type LPVOID = *mut c_void;
591+
pub type LPBYTE = *mut BYTE;
590592
pub type LPWORD = *mut WORD;
593+
pub type LPDWORD = *mut DWORD;
594+
pub type LPHANDLE = *mut HANDLE;
591595

592596
pub type LRESULT = LONG_PTR;
593597
pub type PBOOL = *mut BOOL;
@@ -596,6 +600,36 @@ pub mod types {
596600

597601
pub type time64_t = i64;
598602
pub type int64 = i64;
603+
604+
pub struct STARTUPINFO {
605+
cb: DWORD,
606+
lpReserved: LPTSTR,
607+
lpDesktop: LPTSTR,
608+
lpTitle: LPTSTR,
609+
dwX: DWORD,
610+
dwY: DWORD,
611+
dwXSize: DWORD,
612+
dwYSize: DWORD,
613+
dwXCountChars: DWORD,
614+
dwYCountCharts: DWORD,
615+
dwFillAttribute: DWORD,
616+
dwFlags: DWORD,
617+
wShowWindow: WORD,
618+
cbReserved2: WORD,
619+
lpReserved2: LPBYTE,
620+
hStdInput: HANDLE,
621+
hStdOutput: HANDLE,
622+
hStdError: HANDLE
623+
}
624+
pub type LPSTARTUPINFO = *mut STARTUPINFO;
625+
626+
pub struct PROCESS_INFORMATION {
627+
hProcess: HANDLE,
628+
hThread: HANDLE,
629+
dwProcessId: DWORD,
630+
dwThreadId: DWORD
631+
}
632+
pub type LPPROCESS_INFORMATION = *mut PROCESS_INFORMATION;
599633
}
600634
}
601635
}
@@ -848,13 +882,62 @@ pub mod consts {
848882
pub mod bsd44 {
849883
}
850884
pub mod extra {
885+
use libc::types::os::arch::extra::{DWORD, BOOL};
886+
887+
pub static TRUE : BOOL = 1;
888+
pub static FALSE : BOOL = 0;
889+
851890
pub static O_TEXT : int = 16384;
852891
pub static O_BINARY : int = 32768;
853892
pub static O_NOINHERIT: int = 128;
854893

855894
pub static ERROR_SUCCESS : int = 0;
856895
pub static ERROR_INSUFFICIENT_BUFFER : int = 122;
857896
pub static INVALID_HANDLE_VALUE: int = -1;
897+
898+
pub static DELETE : DWORD = 0x00010000;
899+
pub static READ_CONTROL : DWORD = 0x00020000;
900+
pub static SYNCHRONIZE : DWORD = 0x00100000;
901+
pub static WRITE_DAC : DWORD = 0x00040000;
902+
pub static WRITE_OWNER : DWORD = 0x00080000;
903+
904+
pub static PROCESS_CREATE_PROCESS : DWORD = 0x0080;
905+
pub static PROCESS_CREATE_THREAD : DWORD = 0x0002;
906+
pub static PROCESS_DUP_HANDLE : DWORD = 0x0040;
907+
pub static PROCESS_QUERY_INFORMATION : DWORD = 0x0400;
908+
pub static PROCESS_QUERY_LIMITED_INFORMATION : DWORD = 0x1000;
909+
pub static PROCESS_SET_INFORMATION : DWORD = 0x0200;
910+
pub static PROCESS_SET_QUOTA : DWORD = 0x0100;
911+
pub static PROCESS_SUSPEND_RESUME : DWORD = 0x0800;
912+
pub static PROCESS_TERMINATE : DWORD = 0x0001;
913+
pub static PROCESS_VM_OPERATION : DWORD = 0x0008;
914+
pub static PROCESS_VM_READ : DWORD = 0x0010;
915+
pub static PROCESS_VM_WRITE : DWORD = 0x0020;
916+
917+
pub static STARTF_FORCEONFEEDBACK : DWORD = 0x00000040;
918+
pub static STARTF_FORCEOFFFEEDBACK : DWORD = 0x00000080;
919+
pub static STARTF_PREVENTPINNING : DWORD = 0x00002000;
920+
pub static STARTF_RUNFULLSCREEN : DWORD = 0x00000020;
921+
pub static STARTF_TITLEISAPPID : DWORD = 0x00001000;
922+
pub static STARTF_TITLEISLINKNAME : DWORD = 0x00000800;
923+
pub static STARTF_USECOUNTCHARS : DWORD = 0x00000008;
924+
pub static STARTF_USEFILLATTRIBUTE : DWORD = 0x00000010;
925+
pub static STARTF_USEHOTKEY : DWORD = 0x00000200;
926+
pub static STARTF_USEPOSITION : DWORD = 0x00000004;
927+
pub static STARTF_USESHOWWINDOW : DWORD = 0x00000001;
928+
pub static STARTF_USESIZE : DWORD = 0x00000002;
929+
pub static STARTF_USESTDHANDLES : DWORD = 0x00000100;
930+
931+
pub static WAIT_ABANDONED : DWORD = 0x00000080;
932+
pub static WAIT_OBJECT_0 : DWORD = 0x00000000;
933+
pub static WAIT_TIMEOUT : DWORD = 0x00000102;
934+
pub static WAIT_FAILED : DWORD = -1;
935+
936+
pub static DUPLICATE_CLOSE_SOURCE : DWORD = 0x00000001;
937+
pub static DUPLICATE_SAME_ACCESS : DWORD = 0x00000002;
938+
939+
pub static INFINITE : DWORD = -1;
940+
pub static STILL_ACTIVE : DWORD = 259;
858941
}
859942
}
860943

@@ -1751,12 +1834,24 @@ pub mod funcs {
17511834

17521835
unsafe fn sysctlnametomib(name: *c_char, mibp: *mut c_int,
17531836
sizep: *mut size_t) -> c_int;
1837+
1838+
unsafe fn getdtablesize() -> c_int;
17541839
}
17551840
}
17561841

17571842

17581843
#[cfg(target_os = "linux")]
17591844
#[cfg(target_os = "android")]
1845+
pub mod bsd44 {
1846+
use libc::types::os::arch::c95::{c_int};
1847+
1848+
#[abi = "cdecl"]
1849+
pub extern {
1850+
unsafe fn getdtablesize() -> c_int;
1851+
}
1852+
}
1853+
1854+
17601855
#[cfg(target_os = "win32")]
17611856
pub mod bsd44 {
17621857
}
@@ -1790,9 +1885,11 @@ pub mod funcs {
17901885
pub mod kernel32 {
17911886
use libc::types::os::arch::c95::{c_uint};
17921887
use libc::types::os::arch::extra::{BOOL, DWORD, HMODULE};
1793-
use libc::types::os::arch::extra::{LPCWSTR, LPWSTR, LPTCH};
1794-
use libc::types::os::arch::extra::{LPSECURITY_ATTRIBUTES};
1795-
use libc::types::os::arch::extra::{HANDLE};
1888+
use libc::types::os::arch::extra::{LPCWSTR, LPWSTR, LPCTSTR,
1889+
LPTSTR, LPTCH, LPDWORD, LPVOID};
1890+
use libc::types::os::arch::extra::{LPSECURITY_ATTRIBUTES, LPSTARTUPINFO,
1891+
LPPROCESS_INFORMATION};
1892+
use libc::types::os::arch::extra::{HANDLE, LPHANDLE};
17961893

17971894
#[abi = "stdcall"]
17981895
pub extern "stdcall" {
@@ -1829,19 +1926,45 @@ pub mod funcs {
18291926
findFileData: HANDLE)
18301927
-> BOOL;
18311928
unsafe fn FindClose(findFile: HANDLE) -> BOOL;
1929+
unsafe fn DuplicateHandle(hSourceProcessHandle: HANDLE,
1930+
hSourceHandle: HANDLE,
1931+
hTargetProcessHandle: HANDLE,
1932+
lpTargetHandle: LPHANDLE,
1933+
dwDesiredAccess: DWORD,
1934+
bInheritHandle: BOOL,
1935+
dwOptions: DWORD) -> BOOL;
18321936
unsafe fn CloseHandle(hObject: HANDLE) -> BOOL;
1937+
unsafe fn OpenProcess(dwDesiredAccess: DWORD,
1938+
bInheritHandle: BOOL,
1939+
dwProcessId: DWORD) -> HANDLE;
1940+
unsafe fn GetCurrentProcess() -> HANDLE;
1941+
unsafe fn CreateProcessA(lpApplicationName: LPCTSTR,
1942+
lpCommandLine: LPTSTR,
1943+
lpProcessAttributes: LPSECURITY_ATTRIBUTES,
1944+
lpThreadAttributes: LPSECURITY_ATTRIBUTES,
1945+
bInheritHandles: BOOL,
1946+
dwCreationFlags: DWORD,
1947+
lpEnvironment: LPVOID,
1948+
lpCurrentDirectory: LPCTSTR,
1949+
lpStartupInfo: LPSTARTUPINFO,
1950+
lpProcessInformation: LPPROCESS_INFORMATION) -> BOOL;
1951+
unsafe fn WaitForSingleObject(hHandle: HANDLE, dwMilliseconds: DWORD) -> DWORD;
18331952
unsafe fn TerminateProcess(hProcess: HANDLE, uExitCode: c_uint) -> BOOL;
1953+
unsafe fn GetExitCodeProcess(hProcess: HANDLE, lpExitCode: LPDWORD) -> BOOL;
18341954
}
18351955
}
18361956

18371957
pub mod msvcrt {
1838-
use libc::types::os::arch::c95::c_int;
1958+
use libc::types::os::arch::c95::{c_int, c_long};
18391959

18401960
#[abi = "cdecl"]
18411961
#[nolink]
18421962
pub extern {
18431963
#[link_name = "_commit"]
18441964
unsafe fn commit(fd: c_int) -> c_int;
1965+
1966+
#[link_name = "_get_osfhandle"]
1967+
unsafe fn get_osfhandle(fd: c_int) -> c_long;
18451968
}
18461969
}
18471970
}

src/libcore/os.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ pub fn pipe() -> Pipe {
373373
// inheritance has to be handled in a different way that I do not
374374
// fully understand. Here we explicitly make the pipe non-inheritable,
375375
// which means to pass it to a subprocess they need to be duplicated
376-
// first, as in rust_run_program.
376+
// first, as in core::run.
377377
let mut fds = Pipe {in: 0 as c_int,
378378
out: 0 as c_int };
379379
let res = libc::pipe(&mut fds.in, 1024 as ::libc::c_uint,

0 commit comments

Comments
 (0)