Skip to content

Commit

Permalink
Rollup merge of rust-lang#57860 - jethrogb:jb/sgx-os-ffi, r=joshtriplett
Browse files Browse the repository at this point in the history
Add os::fortanix_sgx::ffi module

This uses the same byte slice accessors that Unix has. The [ABI specifies](https://docs.rs/fortanix-sgx-abi/0.3.2/fortanix_sgx_abi/struct.ByteBuffer.html) byte slices.
  • Loading branch information
Centril committed Jan 24, 2019
2 parents bbae978 + 8db59d4 commit eea9b2c
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/libstd/os/fortanix_sgx/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,4 @@ pub mod mem {
pub use sys::abi::mem::*;
}

pub use sys::ext::{io, arch};
pub use sys::ext::{io, arch, ffi};
109 changes: 109 additions & 0 deletions src/libstd/sys/sgx/ext/ffi.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
//! SGX-specific extension to the primitives in the `std::ffi` module

#![unstable(feature = "sgx_platform", issue = "56975")]

use ffi::{OsStr, OsString};
use mem;
use sys::os_str::Buf;
use sys_common::{FromInner, IntoInner, AsInner};

/// SGX-specific extensions to [`OsString`].
///
/// [`OsString`]: ../../../../std/ffi/struct.OsString.html
#[unstable(feature = "sgx_platform", issue = "56975")]
pub trait OsStringExt {
/// Creates an [`OsString`] from a byte vector.
///
/// # Examples
///
/// ```
/// use std::ffi::OsString;
/// use std::os::unix::ffi::OsStringExt;
///
/// let bytes = b"foo".to_vec();
/// let os_string = OsString::from_vec(bytes);
/// assert_eq!(os_string.to_str(), Some("foo"));
/// ```
///
/// [`OsString`]: ../../../ffi/struct.OsString.html
#[unstable(feature = "sgx_platform", issue = "56975")]
fn from_vec(vec: Vec<u8>) -> Self;

/// Yields the underlying byte vector of this [`OsString`].
///
/// # Examples
///
/// ```
/// use std::ffi::OsString;
/// use std::os::unix::ffi::OsStringExt;
///
/// let mut os_string = OsString::new();
/// os_string.push("foo");
/// let bytes = os_string.into_vec();
/// assert_eq!(bytes, b"foo");
/// ```
///
/// [`OsString`]: ../../../ffi/struct.OsString.html
#[unstable(feature = "sgx_platform", issue = "56975")]
fn into_vec(self) -> Vec<u8>;
}

#[unstable(feature = "sgx_platform", issue = "56975")]
impl OsStringExt for OsString {
fn from_vec(vec: Vec<u8>) -> OsString {
FromInner::from_inner(Buf { inner: vec })
}
fn into_vec(self) -> Vec<u8> {
self.into_inner().inner
}
}

/// SGX-specific extensions to [`OsStr`].
///
/// [`OsStr`]: ../../../../std/ffi/struct.OsStr.html
#[unstable(feature = "sgx_platform", issue = "56975")]
pub trait OsStrExt {
#[unstable(feature = "sgx_platform", issue = "56975")]
/// Creates an [`OsStr`] from a byte slice.
///
/// # Examples
///
/// ```
/// use std::ffi::OsStr;
/// use std::os::unix::ffi::OsStrExt;
///
/// let bytes = b"foo";
/// let os_str = OsStr::from_bytes(bytes);
/// assert_eq!(os_str.to_str(), Some("foo"));
/// ```
///
/// [`OsStr`]: ../../../ffi/struct.OsStr.html
fn from_bytes(slice: &[u8]) -> &Self;

/// Gets the underlying byte view of the [`OsStr`] slice.
///
/// # Examples
///
/// ```
/// use std::ffi::OsStr;
/// use std::os::unix::ffi::OsStrExt;
///
/// let mut os_str = OsStr::new("foo");
/// let bytes = os_str.as_bytes();
/// assert_eq!(bytes, b"foo");
/// ```
///
/// [`OsStr`]: ../../../ffi/struct.OsStr.html
#[unstable(feature = "sgx_platform", issue = "56975")]
fn as_bytes(&self) -> &[u8];
}

#[unstable(feature = "sgx_platform", issue = "56975")]
impl OsStrExt for OsStr {
fn from_bytes(slice: &[u8]) -> &OsStr {
unsafe { mem::transmute(slice) }
}
fn as_bytes(&self) -> &[u8] {
&self.as_inner().inner
}
}
1 change: 1 addition & 0 deletions src/libstd/sys/sgx/ext/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@

pub mod arch;
pub mod io;
pub mod ffi;

0 comments on commit eea9b2c

Please sign in to comment.