summaryrefslogtreecommitdiffstats
path: root/vendor/iana-time-zone/src/tz_android.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/iana-time-zone/src/tz_android.rs')
-rw-r--r--vendor/iana-time-zone/src/tz_android.rs27
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() }
+}