diff --git a/src/libcore/io.rs b/src/libcore/io.rs index 721a6584c6506..3690df2600b05 100644 --- a/src/libcore/io.rs +++ b/src/libcore/io.rs @@ -607,7 +607,7 @@ impl *libc::FILE: Writer { *self); if nout != len as size_t { error!("error writing buffer"); - log(error, os::last_os_error()); + log(error, os::last_error()); die!(); } } @@ -657,7 +657,7 @@ impl fd_t: Writer { let nout = libc::write(*self, vb, len as size_t); if nout < 0 as ssize_t { error!("error writing buffer"); - log(error, os::last_os_error()); + log(error, os::last_error()); die!(); } count += nout as uint; @@ -731,7 +731,7 @@ pub fn mk_file_writer(path: &Path, flags: &[FileFlag]) }; if fd < (0 as c_int) { result::Err(fmt!("error opening %s: %s", path.to_str(), - os::last_os_error())) + os::last_error())) } else { result::Ok(fd_writer(fd, true)) } diff --git a/src/libcore/os.rs b/src/libcore/os.rs index 38469c35cfa6c..f6df67d1a1f5e 100644 --- a/src/libcore/os.rs +++ b/src/libcore/os.rs @@ -62,10 +62,13 @@ extern mod rustrt { unsafe fn rust_path_exists(path: *libc::c_char) -> c_int; unsafe fn rust_list_files2(&&path: ~str) -> ~[~str]; unsafe fn rust_process_wait(handle: c_int) -> c_int; - unsafe fn last_os_error() -> ~str; unsafe fn rust_set_exit_status(code: libc::intptr_t); } +extern mod rustllvm { + unsafe fn LLVMGetLastError() -> *libc::c_char; +} + pub const tmpbuf_sz : uint = 1000u; pub fn getcwd() -> Path { @@ -767,9 +770,12 @@ pub fn remove_file(p: &Path) -> bool { } /// Get a string representing the platform-dependent last error -pub fn last_os_error() -> ~str { +pub fn last_error() -> ~str { unsafe { - rustrt::last_os_error() + let e = rustllvm::LLVMGetLastError(); + let err_str = str::raw::from_c_str(e); + libc::free(e as *libc::c_void); + err_str } } @@ -1000,8 +1006,8 @@ mod tests { use vec; #[test] - pub fn last_os_error() { - log(debug, os::last_os_error()); + pub fn last_error() { + log(debug, os::last_error()); } #[test] diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index 32f2c4ebde2ac..59e838929568c 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -52,50 +52,6 @@ timegm(struct tm *tm) } #endif - -extern "C" CDECL rust_str* -last_os_error() { - rust_task *task = rust_get_current_task(); - - LOG(task, task, "last_os_error()"); - -#if defined(__WIN32__) - LPTSTR buf; - DWORD err = GetLastError(); - DWORD res = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, err, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &buf, 0, NULL); - if (!res) { - task->fail(); - return NULL; - } -#elif defined(_GNU_SOURCE) && !defined(__ANDROID__) - char cbuf[BUF_BYTES]; - char *buf = strerror_r(errno, cbuf, sizeof(cbuf)); - if (!buf) { - task->fail(); - return NULL; - } -#else - char buf[BUF_BYTES]; - int err = strerror_r(errno, buf, sizeof(buf)); - if (err) { - task->fail(); - return NULL; - } -#endif - - rust_str * st = make_str(task->kernel, buf, strlen(buf), - "last_os_error"); -#ifdef __WIN32__ - LocalFree((HLOCAL)buf); -#endif - return st; -} - extern "C" CDECL rust_str * rust_getcwd() { rust_task *task = rust_get_current_task(); diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in index 9076670392a85..1dc55d2986c57 100644 --- a/src/rt/rustrt.def.in +++ b/src/rt/rustrt.def.in @@ -14,7 +14,6 @@ rust_gmtime rust_localtime rust_timegm rust_mktime -last_os_error new_task precise_time_ns rand_free diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 3c38f3c6215d4..fc1bb89923d1c 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -30,6 +30,7 @@ #include "llvm/Support/Timer.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/Support/Errno.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/SourceMgr.h" @@ -72,6 +73,13 @@ extern "C" const char *LLVMRustGetLastError(void) { return LLVMRustError; } +extern "C" const char *LLVMGetLastError(void) { + std::string e = StrError(); + char *err = (char *) malloc(e.length() + 1); + std::strcpy(err, e.c_str()); + return err; +} + extern "C" void LLVMAddBasicAliasAnalysisPass(LLVMPassManagerRef PM); extern "C" void LLVMRustAddPrintModulePass(LLVMPassManagerRef PMR, diff --git a/src/rustllvm/rustllvm.def.in b/src/rustllvm/rustllvm.def.in index d3cbc490ada45..ef88b81691c6b 100644 --- a/src/rustllvm/rustllvm.def.in +++ b/src/rustllvm/rustllvm.def.in @@ -577,3 +577,4 @@ LLVMX86MMXTypeInContext LLVMConstNamedStruct LLVMStructCreateNamed LLVMStructSetBody +LLVMGetLastError diff --git a/src/test/auxiliary/anon-extern-mod-cross-crate-1.rs b/src/test/auxiliary/anon-extern-mod-cross-crate-1.rs index bbe36f18d6c34..6b2c6459ecae9 100644 --- a/src/test/auxiliary/anon-extern-mod-cross-crate-1.rs +++ b/src/test/auxiliary/anon-extern-mod-cross-crate-1.rs @@ -9,11 +9,11 @@ // except according to those terms. #[abi = "cdecl"]; -#[link_name = "rustrt"]; +#[link_name = "rustllvm"]; #[link(name = "anonexternmod", vers = "0.1")]; #[crate_type = "lib"]; extern { - fn last_os_error() -> ~str; + unsafe fn LLVMGetLastError() -> *core::libc::c_char; } diff --git a/src/test/auxiliary/foreign_lib.rs b/src/test/auxiliary/foreign_lib.rs index eb3397a8a5f46..0310278ea0be0 100644 --- a/src/test/auxiliary/foreign_lib.rs +++ b/src/test/auxiliary/foreign_lib.rs @@ -10,6 +10,6 @@ #[link(name="foreign_lib", vers="0.0")]; -pub extern mod rustrt { - pub fn last_os_error() -> ~str; +pub extern mod rustllvm { + pub unsafe fn LLVMGetLastError() -> *core::libc::c_char; } diff --git a/src/test/run-fail/morestack2.rs b/src/test/run-fail/morestack2.rs index 58957aac2038a..ed310b981378b 100644 --- a/src/test/run-fail/morestack2.rs +++ b/src/test/run-fail/morestack2.rs @@ -17,16 +17,13 @@ extern mod std; -extern mod rustrt { - pub fn last_os_error() -> ~str; -} fn getbig_call_c_and_fail(i: int) { if i != 0 { getbig_call_c_and_fail(i - 1); } else { unsafe { - rustrt::last_os_error(); + core::os::last_error(); die!(); } } diff --git a/src/test/run-pass/anon-extern-mod-cross-crate-2.rs b/src/test/run-pass/anon-extern-mod-cross-crate-2.rs index 939903b3b124a..52a57d416bff4 100644 --- a/src/test/run-pass/anon-extern-mod-cross-crate-2.rs +++ b/src/test/run-pass/anon-extern-mod-cross-crate-2.rs @@ -15,5 +15,7 @@ extern mod anonexternmod; use anonexternmod::*; pub fn main() { - last_os_error(); + unsafe { + LLVMGetLastError(); + } } diff --git a/src/test/run-pass/anon-extern-mod.rs b/src/test/run-pass/anon-extern-mod.rs index 525e6b9fbd6d9..0f2c4f956e32c 100644 --- a/src/test/run-pass/anon-extern-mod.rs +++ b/src/test/run-pass/anon-extern-mod.rs @@ -9,13 +9,13 @@ // except according to those terms. #[abi = "cdecl"] -#[link_name = "rustrt"] +#[link_name = "rustllvm"] extern { - fn last_os_error() -> ~str; + unsafe fn LLVMGetLastError() -> *libc::c_char; } pub fn main() { unsafe { - let _ = last_os_error(); + let _ = LLVMGetLastError(); } } diff --git a/src/test/run-pass/foreign-dupe.rs b/src/test/run-pass/foreign-dupe.rs index 77ed95a809980..9bb8f58ddb19b 100644 --- a/src/test/run-pass/foreign-dupe.rs +++ b/src/test/run-pass/foreign-dupe.rs @@ -12,20 +12,20 @@ // calling pin_task and that's having wierd side-effects. #[abi = "cdecl"] -#[link_name = "rustrt"] -extern mod rustrt1 { - pub fn last_os_error() -> ~str; +#[link_name = "rustllvm"] +extern mod rustllvm1 { + pub unsafe fn LLVMGetLastError() -> *libc::c_char; } #[abi = "cdecl"] -#[link_name = "rustrt"] -extern mod rustrt2 { - pub fn last_os_error() -> ~str; +#[link_name = "rustllvm"] +extern mod rustllvm2 { + pub unsafe fn LLVMGetLastError() -> *libc::c_char; } pub fn main() { unsafe { - rustrt1::last_os_error(); - rustrt2::last_os_error(); + rustllvm1::LLVMGetLastError(); + rustllvm2::LLVMGetLastError(); } } diff --git a/src/test/run-pass/invoke-external-foreign.rs b/src/test/run-pass/invoke-external-foreign.rs index cc50e06199db4..2ffe1baba00ee 100644 --- a/src/test/run-pass/invoke-external-foreign.rs +++ b/src/test/run-pass/invoke-external-foreign.rs @@ -18,5 +18,7 @@ extern mod foreign_lib; pub fn main() { - let foo = foreign_lib::rustrt::last_os_error(); + unsafe { + let _foo = foreign_lib::rustllvm::LLVMGetLastError(); + } } diff --git a/src/test/run-pass/morestack6.rs b/src/test/run-pass/morestack6.rs index 9b852cbc635aa..ed5d5725df636 100644 --- a/src/test/run-pass/morestack6.rs +++ b/src/test/run-pass/morestack6.rs @@ -15,7 +15,6 @@ extern mod rustrt { pub fn debug_get_stk_seg() -> *u8; pub fn rust_get_sched_id() -> libc::intptr_t; - pub fn last_os_error() -> ~str; pub fn rust_getcwd() -> ~str; pub fn get_task_id() -> libc::intptr_t; pub fn rust_sched_threads(); @@ -23,7 +22,6 @@ extern mod rustrt { } fn calllink01() { unsafe { rustrt::rust_get_sched_id(); } } -fn calllink02() { unsafe { rustrt::last_os_error(); } } fn calllink03() { unsafe { rustrt::rust_getcwd(); } } fn calllink08() { unsafe { rustrt::get_task_id(); } } fn calllink09() { unsafe { rustrt::rust_sched_threads(); } } @@ -56,7 +54,6 @@ fn runtest2(f: extern fn(), frame_backoff: u32, last_stk: *u8) -> u32 { pub fn main() { let fns = ~[ calllink01, - calllink02, calllink03, calllink08, calllink09,