summaryrefslogtreecommitdiff
path: root/vendor/rustix/src/timespec.rs
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-07-15 16:37:08 -0600
committermo khan <mo@mokhan.ca>2025-07-17 16:30:22 -0600
commit45df4d0d9b577fecee798d672695fe24ff57fb1b (patch)
tree1b99bf645035b58e0d6db08c7a83521f41f7a75b /vendor/rustix/src/timespec.rs
parentf94f79608393d4ab127db63cc41668445ef6b243 (diff)
feat: migrate from Cedar to SpiceDB authorization system
This is a major architectural change that replaces the Cedar policy-based authorization system with SpiceDB's relation-based authorization. Key changes: - Migrate from Rust to Go implementation - Replace Cedar policies with SpiceDB schema and relationships - Switch from envoy `ext_authz` with Cedar to SpiceDB permission checks - Update build system and dependencies for Go ecosystem - Maintain Envoy integration for external authorization This change enables more flexible permission modeling through SpiceDB's Google Zanzibar inspired relation-based system, supporting complex hierarchical permissions that were difficult to express in Cedar. Breaking change: Existing Cedar policies and Rust-based configuration will no longer work and need to be migrated to SpiceDB schema.
Diffstat (limited to 'vendor/rustix/src/timespec.rs')
-rw-r--r--vendor/rustix/src/timespec.rs428
1 files changed, 0 insertions, 428 deletions
diff --git a/vendor/rustix/src/timespec.rs b/vendor/rustix/src/timespec.rs
deleted file mode 100644
index f5404ba4..00000000
--- a/vendor/rustix/src/timespec.rs
+++ /dev/null
@@ -1,428 +0,0 @@
-//! `Timespec` and related types, which are used by multiple public API
-//! modules.
-
-#![allow(dead_code)]
-
-use core::num::TryFromIntError;
-use core::ops::{Add, AddAssign, Neg, Sub, SubAssign};
-use core::time::Duration;
-
-use crate::backend::c;
-#[allow(unused)]
-use crate::ffi;
-#[cfg(not(fix_y2038))]
-use core::ptr::null;
-
-/// `struct timespec`—A quantity of time in seconds plus nanoseconds.
-#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord)]
-#[repr(C)]
-pub struct Timespec {
- /// Seconds.
- pub tv_sec: Secs,
-
- /// Nanoseconds. Must be less than 1_000_000_000.
- ///
- /// When passed to [`rustix::fs::utimensat`], this field may instead be
- /// assigned the values [`UTIME_NOW`] or [`UTIME_OMIT`].
- ///
- /// [`UTIME_NOW`]: crate::fs::UTIME_NOW
- /// [`UTIME_OMIT`]: crate::fs::UTIME_OMIT
- /// [`rustix::fs::utimensat`]: crate::fs::utimensat
- pub tv_nsec: Nsecs,
-}
-
-/// A type for the `tv_sec` field of [`Timespec`].
-pub type Secs = i64;
-
-/// A type for the `tv_nsec` field of [`Timespec`].
-#[cfg(any(
- fix_y2038,
- linux_raw,
- all(libc, target_arch = "x86_64", target_pointer_width = "32")
-))]
-pub type Nsecs = i64;
-
-/// A type for the `tv_nsec` field of [`Timespec`].
-#[cfg(all(
- not(fix_y2038),
- libc,
- not(all(target_arch = "x86_64", target_pointer_width = "32"))
-))]
-pub type Nsecs = ffi::c_long;
-
-impl Timespec {
- /// Checked `Timespec` addition. Returns `None` if overflow occurred.
- ///
- /// # Panics
- ///
- /// If `0 <= .tv_nsec < 1_000_000_000` doesn't hold, this function may
- /// panic or return unexpected results.
- ///
- /// # Example
- ///
- /// ```
- /// use rustix::event::Timespec;
- ///
- /// assert_eq!(
- /// Timespec {
- /// tv_sec: 1,
- /// tv_nsec: 2
- /// }
- /// .checked_add(Timespec {
- /// tv_sec: 30,
- /// tv_nsec: 40
- /// }),
- /// Some(Timespec {
- /// tv_sec: 31,
- /// tv_nsec: 42
- /// })
- /// );
- /// assert_eq!(
- /// Timespec {
- /// tv_sec: 0,
- /// tv_nsec: 999_999_999
- /// }
- /// .checked_add(Timespec {
- /// tv_sec: 0,
- /// tv_nsec: 2
- /// }),
- /// Some(Timespec {
- /// tv_sec: 1,
- /// tv_nsec: 1
- /// })
- /// );
- /// assert_eq!(
- /// Timespec {
- /// tv_sec: i64::MAX,
- /// tv_nsec: 999_999_999
- /// }
- /// .checked_add(Timespec {
- /// tv_sec: 0,
- /// tv_nsec: 1
- /// }),
- /// None
- /// );
- /// ```
- pub const fn checked_add(self, rhs: Self) -> Option<Self> {
- if let Some(mut tv_sec) = self.tv_sec.checked_add(rhs.tv_sec) {
- let mut tv_nsec = self.tv_nsec + rhs.tv_nsec;
- if tv_nsec >= 1_000_000_000 {
- tv_nsec -= 1_000_000_000;
- if let Some(carried_sec) = tv_sec.checked_add(1) {
- tv_sec = carried_sec;
- } else {
- return None;
- }
- }
- Some(Self { tv_sec, tv_nsec })
- } else {
- None
- }
- }
-
- /// Checked `Timespec` subtraction. Returns `None` if overflow occurred.
- ///
- /// # Panics
- ///
- /// If `0 <= .tv_nsec < 1_000_000_000` doesn't hold, this function may
- /// panic or return unexpected results.
- ///
- /// # Example
- ///
- /// ```
- /// use rustix::event::Timespec;
- ///
- /// assert_eq!(
- /// Timespec {
- /// tv_sec: 31,
- /// tv_nsec: 42
- /// }
- /// .checked_sub(Timespec {
- /// tv_sec: 30,
- /// tv_nsec: 40
- /// }),
- /// Some(Timespec {
- /// tv_sec: 1,
- /// tv_nsec: 2
- /// })
- /// );
- /// assert_eq!(
- /// Timespec {
- /// tv_sec: 1,
- /// tv_nsec: 1
- /// }
- /// .checked_sub(Timespec {
- /// tv_sec: 0,
- /// tv_nsec: 2
- /// }),
- /// Some(Timespec {
- /// tv_sec: 0,
- /// tv_nsec: 999_999_999
- /// })
- /// );
- /// assert_eq!(
- /// Timespec {
- /// tv_sec: i64::MIN,
- /// tv_nsec: 0
- /// }
- /// .checked_sub(Timespec {
- /// tv_sec: 0,
- /// tv_nsec: 1
- /// }),
- /// None
- /// );
- /// ```
- pub const fn checked_sub(self, rhs: Self) -> Option<Self> {
- if let Some(mut tv_sec) = self.tv_sec.checked_sub(rhs.tv_sec) {
- let mut tv_nsec = self.tv_nsec - rhs.tv_nsec;
- if tv_nsec < 0 {
- tv_nsec += 1_000_000_000;
- if let Some(borrowed_sec) = tv_sec.checked_sub(1) {
- tv_sec = borrowed_sec;
- } else {
- return None;
- }
- }
- Some(Self { tv_sec, tv_nsec })
- } else {
- None
- }
- }
-
- /// Convert from `Timespec` to `c::c_int` milliseconds, rounded up.
- pub(crate) fn as_c_int_millis(&self) -> Option<c::c_int> {
- let secs = self.tv_sec;
- if secs < 0 {
- return None;
- }
- secs.checked_mul(1000)
- .and_then(|millis| {
- // Add the nanoseconds, converted to milliseconds, rounding up.
- // With Rust 1.73.0 this can use `div_ceil`.
- millis.checked_add((i64::from(self.tv_nsec) + 999_999) / 1_000_000)
- })
- .and_then(|millis| c::c_int::try_from(millis).ok())
- }
-}
-
-impl TryFrom<Timespec> for Duration {
- type Error = TryFromIntError;
-
- fn try_from(ts: Timespec) -> Result<Self, Self::Error> {
- Ok(Self::new(ts.tv_sec.try_into()?, ts.tv_nsec as _))
- }
-}
-
-impl TryFrom<Duration> for Timespec {
- type Error = TryFromIntError;
-
- fn try_from(dur: Duration) -> Result<Self, Self::Error> {
- Ok(Self {
- tv_sec: dur.as_secs().try_into()?,
- tv_nsec: dur.subsec_nanos() as _,
- })
- }
-}
-
-impl Add for Timespec {
- type Output = Self;
-
- fn add(self, rhs: Self) -> Self {
- self.checked_add(rhs)
- .expect("overflow when adding timespecs")
- }
-}
-
-impl AddAssign for Timespec {
- fn add_assign(&mut self, rhs: Self) {
- *self = *self + rhs;
- }
-}
-
-impl Sub for Timespec {
- type Output = Self;
-
- fn sub(self, rhs: Self) -> Self {
- self.checked_sub(rhs)
- .expect("overflow when subtracting timespecs")
- }
-}
-
-impl SubAssign for Timespec {
- fn sub_assign(&mut self, rhs: Self) {
- *self = *self - rhs;
- }
-}
-
-impl Neg for Timespec {
- type Output = Self;
-
- fn neg(self) -> Self {
- Self::default() - self
- }
-}
-
-/// On 32-bit glibc platforms, `timespec` has anonymous padding fields, which
-/// Rust doesn't support yet (see `unnamed_fields`), so we define our own
-/// struct with explicit padding, with bidirectional `From` impls.
-#[cfg(fix_y2038)]
-#[repr(C)]
-#[derive(Debug, Clone)]
-pub(crate) struct LibcTimespec {
- pub(crate) tv_sec: Secs,
-
- #[cfg(target_endian = "big")]
- padding: core::mem::MaybeUninit<u32>,
-
- pub(crate) tv_nsec: i32,
-
- #[cfg(target_endian = "little")]
- padding: core::mem::MaybeUninit<u32>,
-}
-
-#[cfg(fix_y2038)]
-impl From<LibcTimespec> for Timespec {
- #[inline]
- fn from(t: LibcTimespec) -> Self {
- Self {
- tv_sec: t.tv_sec,
- tv_nsec: t.tv_nsec as _,
- }
- }
-}
-
-#[cfg(fix_y2038)]
-impl From<Timespec> for LibcTimespec {
- #[inline]
- fn from(t: Timespec) -> Self {
- Self {
- tv_sec: t.tv_sec,
- tv_nsec: t.tv_nsec as _,
- padding: core::mem::MaybeUninit::uninit(),
- }
- }
-}
-
-#[cfg(not(fix_y2038))]
-pub(crate) fn as_libc_timespec_ptr(timespec: &Timespec) -> *const c::timespec {
- #[cfg(test)]
- {
- assert_eq_size!(Timespec, c::timespec);
- }
- crate::utils::as_ptr(timespec).cast::<c::timespec>()
-}
-
-#[cfg(not(fix_y2038))]
-pub(crate) fn as_libc_timespec_mut_ptr(
- timespec: &mut core::mem::MaybeUninit<Timespec>,
-) -> *mut c::timespec {
- #[cfg(test)]
- {
- assert_eq_size!(Timespec, c::timespec);
- }
- timespec.as_mut_ptr().cast::<c::timespec>()
-}
-
-#[cfg(not(fix_y2038))]
-pub(crate) fn option_as_libc_timespec_ptr(timespec: Option<&Timespec>) -> *const c::timespec {
- match timespec {
- None => null(),
- Some(timespec) => as_libc_timespec_ptr(timespec),
- }
-}
-
-/// As described [here], Apple platforms may return a negative nanoseconds
-/// value in some cases; adjust it so that nanoseconds is always in
-/// `0..1_000_000_000`.
-///
-/// [here]: https://github.com/rust-lang/rust/issues/108277#issuecomment-1787057158
-#[cfg(apple)]
-#[inline]
-pub(crate) fn fix_negative_nsecs(
- mut secs: c::time_t,
- mut nsecs: c::c_long,
-) -> (c::time_t, c::c_long) {
- #[cold]
- fn adjust(secs: &mut c::time_t, nsecs: c::c_long) -> c::c_long {
- assert!(nsecs >= -1_000_000_000);
- assert!(*secs < 0);
- assert!(*secs > c::time_t::MIN);
- *secs -= 1;
- nsecs + 1_000_000_000
- }
-
- if nsecs < 0 {
- nsecs = adjust(&mut secs, nsecs);
- }
- (secs, nsecs)
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[cfg(apple)]
- #[test]
- fn test_negative_timestamps() {
- let mut secs = -59;
- let mut nsecs = -900_000_000;
- (secs, nsecs) = fix_negative_nsecs(secs, nsecs);
- assert_eq!(secs, -60);
- assert_eq!(nsecs, 100_000_000);
- (secs, nsecs) = fix_negative_nsecs(secs, nsecs);
- assert_eq!(secs, -60);
- assert_eq!(nsecs, 100_000_000);
- }
-
- #[test]
- fn test_sizes() {
- assert_eq_size!(Secs, u64);
- const_assert!(core::mem::size_of::<Timespec>() >= core::mem::size_of::<(u64, u32)>());
- const_assert!(core::mem::size_of::<Nsecs>() >= 4);
-
- let mut t = Timespec {
- tv_sec: 0,
- tv_nsec: 0,
- };
-
- // `tv_nsec` needs to be able to hold nanoseconds up to a second.
- t.tv_nsec = 999_999_999_u32 as _;
- assert_eq!(t.tv_nsec as u64, 999_999_999_u64);
-
- // `tv_sec` needs to be able to hold more than 32-bits of seconds.
- t.tv_sec = 0x1_0000_0000_u64 as _;
- assert_eq!(t.tv_sec as u64, 0x1_0000_0000_u64);
- }
-
- // Test that our workarounds are needed.
- #[cfg(fix_y2038)]
- #[test]
- #[allow(deprecated)]
- fn test_fix_y2038() {
- assert_eq_size!(libc::time_t, u32);
- }
-
- // Test that our workarounds are not needed.
- #[cfg(not(fix_y2038))]
- #[test]
- fn timespec_layouts() {
- use crate::backend::c;
- check_renamed_struct!(Timespec, timespec, tv_sec, tv_nsec);
- }
-
- // Test that `Timespec` matches Linux's `__kernel_timespec`.
- #[cfg(linux_kernel)]
- #[test]
- fn test_against_kernel_timespec() {
- assert_eq_size!(Timespec, linux_raw_sys::general::__kernel_timespec);
- assert_eq_align!(Timespec, linux_raw_sys::general::__kernel_timespec);
- assert_eq!(
- memoffset::span_of!(Timespec, tv_sec),
- memoffset::span_of!(linux_raw_sys::general::__kernel_timespec, tv_sec)
- );
- assert_eq!(
- memoffset::span_of!(Timespec, tv_nsec),
- memoffset::span_of!(linux_raw_sys::general::__kernel_timespec, tv_nsec)
- );
- }
-}