diff options
Diffstat (limited to 'vendor/iana-time-zone/src/ffi_utils.rs')
-rw-r--r-- | vendor/iana-time-zone/src/ffi_utils.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/vendor/iana-time-zone/src/ffi_utils.rs b/vendor/iana-time-zone/src/ffi_utils.rs new file mode 100644 index 000000000..842b850e8 --- /dev/null +++ b/vendor/iana-time-zone/src/ffi_utils.rs @@ -0,0 +1,49 @@ +//! Cross platform FFI helpers. + +use std::ffi::CStr; + +// The system property named 'persist.sys.timezone' contains the name of the +// current timezone. +// +// From https://android.googlesource.com/platform/bionic/+/gingerbread-release/libc/docs/OVERVIEW.TXT#79: +// +// > The name of the current timezone is taken from the TZ environment variable, +// > if defined. Otherwise, the system property named 'persist.sys.timezone' is +// > checked instead. +const ANDROID_TIMEZONE_PROPERTY_NAME: &[u8] = b"persist.sys.timezone\0"; + +/// Return a [`CStr`] to access the timezone from an Android system properties +/// environment. +pub(crate) fn android_timezone_property_name() -> &'static CStr { + // In tests or debug mode, opt into extra runtime checks. + if cfg!(any(test, debug_assertions)) { + return CStr::from_bytes_with_nul(ANDROID_TIMEZONE_PROPERTY_NAME).unwrap(); + } + + // SAFETY: the key is NUL-terminated and there are no other NULs, this + // invariant is checked in tests. + unsafe { CStr::from_bytes_with_nul_unchecked(ANDROID_TIMEZONE_PROPERTY_NAME) } +} + +#[cfg(test)] +mod tests { + use std::ffi::CStr; + + use super::{android_timezone_property_name, ANDROID_TIMEZONE_PROPERTY_NAME}; + + #[test] + fn test_android_timezone_property_name_is_valid_cstr() { + CStr::from_bytes_with_nul(ANDROID_TIMEZONE_PROPERTY_NAME).unwrap(); + + let mut invalid_property_name = ANDROID_TIMEZONE_PROPERTY_NAME.to_owned(); + invalid_property_name.push(b'\0'); + CStr::from_bytes_with_nul(&invalid_property_name).unwrap_err(); + } + + #[test] + fn test_android_timezone_property_name_getter() { + let key = android_timezone_property_name().to_bytes_with_nul(); + assert_eq!(key, ANDROID_TIMEZONE_PROPERTY_NAME); + std::str::from_utf8(key).unwrap(); + } +} |