From 75529be729188062c4326046a38b763519b17e74 Mon Sep 17 00:00:00 2001 From: Joe Moon Date: Tue, 27 Mar 2018 00:42:42 -0700 Subject: macos: add check for valid locale --- src/locale.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'src/locale.rs') diff --git a/src/locale.rs b/src/locale.rs index 57d36e59..4786b4db 100644 --- a/src/locale.rs +++ b/src/locale.rs @@ -12,7 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. #![cfg(target_os = "macos")] +use libc::{LC_CTYPE, setlocale}; +use std::ffi::{CString, CStr}; use std::os::raw::c_char; +use std::ptr::null; use std::slice; use std::str; use std::env; @@ -34,6 +37,29 @@ pub fn set_locale_environment() { (language_code_str, country_code_str) }; let locale_id = format!("{}_{}.UTF-8", &language_code, &country_code); + // check if locale_id is valid + let locale_c_str = CString::new(locale_id.to_owned()).unwrap(); + let locale_ptr = locale_c_str.as_ptr(); + let locale_id = unsafe { + // save a copy of original setting + let original = setlocale(LC_CTYPE, null()); + let saved_original = if original.is_null() { + CString::new("").unwrap() + } else { + CStr::from_ptr(original).to_owned() + }; + // try setting `locale_id` + let modified = setlocale(LC_CTYPE, locale_ptr); + let result = if modified.is_null() { + String::from("") + } else { + locale_id + }; + // restore original setting + setlocale(LC_CTYPE, saved_original.as_ptr()); + result + }; + env::set_var("LANG", &locale_id); } -- cgit v1.2.3