diff options
Diffstat (limited to 'vendor/iana-time-zone/src/tz_android.rs')
-rw-r--r-- | vendor/iana-time-zone/src/tz_android.rs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/vendor/iana-time-zone/src/tz_android.rs b/vendor/iana-time-zone/src/tz_android.rs new file mode 100644 index 000000000..27255b52f --- /dev/null +++ b/vendor/iana-time-zone/src/tz_android.rs @@ -0,0 +1,27 @@ +use std::sync::Once; + +use android_system_properties::AndroidSystemProperties; + +use crate::ffi_utils::android_timezone_property_name; + +pub(crate) fn get_timezone_inner() -> Result<String, crate::GetTimezoneError> { + let key = android_timezone_property_name(); + + get_properties() + .and_then(|properties| properties.get_from_cstr(key)) + .ok_or(crate::GetTimezoneError::OsError) +} + +fn get_properties() -> Option<&'static AndroidSystemProperties> { + static INITIALIZED: Once = Once::new(); + static mut PROPERTIES: Option<AndroidSystemProperties> = None; + + INITIALIZED.call_once(|| { + let properties = AndroidSystemProperties::new(); + // SAFETY: `INITIALIZED` is synchronizing. The variable is only assigned to once. + unsafe { PROPERTIES = Some(properties) }; + }); + + // SAFETY: `INITIALIZED` is synchronizing. The variable is only assigned to once. + unsafe { PROPERTIES.as_ref() } +} |