blob: 5118984443627f397e3695090df649cea2db10c1 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License..
use sgx_types::*;
use super::*;
use alloc::slice;
use alloc::vec::Vec;
use alloc::boxed::Box;
use core::ptr;
use core::mem;
const MAX_OCALL_ALLOC_SIZE: size_t = 0x4000; //16K
extern "C" {
// memory
pub fn u_malloc_ocall(result: *mut *mut c_void, error: *mut c_int, size: size_t) -> sgx_status_t;
pub fn u_free_ocall(p: *mut c_void) -> sgx_status_t;
pub fn u_mmap_ocall(result: *mut *mut c_void,
error: *mut c_int,
start: *mut c_void,
length: size_t,
prot: c_int,
flags: c_int,
fd: c_int,
offset: off_t) -> sgx_status_t;
pub fn u_munmap_ocall(result: *mut c_int,
error: *mut c_int,
start: *mut c_void,
length: size_t) -> sgx_status_t;
pub fn u_msync_ocall(result: *mut c_int,
error: *mut c_int,
addr: *mut c_void,
length: size_t,
flags: c_int) -> sgx_status_t;
pub fn u_mprotect_ocall(result: *mut c_int,
error: *mut c_int,
addr: *mut c_void,
length: size_t,
prot: c_int) -> sgx_status_t;
// env
pub fn u_getuid_ocall(result: *mut uid_t) -> sgx_status_t;
pub fn u_environ_ocall(result: *mut *const *const c_char) -> sgx_status_t;
pub fn u_getenv_ocall(result: *mut *const c_char,
name: *const c_char) -> sgx_status_t;
pub fn u_setenv_ocall(result: *mut c_int,
error: *mut c_int,
name: *const c_char,
value: *const c_char,
overwrite: c_int) -> sgx_status_t;
pub fn u_unsetenv_ocall(result: *mut c_int,
error: *mut c_int,
name: *const c_char) -> sgx_status_t;
pub fn u_getcwd_ocall(result: *mut *mut c_char,
error: *mut c_int,
buf: *mut c_char,
size: size_t) -> sgx_status_t;
pub fn u_chdir_ocall(result: *mut c_int, error: *mut c_int, dir: *const c_char) -> sgx_status_t;
pub fn u_getpwuid_r_ocall(result: *mut c_int,
uid: uid_t,
pwd: *mut passwd,
buf: *mut c_char,
buflen: size_t,
passwd_result: *mut *mut passwd) -> sgx_status_t;
// file
pub fn u_open_ocall(result: *mut c_int,
error: *mut c_int,
path: *const c_char,
flags: c_int) -> sgx_status_t;
pub fn u_open64_ocall(result: *mut c_int,
error: *mut c_int,
path: *const c_char,
oflag: c_int,
mode: c_int) -> sgx_status_t;
pub fn u_fstat_ocall(result: *mut c_int,
error: *mut c_int,
fd: c_int,
buf: *mut stat) -> sgx_status_t;
pub fn u_fstat64_ocall(result: *mut c_int,
error: *mut c_int,
fd: c_int,
buf: *mut stat64) -> sgx_status_t;
pub fn u_stat_ocall(result: *mut c_int,
error: *mut c_int,
path: *const c_char,
buf: *mut stat) -> sgx_status_t;
pub fn u_stat64_ocall(result: *mut c_int,
error: *mut c_int,
path: *const c_char,
buf: *mut stat64) -> sgx_status_t;
pub fn u_lstat_ocall(result: *mut c_int,
error: *mut c_int,
path: *const c_char,
buf: *mut stat) -> sgx_status_t;
pub fn u_lstat64_ocall(result: *mut c_int,
error: *mut c_int,
path: *const c_char,
buf: *mut stat64) -> sgx_status_t;
pub fn u_lseek_ocall(result: *mut off_t,
error: *mut c_int,
fd: c_int,
offset: off_t,
whence: c_int) -> sgx_status_t;
pub fn u_lseek64_ocall(result: *mut off64_t,
error: *mut c_int,
fd: c_int,
offset: off64_t,
whence: c_int) -> sgx_status_t;
pub fn u_ftruncate_ocall(result: *mut c_int,
error: *mut c_int,
fd: c_int,
length: off_t) -> sgx_status_t;
pub fn u_ftruncate64_ocall(result: *mut c_int,
error: *mut c_int,
fd: c_int,
length: off64_t) -> sgx_status_t;
pub fn u_truncate_ocall(result: *mut c_int,
error: *mut c_int,
path: *const c_char,
length: off_t) -> sgx_status_t;
pub fn u_truncate64_ocall(result: *mut c_int,
error: *mut c_int,
path: *const c_char,
length: off64_t) -> sgx_status_t;
pub fn u_fsync_ocall(result: *mut c_int,
error: *mut c_int,
fd: c_int) -> sgx_status_t;
pub fn u_fdatasync_ocall(result: *mut c_int,
error: *mut c_int,
fd: c_int) -> sgx_status_t;
pub fn u_fchmod_ocall(result: *mut c_int,
error: *mut c_int,
fd: c_int,
mode: mode_t) -> sgx_status_t;
pub fn u_unlink_ocall(result: *mut c_int,
error: *mut c_int,
pathname: *const c_char) -> sgx_status_t;
pub fn u_link_ocall(result: *mut c_int,
error: *mut c_int,
oldpath: *const c_char,
newpath: *const c_char) -> sgx_status_t;
pub fn u_rename_ocall(result: *mut c_int,
error: *mut c_int,
oldpath: *const c_char,
newpath: *const c_char) -> sgx_status_t;
pub fn u_chmod_ocall(result: *mut c_int,
error: *mut c_int,
path: *const c_char,
mode: mode_t) -> sgx_status_t;
pub fn u_readlink_ocall(result: *mut ssize_t,
error: *mut c_int,
path: *const c_char,
buf: *mut c_char,
bufsz: size_t) -> sgx_status_t;
pub fn u_symlink_ocall(result: *mut c_int,
error: *mut c_int,
path1: *const c_char,
path2: *const c_char) -> sgx_status_t;
pub fn u_realpath_ocall(result: *mut *mut c_char,
error: *mut c_int,
pathname: *const c_char) -> sgx_status_t;
pub fn u_mkdir_ocall(result: *mut c_int,
error: *mut c_int,
pathname: *const c_char,
mode: mode_t) -> sgx_status_t;
pub fn u_rmdir_ocall(result: *mut c_int,
error: *mut c_int,
pathname: *const c_char) -> sgx_status_t;
pub fn u_opendir_ocall(result: *mut *mut DIR,
error: *mut c_int,
pathname: *const c_char) -> sgx_status_t;
pub fn u_readdir64_r_ocall(result: *mut c_int,
dirp: *mut DIR,
entry: *mut dirent64,
dirresult: *mut *mut dirent64) -> sgx_status_t;
pub fn u_closedir_ocall(result: *mut c_int,
error: *mut c_int,
dirp: *mut DIR) -> sgx_status_t;
pub fn u_dirfd_ocall(result: *mut c_int,
error: *mut c_int,
dirp: *mut DIR) -> sgx_status_t;
pub fn u_fstatat64_ocall(result: *mut c_int,
error: *mut c_int,
dirfd: c_int,
pathname: *const c_char,
buf: *mut stat64,
flags: c_int) -> sgx_status_t;
// fd
pub fn u_read_ocall(result: *mut ssize_t,
errno: *mut c_int,
fd: c_int,
buf: *mut c_void,
count: size_t) -> sgx_status_t;
pub fn u_pread64_ocall(result: *mut ssize_t,
errno: *mut c_int,
fd: c_int,
buf: *mut c_void,
count: size_t,
offset: off64_t) -> sgx_status_t;
pub fn u_readv_ocall(result: *mut ssize_t,
errno: *mut c_int,
fd: c_int,
iov: *const iovec,
iovcnt: c_int) -> sgx_status_t;
pub fn u_preadv64_ocall(result: *mut ssize_t,
errno: *mut c_int,
fd: c_int,
iov: *const iovec,
iovcnt: c_int,
offset: off64_t) -> sgx_status_t;
pub fn u_write_ocall(result: *mut ssize_t,
errno: *mut c_int,
fd: c_int,
buf: *const c_void,
count: size_t) -> sgx_status_t;
pub fn u_pwrite64_ocall(result: *mut ssize_t,
errno: *mut c_int,
fd: c_int,
buf: *const c_void,
count: size_t,
offset: off64_t) -> sgx_status_t;
pub fn u_writev_ocall(result: *mut ssize_t,
errno: *mut c_int,
fd: c_int,
iov: *const iovec,
iovcnt: c_int) -> sgx_status_t;
pub fn u_pwritev64_ocall(result: *mut ssize_t,
errno: *mut c_int,
fd: c_int,
iov: *const iovec,
iovcnt: c_int,
offset: off64_t) -> sgx_status_t;
pub fn u_fcntl_arg0_ocall(result: *mut c_int,
errno: *mut c_int,
fd: c_int,
cmd: c_int) -> sgx_status_t;
pub fn u_fcntl_arg1_ocall(result: *mut c_int,
errno: *mut c_int,
fd: c_int,
cmd: c_int,
arg: c_int) -> sgx_status_t;
pub fn u_ioctl_arg0_ocall(result: *mut c_int,
errno: *mut c_int,
fd: c_int,
request: c_int) -> sgx_status_t;
pub fn u_ioctl_arg1_ocall(result: *mut c_int,
errno: *mut c_int,
fd: c_int,
request: c_int,
arg: *mut c_int) -> sgx_status_t;
pub fn u_close_ocall(result: *mut c_int,
errno: *mut c_int,
fd: c_int) -> sgx_status_t;
// time
pub fn u_clock_gettime_ocall(result: *mut c_int,
errno: *mut c_int,
clk_id: clockid_t,
tp: *mut timespec) -> sgx_status_t;
// socket
pub fn u_socket_ocall(result: *mut c_int,
errno: *mut c_int,
domain: c_int,
ty: c_int,
protocol: c_int) -> sgx_status_t;
pub fn u_socketpair_ocall(result: *mut c_int,
errno: *mut c_int,
domain: c_int,
ty: c_int,
protocol: c_int,
sv: *mut c_int) -> sgx_status_t;
pub fn u_bind_ocall(result: *mut c_int,
errno: *mut c_int,
sockfd: c_int,
address: *const sockaddr,
addrlen: socklen_t) -> sgx_status_t;
pub fn u_listen_ocall(result: *mut c_int,
error: *mut c_int,
sockfd: c_int,
backlog: c_int) -> sgx_status_t;
pub fn u_accept_ocall(result: *mut c_int,
errno: *mut c_int,
sockfd: c_int,
addr: *mut sockaddr,
addrlen_in: socklen_t,
addrlen_out: *mut socklen_t) -> sgx_status_t;
pub fn u_accept4_ocall(result: *mut c_int,
errno: *mut c_int,
sockfd: c_int,
addr: *mut sockaddr,
addrlen_in: socklen_t,
addrlen_out: *mut socklen_t,
flags: c_int) -> sgx_status_t;
pub fn u_connect_ocall(result: *mut c_int,
errno: *mut c_int,
sockfd: c_int,
address: *const sockaddr,
addrlen: socklen_t) -> sgx_status_t;
pub fn u_send_ocall(result: *mut ssize_t,
errno: *mut c_int,
sockfd: c_int,
buf: *const c_void,
len: size_t,
flags: c_int) -> sgx_status_t;
pub fn u_sendto_ocall(result: *mut ssize_t,
errno: *mut c_int,
sockfd: c_int,
buf: *const c_void,
len: size_t,
flags: c_int,
addr: *const sockaddr,
addrlen: socklen_t) -> sgx_status_t;
pub fn u_sendmsg_ocall(result: *mut ssize_t,
error: *mut c_int,
sockfd: c_int,
msg: *const msghdr,
flags: c_int) -> sgx_status_t;
pub fn u_recv_ocall(result: *mut ssize_t,
errno: *mut c_int,
sockfd: c_int,
buf: *mut c_void,
len: size_t,
flags: c_int) -> sgx_status_t;
pub fn u_recvfrom_ocall(result: *mut ssize_t,
errno: *mut c_int,
sockfd: c_int,
buf: *mut c_void,
len: size_t,
flags: c_int,
addr: *mut sockaddr,
addrlen_in: socklen_t,
addrlen_out: *mut socklen_t) -> sgx_status_t;
pub fn u_recvmsg_ocall(result: *mut ssize_t,
error: *mut c_int,
sockfd: c_int,
msg: *mut msghdr,
flags: c_int) -> sgx_status_t;
pub fn u_setsockopt_ocall(result: *mut c_int,
errno: *mut c_int,
sockfd: c_int,
level: c_int,
optname: c_int,
optval: *const c_void,
optlen: socklen_t) -> sgx_status_t;
pub fn u_getsockopt_ocall(result: *mut c_int,
errno: *mut c_int,
sockfd: c_int,
level: c_int,
optname: c_int,
optval: *mut c_void,
optlen_in: socklen_t,
optlen_out: *mut socklen_t) -> sgx_status_t;
pub fn u_getpeername_ocall(result: *mut c_int,
errno: *mut c_int,
sockfd: c_int,
address: *mut sockaddr,
addrlen_in: socklen_t,
addrlen_out: *mut socklen_t) -> sgx_status_t;
pub fn u_getsockname_ocall(result: *mut c_int,
errno: *mut c_int,
sockfd: c_int,
address: *mut sockaddr,
addrlen_in: socklen_t,
addrlen_out: *mut socklen_t) -> sgx_status_t;
pub fn u_shutdown_ocall(result: *mut c_int,
errno: *mut c_int,
sockfd: c_int,
how: c_int) -> sgx_status_t;
// net
pub fn u_getaddrinfo_ocall(result: *mut c_int,
errno: *mut c_int,
node: *const c_char,
service: *const c_char,
hints: *const addrinfo,
res: *mut *mut addrinfo) -> sgx_status_t;
pub fn u_freeaddrinfo_ocall(res: *mut addrinfo) -> sgx_status_t;
pub fn u_gai_strerror_ocall(result: *mut *const c_char, errcode: c_int) -> sgx_status_t;
// async io
pub fn u_poll_ocall(result: *mut c_int,
errno: *mut c_int,
fds: *mut pollfd,
nfds: nfds_t,
timeout: c_int) -> sgx_status_t;
pub fn u_epoll_create1_ocall(result: *mut c_int,
error: *mut c_int,
flags: c_int) -> sgx_status_t;
pub fn u_epoll_ctl_ocall(result: *mut c_int,
error: *mut c_int,
epfd: c_int,
op: c_int,
fd: c_int,
event: *mut epoll_event) -> sgx_status_t;
pub fn u_epoll_wait_ocall(result: *mut c_int,
error: *mut c_int,
epfd: c_int,
events: *mut epoll_event,
maxevents: c_int,
timeout: c_int) -> sgx_status_t;
// sys
pub fn u_sysconf_ocall(result: *mut c_long,
error: *mut c_int,
name: c_int) -> sgx_status_t;
pub fn u_prctl_ocall(result: *mut c_int,
error: *mut c_int,
option: c_int,
arg2: c_ulong,
arg3: c_ulong,
arg4: c_ulong,
arg5: c_ulong) -> sgx_status_t;
pub fn u_sched_setaffinity_ocall(result: *mut c_int,
error: *mut c_int,
pid: pid_t,
cpusetsize: size_t,
mask: *const cpu_set_t) -> sgx_status_t;
pub fn u_sched_getaffinity_ocall(result: *mut c_int,
error: *mut c_int,
pid: pid_t,
cpusetsize: size_t,
mask: *mut cpu_set_t) -> sgx_status_t;
// pipe
pub fn u_pipe_ocall(result: *mut c_int,
error: *mut c_int,
fds: *mut c_int) -> sgx_status_t;
pub fn u_pipe2_ocall(result: *mut c_int,
error: *mut c_int,
fds: *mut c_int,
flags: c_int) -> sgx_status_t;
//thread
pub fn u_sched_yield_ocall(result: *mut c_int,
error: *mut c_int) -> sgx_status_t;
pub fn u_nanosleep_ocall(result: *mut c_int,
error: *mut c_int,
rqtp: *const timespec,
rmtp: *mut timespec) -> sgx_status_t;
//signal
pub fn u_sigaction_ocall(result: *mut c_int,
error: *mut c_int,
signum: c_int,
act: *const sigaction,
oldact: *mut sigaction,
enclave_id: uint64_t) -> sgx_status_t;
pub fn u_sigprocmask_ocall(result: *mut c_int,
error: *mut c_int,
signum: c_int,
set: *const sigset_t,
oldset: *mut sigset_t) -> sgx_status_t;
pub fn u_raise_ocall(result: *mut c_int, signum: c_int) -> sgx_status_t;
//process
pub fn u_getpid_ocall(result: *mut pid_t) -> sgx_status_t;
}
pub unsafe fn malloc(size: size_t) -> *mut c_void {
let mut result: *mut c_void = ptr::null_mut();
let mut error: c_int = 0;
let status = u_malloc_ocall(&mut result as *mut *mut c_void,
&mut error as *mut c_int,
size);
if status == sgx_status_t::SGX_SUCCESS {
if result.is_null() {
set_errno(error);
}
} else {
set_errno(ESGX);
result = ptr::null_mut();
}
result
}
pub unsafe fn free(p: *mut c_void) {
let _ = u_free_ocall(p);
}
pub unsafe fn mmap(start: *mut c_void,
length: size_t,
prot: c_int,
flags: c_int,
fd: c_int,
offset: off_t) -> *mut c_void {
let mut result: *mut c_void = ptr::null_mut();
let mut error: c_int = 0;
let status = u_mmap_ocall(&mut result as *mut *mut c_void,
&mut error as *mut c_int,
start,
length,
prot,
flags,
fd,
offset);
if status == sgx_status_t::SGX_SUCCESS {
if result as isize == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1 as isize as *mut c_void;
}
result
}
pub unsafe fn munmap(start: *mut c_void, length: size_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_munmap_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
start,
length);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn msync(addr: *mut c_void, length: size_t, flags: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_msync_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
addr,
length,
flags);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn mprotect(addr: *mut c_void, length: size_t, prot: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_mprotect_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
addr,
length,
prot);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn getuid() -> uid_t {
let mut result: uid_t = 0;
let status = u_getuid_ocall(&mut result as *mut uid_t);
if status != sgx_status_t::SGX_SUCCESS {
set_errno(ESGX);
result = 0;
}
result
}
pub unsafe fn environ() -> *const *const c_char {
let mut result: *const *const c_char = ptr::null();
let status = u_environ_ocall(&mut result as *mut *const *const c_char);
if status != sgx_status_t::SGX_SUCCESS {
result = ptr::null();
}
result
}
pub unsafe fn getenv(name: *const c_char) -> *const c_char {
let mut result: *const c_char = ptr::null();
let status = u_getenv_ocall(&mut result as *mut *const c_char, name);
if status != sgx_status_t::SGX_SUCCESS {
result = ptr::null();
}
result
}
pub unsafe fn setenv(name: *const c_char, value: *const c_char, overwrite: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_setenv_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
name,
value,
overwrite);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn unsetenv(name: *const c_char) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_unsetenv_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
name);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn getcwd(buf: *mut c_char, size: size_t) -> *mut c_char {
let mut result: *mut c_char = ptr::null_mut();
let mut error: c_int = 0;
let status = u_getcwd_ocall(&mut result as *mut *mut c_char, &mut error as *mut c_int, buf, size);
if status == sgx_status_t::SGX_SUCCESS {
if result.is_null() {
set_errno(error);
} else {
result = buf;
}
} else {
set_errno(ESGX);
result = ptr::null_mut();
}
result
}
pub unsafe fn chdir(dir: *const c_char) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_chdir_ocall(&mut result as *mut c_int, &mut error as *mut c_int, dir);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn getpwuid_r(uid: uid_t,
pwd: *mut passwd,
buf: *mut c_char,
buflen: size_t,
passwd_result: *mut *mut passwd) -> c_int {
let mut result: c_int = 0;
let status = u_getpwuid_r_ocall(&mut result as *mut c_int,
uid,
pwd,
buf,
buflen,
passwd_result);
if status == sgx_status_t::SGX_SUCCESS && result == 0 {
let pwd_ret = *passwd_result;
if !pwd_ret.is_null() {
let mut temp_pwd = &mut *pwd;
let mut temp_buf = buf;
if temp_pwd.pw_name as usize != -1_isize as usize {
temp_pwd.pw_name = temp_buf.offset(temp_pwd.pw_name as isize);
} else {
temp_pwd.pw_name = ptr::null_mut();
}
temp_buf = buf;
if temp_pwd.pw_passwd as usize != -1_isize as usize {
temp_pwd.pw_passwd = temp_buf.offset(temp_pwd.pw_passwd as isize);
} else {
temp_pwd.pw_passwd = ptr::null_mut();
}
temp_buf = buf;
if temp_pwd.pw_gecos as usize != -1_isize as usize {
temp_pwd.pw_gecos = temp_buf.offset(temp_pwd.pw_gecos as isize);
} else {
temp_pwd.pw_gecos = ptr::null_mut();
}
temp_buf = buf;
if temp_pwd.pw_dir as usize != -1_isize as usize {
temp_pwd.pw_dir = temp_buf.offset(temp_pwd.pw_dir as isize);
} else {
temp_pwd.pw_dir = ptr::null_mut();
}
temp_buf = buf;
if temp_pwd.pw_shell as usize != -1_isize as usize {
temp_pwd.pw_shell = temp_buf.offset(temp_pwd.pw_shell as isize);
} else {
temp_pwd.pw_shell = ptr::null_mut();
}
*passwd_result = pwd;
}
} else {
*passwd_result = ptr::null_mut();
if status != sgx_status_t::SGX_SUCCESS {
result = ESGX;
}
}
result
}
pub unsafe fn open(path: *const c_char, flags: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_open_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
path,
flags);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn open64(path: *const c_char, oflag: c_int, mode: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_open64_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
path,
oflag,
mode);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn fstat(fd: c_int, buf: *mut stat) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_fstat_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fd,
buf);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn fstat64(fd: c_int, buf: *mut stat64) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_fstat64_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fd,
buf);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn stat(path: *const c_char, buf: *mut stat) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_stat_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
path,
buf);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn stat64(path: *const c_char, buf: *mut stat64) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_stat64_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
path,
buf);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn lstat(path: *const c_char, buf: *mut stat) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_lstat_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
path,
buf);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn lstat64(path: *const c_char, buf: *mut stat64) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_lstat64_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
path,
buf);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn lseek(fd: c_int, offset: off_t, whence: c_int) -> off_t {
let mut result: off_t = 0;
let mut error: c_int = 0;
let status = u_lseek_ocall(&mut result as *mut off_t,
&mut error as *mut c_int,
fd,
offset,
whence);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn lseek64(fd: c_int, offset: off64_t, whence: c_int) -> off64_t {
let mut result: off64_t = 0;
let mut error: c_int = 0;
let status = u_lseek64_ocall(&mut result as *mut off64_t,
&mut error as *mut c_int,
fd,
offset,
whence);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn ftruncate(fd: c_int, length: off_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_ftruncate_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fd,
length);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn ftruncate64(fd: c_int, length: off64_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_ftruncate64_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fd,
length);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn truncate(path: *const c_char, length: off_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_truncate_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
path,
length);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn truncate64(path: *const c_char, length: off64_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_truncate64_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
path,
length);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn fsync(fd: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_fsync_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fd);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn fdatasync(fd: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_fdatasync_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fd);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn fchmod(fd: c_int, mode: mode_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_fchmod_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fd,
mode);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn unlink(pathname: *const c_char) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_unlink_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
pathname);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn link(oldpath: *const c_char, newpath: *const c_char) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_link_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
oldpath,
newpath);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn rename(oldpath: *const c_char, newpath: *const c_char) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_rename_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
oldpath,
newpath);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn chmod(path: *const c_char, mode: mode_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_chmod_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
path,
mode);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn readlink(path: *const c_char, buf: *mut c_char, bufsz: size_t) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
let status = u_readlink_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
path,
buf,
bufsz);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn symlink(path1: *const c_char, path2: *const c_char) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_symlink_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
path1,
path2);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn realpath(pathname: *const c_char) -> *mut c_char {
let mut result: *mut c_char = ptr::null_mut();
let mut error: c_int = 0;
let status = u_realpath_ocall(&mut result as *mut *mut c_char,
&mut error as *mut c_int,
pathname);
if status == sgx_status_t::SGX_SUCCESS {
if result.is_null() {
set_errno(error);
}
} else {
set_errno(ESGX);
result = ptr::null_mut();
}
result
}
pub unsafe fn mkdir(pathname: *const c_char, mode: mode_t) -> c_int {
let mut error: c_int = 0;
let mut result: c_int = 0;
let status = u_mkdir_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
pathname,
mode);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn rmdir(pathname: *const c_char) -> c_int {
let mut error: c_int = 0;
let mut result: c_int = 0;
let status = u_rmdir_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
pathname);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn opendir(pathname: *const c_char) -> *mut DIR {
let mut result: *mut DIR = ptr::null_mut();
let mut error: c_int = 0;
let status = u_opendir_ocall(&mut result as *mut *mut DIR,
&mut error as *mut c_int,
pathname);
if status == sgx_status_t::SGX_SUCCESS {
if result.is_null() {
set_errno(error);
}
} else {
set_errno(ESGX);
result = ptr::null_mut();
}
result
}
pub unsafe fn readdir64_r(dirp: *mut DIR,
entry: *mut dirent64,
dirresult: *mut *mut dirent64) -> c_int {
let mut result: c_int = 0;
let status = u_readdir64_r_ocall(&mut result as *mut c_int,
dirp,
entry,
dirresult);
if status == sgx_status_t::SGX_SUCCESS && result == 0 {
let dir_ret = *dirresult;
if !dir_ret.is_null() {
*dirresult = entry;
}
} else {
*dirresult = ptr::null_mut();
if status != sgx_status_t::SGX_SUCCESS {
result = ESGX;
}
}
result
}
pub unsafe fn closedir(dirp: *mut DIR) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_closedir_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
dirp);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn dirfd(dirp: *mut DIR) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_dirfd_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
dirp);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn fstatat64(dirfd: c_int,
pathname: *const c_char,
buf: *mut stat64,
flags: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_fstatat64_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
dirfd,
pathname,
buf,
flags);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn read(fd: c_int, buf: *mut c_void, count: size_t) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
if buf.is_null() || sgx_is_within_enclave(buf, count) == 0 {
set_errno(EINVAL);
return -1;
}
if count >= usize::max_value() {
set_errno(EINVAL);
return -1;
}
let tmp_buf = if count <= MAX_OCALL_ALLOC_SIZE {
sgx_ocalloc(count)
} else {
malloc(count)
};
if tmp_buf.is_null() {
set_errno(ENOMEM );
return -1;
}
tmp_buf.write_bytes(0_u8, count);
let status = u_read_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
fd,
tmp_buf,
count);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if result != -1 {
ptr::copy_nonoverlapping(tmp_buf as *const u8, buf as *mut u8, count);
}
if count <= MAX_OCALL_ALLOC_SIZE {
sgx_ocfree();
} else {
free(tmp_buf);
}
result
}
pub unsafe fn pread64(fd: c_int, buf: *mut c_void, count: size_t, offset: off64_t) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
if buf.is_null() || sgx_is_within_enclave(buf, count) == 0 {
set_errno(EINVAL);
return -1;
}
if count >= usize::max_value() {
set_errno(EINVAL);
return -1;
}
let tmp_buf = if count <= MAX_OCALL_ALLOC_SIZE {
sgx_ocalloc(count)
} else {
malloc(count)
};
if tmp_buf.is_null() {
set_errno(ENOMEM );
return -1;
}
tmp_buf.write_bytes(0_u8, count);
let status = u_pread64_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
fd,
tmp_buf,
count,
offset);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if result != -1 {
ptr::copy_nonoverlapping(tmp_buf as *const u8, buf as *mut u8, count);
}
if count <= MAX_OCALL_ALLOC_SIZE {
sgx_ocfree();
} else {
free(tmp_buf);
}
result
}
pub unsafe fn readv(fd: c_int, iov: *const iovec, iovcnt: c_int) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
let mut ptr: *mut u8 = ptr::null_mut();
let mut iosize: usize = 0;
if iov.is_null() || iovcnt <= 0 ||
sgx_is_within_enclave(iov as *const c_void, iovcnt as usize * mem::size_of::<iovec>()) == 0 {
set_errno(EINVAL);
return -1;
}
let v = slice::from_raw_parts(iov, iovcnt as usize);
for io in v {
if !io.iov_base.is_null() && io.iov_len > 0 &&
sgx_is_within_enclave(io.iov_base, io.iov_len as usize) != 0 {
iosize += io.iov_len as usize;
} else {
set_errno(EINVAL);
return -1;
}
}
let iobase = malloc(iosize) as *mut u8;
if iobase.is_null() {
set_errno(ENOMEM );
return -1;
}
iobase.write_bytes(0_u8, iosize);
let mut tmpiovec: Vec<iovec> = Vec::with_capacity(iovcnt as usize);
ptr = iobase;
for io in v {
let tmpiov = iovec{iov_base: ptr as *mut c_void,
iov_len: io.iov_len};
tmpiovec.push(tmpiov);
ptr = ptr.add(io.iov_len as usize);
}
let status = u_readv_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
fd,
tmpiovec.as_slice().as_ptr(),
iovcnt);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if result != -1 {
for i in 0..v.len() {
ptr::copy_nonoverlapping(tmpiovec[i].iov_base as *const u8, v[i].iov_base as *mut u8, v[i].iov_len as usize);
}
}
free(iobase as *mut c_void);
result
}
pub unsafe fn preadv64(fd: c_int, iov: *const iovec, iovcnt: c_int, offset: off64_t) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
let mut ptr: *mut u8 = ptr::null_mut();
let mut iosize: usize = 0;
if iov.is_null() || iovcnt <= 0 ||
sgx_is_within_enclave(iov as *const c_void, iovcnt as usize * mem::size_of::<iovec>()) == 0 {
set_errno(EINVAL);
return -1;
}
let v = slice::from_raw_parts(iov, iovcnt as usize);
for io in v {
if !io.iov_base.is_null() && io.iov_len > 0 &&
sgx_is_within_enclave(io.iov_base, io.iov_len as usize) != 0 {
iosize += io.iov_len as usize;
} else {
set_errno(EINVAL);
return -1;
}
}
let iobase = malloc(iosize) as *mut u8;
if iobase.is_null() {
set_errno(ENOMEM );
return -1;
}
iobase.write_bytes(0_u8, iosize);
let mut tmpiovec: Vec<iovec> = Vec::with_capacity(iovcnt as usize);
ptr = iobase;
for io in v {
let tmpiov = iovec{iov_base: ptr as *mut c_void,
iov_len: io.iov_len};
tmpiovec.push(tmpiov);
ptr = ptr.add(io.iov_len as usize);
}
let status = u_preadv64_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
fd,
tmpiovec.as_slice().as_ptr(),
iovcnt,
offset);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if result != -1 {
for i in 0..v.len() {
ptr::copy_nonoverlapping(tmpiovec[i].iov_base as *const u8, v[i].iov_base as *mut u8, v[i].iov_len as usize);
}
}
free(iobase as *mut c_void);
result
}
pub unsafe fn write(fd: c_int, buf: *const c_void, count: size_t) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
if buf.is_null() || sgx_is_within_enclave(buf, count) == 0 {
set_errno(EINVAL);
return -1;
}
if count >= usize::max_value() {
set_errno(EINVAL);
return -1;
}
let tmp_buf = if count <= MAX_OCALL_ALLOC_SIZE {
sgx_ocalloc(count)
} else {
malloc(count)
};
if tmp_buf.is_null() {
set_errno(ENOMEM );
return -1;
}
ptr::copy_nonoverlapping(buf as *const u8, tmp_buf as *mut u8, count);
let status = u_write_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
fd,
tmp_buf,
count);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if count <= MAX_OCALL_ALLOC_SIZE {
sgx_ocfree();
} else {
free(tmp_buf);
}
result
}
pub unsafe fn pwrite64(fd: c_int, buf: *const c_void, count: size_t, offset: off64_t) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
if buf.is_null() || sgx_is_within_enclave(buf, count) == 0 {
set_errno(EINVAL);
return -1;
}
if count >= usize::max_value() {
set_errno(EINVAL);
return -1;
}
let tmp_buf = if count <= MAX_OCALL_ALLOC_SIZE {
sgx_ocalloc(count)
} else {
malloc(count)
};
if tmp_buf.is_null() {
set_errno(ENOMEM );
return -1;
}
ptr::copy_nonoverlapping(buf as *const u8, tmp_buf as *mut u8, count);
let status = u_pwrite64_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
fd,
tmp_buf,
count,
offset);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if count <= MAX_OCALL_ALLOC_SIZE {
sgx_ocfree();
} else {
free(tmp_buf);
}
result
}
pub unsafe fn writev(fd: c_int, iov: *const iovec, iovcnt: c_int) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
let mut ptr: *mut u8 = ptr::null_mut();
let mut iosize: usize = 0;
if iov.is_null() || iovcnt <= 0 ||
sgx_is_within_enclave(iov as *const c_void, iovcnt as usize * mem::size_of::<iovec>()) == 0 {
set_errno(EINVAL);
return -1;
}
let v = slice::from_raw_parts(iov, iovcnt as usize);
for io in v {
if !io.iov_base.is_null() && io.iov_len > 0 &&
sgx_is_within_enclave(io.iov_base, io.iov_len as usize) != 0 {
iosize += io.iov_len as usize;
} else {
set_errno(EINVAL);
return -1;
}
}
let iobase = malloc(iosize) as *mut u8;
if iobase.is_null() {
set_errno(ENOMEM );
return -1;
}
iobase.write_bytes(0_u8, iosize);
let mut tmpiovec: Vec<iovec> = Vec::with_capacity(iovcnt as usize);
ptr = iobase;
for io in v {
let tmpiov = iovec{iov_base: ptr as *mut c_void,
iov_len: io.iov_len};
ptr::copy_nonoverlapping(io.iov_base as *const u8, tmpiov.iov_base as *mut u8, io.iov_len as usize);
tmpiovec.push(tmpiov);
ptr = ptr.add(io.iov_len as usize);
}
let status = u_writev_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
fd,
tmpiovec.as_slice().as_ptr(),
iovcnt);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
free(iobase as *mut c_void);
result
}
pub unsafe fn pwritev64(fd: c_int, iov: *const iovec, iovcnt: c_int, offset: off64_t) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
let mut ptr: *mut u8 = ptr::null_mut();
let mut iosize: usize = 0;
if iov.is_null() || iovcnt <= 0 ||
sgx_is_within_enclave(iov as *const c_void, iovcnt as usize * mem::size_of::<iovec>()) ==0 {
set_errno(EINVAL);
return -1;
}
let v = slice::from_raw_parts(iov, iovcnt as usize);
for io in v {
if !io.iov_base.is_null() && io.iov_len > 0 &&
sgx_is_within_enclave(io.iov_base, io.iov_len as usize) != 0 {
iosize += io.iov_len as usize;
} else {
set_errno(EINVAL);
return -1;
}
}
let iobase = malloc(iosize) as *mut u8;
if iobase.is_null() {
set_errno(ENOMEM );
return -1;
}
iobase.write_bytes(0_u8, iosize);
let mut tmpiovec: Vec<iovec> = Vec::with_capacity(iovcnt as usize);
ptr = iobase;
for io in v {
let tmpiov = iovec{iov_base: ptr as *mut c_void,
iov_len: io.iov_len};
ptr::copy_nonoverlapping(io.iov_base as *const u8, tmpiov.iov_base as *mut u8, io.iov_len as usize);
tmpiovec.push(tmpiov);
ptr = ptr.add(io.iov_len as usize);
}
let status = u_pwritev64_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
fd,
tmpiovec.as_slice().as_ptr(),
iovcnt,
offset);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
free(iobase as *mut c_void);
result
}
pub unsafe fn fcntl_arg0(fd: c_int, cmd: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_fcntl_arg0_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fd,
cmd);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn fcntl_arg1(fd: c_int, cmd: c_int, arg: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_fcntl_arg1_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fd,
cmd,
arg);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn ioctl_arg0(fd: c_int, request: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_ioctl_arg0_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fd,
request);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn ioctl_arg1(fd: c_int, request: c_int, arg: *mut c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_ioctl_arg1_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fd,
request,
arg);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn close(fd: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_close_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fd);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn clock_gettime(clk_id: clockid_t, tp: *mut timespec) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_clock_gettime_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
clk_id,
tp);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn socket(domain: c_int, ty: c_int, protocol: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_socket_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
domain,
ty,
protocol);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn socketpair(domain: c_int, ty: c_int, protocol: c_int, sv: *mut c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_socketpair_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
domain,
ty,
protocol,
sv);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn bind(sockfd: c_int, address: *const sockaddr, addrlen: socklen_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_bind_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
sockfd,
address,
addrlen);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn listen(sockfd: c_int, backlog: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_listen_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
sockfd,
backlog);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn accept(sockfd: c_int, addr: *mut sockaddr, addrlen: *mut socklen_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let len_in: socklen_t = if !addrlen.is_null() { *addrlen } else { 0 };
let mut len_out: socklen_t = 0 as socklen_t;
let status = u_accept_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
sockfd,
addr,
len_in, // This additional arg is just for EDL
&mut len_out as *mut socklen_t);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if !addrlen.is_null() {
*addrlen = len_out;
}
result
}
pub unsafe fn accept4(sockfd: c_int, addr: *mut sockaddr, addrlen: *mut socklen_t, flags: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let len_in: socklen_t = if !addrlen.is_null() { *addrlen } else { 0 };
let mut len_out: socklen_t = 0 as socklen_t;
let status = u_accept4_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
sockfd,
addr,
len_in, // This additional arg is just for EDL
&mut len_out as *mut socklen_t,
flags);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if !addrlen.is_null() {
*addrlen = len_out;
}
result
}
pub unsafe fn connect(sockfd: c_int, address: *const sockaddr, addrlen: socklen_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_connect_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
sockfd,
address,
addrlen);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn send(sockfd: c_int, buf: *const c_void, len: size_t, flags: c_int) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
if buf.is_null() || sgx_is_within_enclave(buf, len) == 0 {
set_errno(EINVAL);
return -1;
}
if len >= usize::max_value() {
set_errno(EINVAL);
return -1;
}
let tmp_buf = if len <= MAX_OCALL_ALLOC_SIZE {
sgx_ocalloc(len)
} else {
malloc(len)
};
if tmp_buf.is_null() {
set_errno(ENOMEM );
return -1;
}
ptr::copy_nonoverlapping(buf as *const u8, tmp_buf as *mut u8, len);
let status = u_send_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
sockfd,
tmp_buf,
len,
flags);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if len <= MAX_OCALL_ALLOC_SIZE {
sgx_ocfree();
} else {
free(tmp_buf);
}
result
}
pub unsafe fn sendto(sockfd: c_int,
buf: *const c_void,
len: size_t,
flags: c_int,
addr: *const sockaddr,
addrlen: socklen_t) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
if buf.is_null() || sgx_is_within_enclave(buf, len) == 0 {
set_errno(EINVAL);
return -1;
}
if len >= usize::max_value() {
set_errno(EINVAL);
return -1;
}
let tmp_buf = if len <= MAX_OCALL_ALLOC_SIZE {
sgx_ocalloc(len)
} else {
malloc(len)
};
if tmp_buf.is_null() {
set_errno(ENOMEM );
return -1;
}
ptr::copy_nonoverlapping(buf as *const u8, tmp_buf as *mut u8, len);
let status = u_sendto_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
sockfd,
tmp_buf,
len,
flags,
addr,
addrlen);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if len <= MAX_OCALL_ALLOC_SIZE {
sgx_ocfree();
} else {
free(tmp_buf);
}
result
}
pub unsafe fn sendmsg(sockfd: c_int, msg: *const msghdr, flags: c_int) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
let mut hdrsize: usize = 0;
let mut ptr: *mut u8 = ptr::null_mut();
if msg.is_null() || sgx_is_within_enclave(msg as *const c_void, mem::size_of::<msghdr>()) == 0 {
set_errno(EINVAL);
return -1;
}
let mhdr: &msghdr = &*msg;
if !mhdr.msg_name.is_null() && mhdr.msg_namelen > 0 &&
sgx_is_within_enclave(mhdr.msg_name, mhdr.msg_namelen as usize) != 0 {
hdrsize += mhdr.msg_namelen as usize;
}
if !mhdr.msg_iov.is_null() && mhdr.msg_iovlen > 0 &&
sgx_is_within_enclave(mhdr.msg_iov as *const c_void, mhdr.msg_iovlen as usize * mem::size_of::<iovec>()) != 0 {
hdrsize += mhdr.msg_iovlen as usize * mem::size_of::<iovec>();
let v = slice::from_raw_parts(mhdr.msg_iov, mhdr.msg_iovlen as usize);
for io in v {
if !io.iov_base.is_null() && io.iov_len > 0 &&
sgx_is_within_enclave(io.iov_base, io.iov_len as usize) != 0 {
hdrsize += io.iov_len as usize;
} else {
set_errno(EINVAL);
return -1;
}
}
}
if !mhdr.msg_control.is_null() && mhdr.msg_controllen > 0 &&
sgx_is_within_enclave(mhdr.msg_control, mhdr.msg_controllen as usize) != 0 {
hdrsize += mhdr.msg_controllen as usize;
}
let hdrbase = malloc(hdrsize) as *mut u8;
if hdrbase.is_null() {
set_errno(ENOMEM );
return -1;
}
hdrbase.write_bytes(0_u8, hdrsize);
let mut tmpmsg: msghdr = mem::zeroed();
ptr = hdrbase;
if !mhdr.msg_name.is_null() && mhdr.msg_namelen > 0 {
tmpmsg.msg_name = ptr as *mut c_void;
tmpmsg.msg_namelen = mhdr.msg_namelen;
ptr::copy_nonoverlapping(mhdr.msg_name as *const u8, tmpmsg.msg_name as *mut u8, mhdr.msg_namelen as usize);
ptr = ptr.add(mhdr.msg_namelen as usize);
}
if !mhdr.msg_iov.is_null() && mhdr.msg_iovlen > 0 {
let tmpiov = slice::from_raw_parts_mut(ptr as *mut iovec, mhdr.msg_iovlen as usize);
ptr = ptr.add(mhdr.msg_iovlen as usize * mem::size_of::<iovec>());
let v = slice::from_raw_parts(mhdr.msg_iov, mhdr.msg_iovlen as usize);
for i in 0..v.len() {
tmpiov[i].iov_base = ptr as *mut c_void;
tmpiov[i].iov_len = v[i].iov_len;
ptr::copy_nonoverlapping(v[i].iov_base as *const u8, tmpiov[i].iov_base as *mut u8, v[i].iov_len as usize);
ptr = ptr.add(v[i].iov_len as usize);
}
}
if !mhdr.msg_control.is_null() && mhdr.msg_controllen > 0 {
tmpmsg.msg_control = ptr as *mut c_void;
tmpmsg.msg_controllen = mhdr.msg_controllen;
ptr::copy_nonoverlapping(mhdr.msg_control as *const u8, tmpmsg.msg_control as *mut u8, mhdr.msg_controllen as usize);
}
let status = u_sendmsg_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
sockfd,
&tmpmsg as *const msghdr,
flags);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
free(hdrbase as *mut c_void);
result
}
pub unsafe fn recv(sockfd: c_int, buf: *mut c_void, len: size_t, flags: c_int) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
if buf.is_null() || sgx_is_within_enclave(buf, len) == 0 {
set_errno(EINVAL);
return -1;
}
if len >= usize::max_value() {
set_errno(EINVAL);
return -1;
}
let tmp_buf = if len <= MAX_OCALL_ALLOC_SIZE {
sgx_ocalloc(len)
} else {
malloc(len)
};
if tmp_buf.is_null() {
set_errno(ENOMEM );
return -1;
}
tmp_buf.write_bytes(0_u8, len);
let status = u_recv_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
sockfd,
tmp_buf,
len,
flags);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if result != -1 {
ptr::copy_nonoverlapping(tmp_buf as *const u8, buf as *mut u8, len);
}
if len <= MAX_OCALL_ALLOC_SIZE {
sgx_ocfree();
} else {
free(tmp_buf);
}
result
}
pub unsafe fn recvfrom(sockfd: c_int,
buf: *mut c_void,
len: size_t,
flags: c_int,
addr: *mut sockaddr,
addrlen: *mut socklen_t) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
let len_in: socklen_t = if !addrlen.is_null() { *addrlen } else { 0 };
let mut len_out: socklen_t = 0 as socklen_t;
if buf.is_null() || sgx_is_within_enclave(buf, len) == 0 {
set_errno(EINVAL);
return -1;
}
if len >= usize::max_value() {
set_errno(EINVAL);
return -1;
}
let tmp_buf = if len <= MAX_OCALL_ALLOC_SIZE {
sgx_ocalloc(len)
} else {
malloc(len)
};
if tmp_buf.is_null() {
set_errno(ENOMEM );
return -1;
}
tmp_buf.write_bytes(0_u8, len);
let status = u_recvfrom_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
sockfd,
tmp_buf,
len,
flags,
addr,
len_in, // This additional arg is just for EDL
&mut len_out as *mut socklen_t);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if result != -1 {
ptr::copy_nonoverlapping(tmp_buf as *const u8, buf as *mut u8, len);
}
if len <= MAX_OCALL_ALLOC_SIZE {
sgx_ocfree();
} else {
free(tmp_buf);
}
if !addrlen.is_null() {
*addrlen = len_out;
}
result
}
pub unsafe fn recvmsg(sockfd: c_int, msg: *mut msghdr, flags: c_int) -> ssize_t {
let mut result: ssize_t = 0;
let mut error: c_int = 0;
let mut hdrsize: usize = 0;
let mut ptr: *mut u8 = ptr::null_mut();
if msg.is_null() || sgx_is_within_enclave(msg as *const c_void, mem::size_of::<msghdr>()) == 0 {
set_errno(EINVAL);
return -1;
}
let mhdr: &mut msghdr = &mut *msg;
if !mhdr.msg_name.is_null() && mhdr.msg_namelen > 0 &&
sgx_is_within_enclave(mhdr.msg_name, mhdr.msg_namelen as usize) != 0 {
hdrsize += mhdr.msg_namelen as usize;
}
if !mhdr.msg_iov.is_null() && mhdr.msg_iovlen > 0 &&
sgx_is_within_enclave(mhdr.msg_iov as *const c_void, mhdr.msg_iovlen as usize * mem::size_of::<iovec>()) != 0 {
hdrsize += mhdr.msg_iovlen as usize * mem::size_of::<iovec>();
let v = slice::from_raw_parts(mhdr.msg_iov, mhdr.msg_iovlen as usize);
for io in v {
if !io.iov_base.is_null() && io.iov_len > 0 &&
sgx_is_within_enclave(io.iov_base, io.iov_len as usize) != 0 {
hdrsize += io.iov_len as usize;
} else {
set_errno(EINVAL);
return -1;
}
}
}
if !mhdr.msg_control.is_null() && mhdr.msg_controllen > 0 &&
sgx_is_within_enclave(mhdr.msg_control, mhdr.msg_controllen as usize) != 0 {
hdrsize += mhdr.msg_controllen as usize;
}
let hdrbase = malloc(hdrsize) as *mut u8;
if hdrbase.is_null() {
set_errno(ENOMEM );
return -1;
}
hdrbase.write_bytes(0_u8, hdrsize);
let mut tmpmsg: msghdr = mem::zeroed();
ptr = hdrbase;
if !mhdr.msg_name.is_null() && mhdr.msg_namelen > 0 {
tmpmsg.msg_name = ptr as *mut c_void;
tmpmsg.msg_namelen = mhdr.msg_namelen;
ptr::copy_nonoverlapping(mhdr.msg_name as *const u8, tmpmsg.msg_name as *mut u8, mhdr.msg_namelen as usize);
ptr = ptr.add(mhdr.msg_namelen as usize);
}
if !mhdr.msg_iov.is_null() && mhdr.msg_iovlen > 0 {
let tmpiov = slice::from_raw_parts_mut(ptr as *mut iovec, mhdr.msg_iovlen as usize);
ptr = ptr.add(mhdr.msg_iovlen as usize * mem::size_of::<iovec>());
let v = slice::from_raw_parts(mhdr.msg_iov, mhdr.msg_iovlen as usize);
for i in 0..v.len() {
tmpiov[i].iov_base = ptr as *mut c_void;
tmpiov[i].iov_len = v[i].iov_len;
ptr = ptr.add(v[i].iov_len as usize);
}
}
if !mhdr.msg_control.is_null() && mhdr.msg_controllen > 0 {
tmpmsg.msg_control = ptr as *mut c_void;
tmpmsg.msg_controllen = mhdr.msg_controllen;
ptr::copy_nonoverlapping(mhdr.msg_control as *const u8, tmpmsg.msg_control as *mut u8, mhdr.msg_controllen as usize);
}
let status = u_recvmsg_ocall(&mut result as *mut ssize_t,
&mut error as *mut c_int,
sockfd,
&mut tmpmsg as *mut msghdr,
flags);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
ptr = hdrbase;
if !mhdr.msg_name.is_null() && mhdr.msg_namelen > 0 {
ptr = ptr.add(mhdr.msg_namelen as usize);
}
if !mhdr.msg_iov.is_null() && mhdr.msg_iovlen > 0 {
let tmpiov = slice::from_raw_parts_mut(ptr as *mut iovec, mhdr.msg_iovlen as usize);
ptr = ptr.add(mhdr.msg_iovlen as usize * mem::size_of::<iovec>());
let v = slice::from_raw_parts(mhdr.msg_iov, mhdr.msg_iovlen as usize);
for i in 0..v.len() {
ptr::copy_nonoverlapping(tmpiov[i].iov_base as *const u8, v[i].iov_base as *mut u8, v[i].iov_len as usize);
ptr = ptr.add(v[i].iov_len as usize);
}
}
if !mhdr.msg_control.is_null() && mhdr.msg_controllen > 0 {
ptr::copy_nonoverlapping(tmpmsg.msg_control as *const u8, mhdr.msg_control as *mut u8, mhdr.msg_controllen as usize);
}
free(hdrbase as *mut c_void);
result
}
pub unsafe fn setsockopt(sockfd: c_int,
level: c_int,
optname: c_int,
optval: *const c_void,
optlen: socklen_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_setsockopt_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
sockfd,
level,
optname,
optval,
optlen);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn getsockopt(sockfd: c_int,
level: c_int,
optname: c_int,
optval: *mut c_void,
optlen: *mut socklen_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let len_in: socklen_t = if !optlen.is_null() { *optlen } else { 0 };
let mut len_out: socklen_t = 0 as socklen_t;
let status = u_getsockopt_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
sockfd,
level,
optname,
optval,
len_in,
&mut len_out as *mut socklen_t);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if !optlen.is_null() {
*optlen = len_out;
}
result
}
pub unsafe fn getpeername(sockfd: c_int, address: *mut sockaddr, addrlen: *mut socklen_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let len_in: socklen_t = if !addrlen.is_null() { *addrlen } else { 0 };
let mut len_out: socklen_t = 0 as socklen_t;
let status = u_getpeername_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
sockfd,
address,
len_in,
&mut len_out as *mut socklen_t);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if !addrlen.is_null() {
*addrlen = len_out;
}
result
}
pub unsafe fn getsockname(sockfd: c_int, address: *mut sockaddr, addrlen: *mut socklen_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let len_in: socklen_t = if !addrlen.is_null() { *addrlen } else { 0 };
let mut len_out: socklen_t = 0 as socklen_t;
let status = u_getsockname_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
sockfd,
address,
len_in,
&mut len_out as *mut socklen_t);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
if !addrlen.is_null() {
*addrlen = len_out;
}
result
}
pub unsafe fn shutdown(sockfd: c_int, how: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_shutdown_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
sockfd,
how);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn getaddrinfo(node: *const c_char,
service: *const c_char,
hints: *const addrinfo,
res: *mut *mut addrinfo) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let mut ret_res: *mut addrinfo = ptr::null_mut();
let hint: addrinfo = if !hints.is_null() {
addrinfo {
ai_flags: (*hints).ai_flags,
ai_family: (*hints).ai_family,
ai_socktype: (*hints).ai_socktype,
ai_protocol: (*hints).ai_protocol,
ai_addrlen: 0,
ai_addr: ptr::null_mut(),
ai_canonname: ptr::null_mut(),
ai_next: ptr::null_mut(),
}
} else {
addrinfo {
ai_flags: AI_V4MAPPED | AI_ADDRCONFIG,
ai_family: AF_UNSPEC,
ai_socktype: 0,
ai_protocol: 0,
ai_addrlen: 0,
ai_addr: ptr::null_mut(),
ai_canonname: ptr::null_mut(),
ai_next: ptr::null_mut(),
}
};
let status = u_getaddrinfo_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
node,
service,
&hint as *const addrinfo,
&mut ret_res as *mut *mut addrinfo);
if status == sgx_status_t::SGX_SUCCESS {
if result == 0 {
*res = ptr::null_mut();
let mut cur_ptr: *mut addrinfo = ret_res;
let mut addrinfo_vec: Vec<Box<addrinfo>> = Vec::new();
while cur_ptr != ptr::null_mut() {
let cur: &addrinfo = &*cur_ptr;
let mut info = addrinfo {
ai_flags: cur.ai_flags,
ai_family: cur.ai_family,
ai_socktype: cur.ai_socktype,
ai_protocol: cur.ai_protocol,
ai_addrlen: 0,
ai_addr: ptr::null_mut(),
ai_canonname: ptr::null_mut(),
ai_next: ptr::null_mut(),
};
if !cur.ai_addr.is_null() && cur.ai_addrlen > 0 {
let mut addr_vec = vec![0u8; cur.ai_addrlen as usize];
let addr_slice: &[u8] = slice::from_raw_parts(cur.ai_addr as *const u8, cur.ai_addrlen as usize);
addr_vec.copy_from_slice(addr_slice);
addr_vec.shrink_to_fit();
info.ai_addrlen = cur.ai_addrlen;
info.ai_addr = addr_vec.as_mut_ptr() as *mut sockaddr;
mem::forget(addr_vec);
}
if !cur.ai_canonname.is_null() {
let len: usize = strlen(cur.ai_canonname) + 1;
let mut name_vec = vec![0u8; len];
let name_slice: &[u8] = slice::from_raw_parts(cur.ai_canonname as *const u8, len);
name_vec.copy_from_slice(name_slice);
name_vec.shrink_to_fit();
info.ai_canonname = name_vec.as_mut_ptr() as *mut c_char;
mem::forget(name_vec);
}
addrinfo_vec.push(Box::new(info));
cur_ptr = cur.ai_next;
}
if addrinfo_vec.len() > 0 {
for i in 0..addrinfo_vec.len() - 1 {
addrinfo_vec[i].ai_next = addrinfo_vec[i + 1].as_mut() as *mut addrinfo;
}
let res_ptr = addrinfo_vec[0].as_mut() as *mut addrinfo;
for info in addrinfo_vec {
let _ = Box::into_raw(info);
}
*res = res_ptr;
}
let _ = u_freeaddrinfo_ocall(ret_res);
} else if result == EAI_SYSTEM {
set_errno(error);
}
} else {
set_errno(ESGX);
result = EAI_SYSTEM;
}
result
}
pub unsafe fn freeaddrinfo(res: *mut addrinfo ) {
let mut cur_ptr: *mut addrinfo = res;
let mut addrinfo_vec: Vec<Box<addrinfo>> = Vec::new();
while cur_ptr != ptr::null_mut() {
let cur: &addrinfo = &*cur_ptr;
if !cur.ai_addr.is_null() && cur.ai_addrlen > 0 {
let addr_vec = Vec::from_raw_parts(cur.ai_addr as *mut u8, cur.ai_addrlen as usize, cur.ai_addrlen as usize);
drop(addr_vec);
}
if !cur.ai_canonname.is_null() {
let len: usize = strlen(cur.ai_canonname) + 1;
let name_vec = Vec::from_raw_parts(cur.ai_canonname as *mut u8, len, len);
drop(name_vec);
}
addrinfo_vec.push(Box::from_raw(cur_ptr));
cur_ptr = cur.ai_next;
}
drop(addrinfo_vec);
}
pub unsafe fn gai_strerror(errcode: c_int) -> *const c_char {
let mut result: *const c_char = ptr::null();
let status = u_gai_strerror_ocall(&mut result as *mut *const c_char, errcode);
if status != sgx_status_t::SGX_SUCCESS {
set_errno(ESGX);
}
result
}
pub unsafe fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_poll_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fds,
nfds,
timeout);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn epoll_create1(flags: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_epoll_create1_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
flags);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn epoll_ctl(epfd: c_int,
op: c_int,
fd: c_int,
event: *mut epoll_event) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_epoll_ctl_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
epfd,
op,
fd,
event);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn epoll_wait(epfd: c_int,
events: *mut epoll_event,
maxevents: c_int,
timeout: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_epoll_wait_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
epfd,
events,
maxevents,
timeout);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn sysconf(name: c_int) -> c_long {
let mut result: c_long = 0;
let mut error: c_int = 0;
let status = u_sysconf_ocall(&mut result as *mut c_long,
&mut error as *mut c_int,
name);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn prctl(option: c_int,
arg2: c_ulong,
arg3: c_ulong,
arg4: c_ulong,
arg5: c_ulong) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_prctl_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
option,
arg2,
arg3,
arg4,
arg5);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn sched_setaffinity(pid: pid_t, cpusetsize: size_t, mask: *const cpu_set_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_sched_setaffinity_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
pid,
cpusetsize,
mask);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn sched_getaffinity(pid: pid_t, cpusetsize: size_t, mask: *mut cpu_set_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_sched_getaffinity_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
pid,
cpusetsize,
mask);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn pipe(fds: *mut c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_pipe_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fds);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn pipe2(fds: *mut c_int, flags: c_int) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_pipe2_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
fds,
flags);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn sched_yield() -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_sched_yield_ocall(&mut result as *mut c_int,
&mut error as *mut c_int);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_nanosleep_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
rqtp,
rmtp);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn sigaction(signum: c_int,
act: *const sigaction,
oldact: *mut sigaction,
enclave_id: uint64_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_sigaction_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
signum,
act,
oldact,
enclave_id);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn sigprocmask(signum: c_int,
set: *const sigset_t,
oldset: *mut sigset_t) -> c_int {
let mut result: c_int = 0;
let mut error: c_int = 0;
let status = u_sigprocmask_ocall(&mut result as *mut c_int,
&mut error as *mut c_int,
signum,
set,
oldset);
if status == sgx_status_t::SGX_SUCCESS {
if result == -1 {
set_errno(error);
}
} else {
set_errno(ESGX);
result = -1;
}
result
}
pub unsafe fn raise(signum: c_int) -> c_int {
let mut result: c_int = -1;
let status = u_raise_ocall(&mut result as *mut c_int, signum);
if status != sgx_status_t::SGX_SUCCESS {
result = -1;
}
result
}
pub unsafe fn pthread_sigmask(signum: c_int, set: &sigset_t, oldset: &mut sigset_t) -> c_int {
sigprocmask(signum, set, oldset)
}
pub unsafe fn getpid() -> pid_t {
let mut result = -1;
let status = u_getpid_ocall(&mut result as *mut pid_t);
if status != sgx_status_t::SGX_SUCCESS {
result = -1;
}
result
}