diff --git a/libc-test/build.rs b/libc-test/build.rs index 48f952f9f7c83..29763626b34d3 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -786,6 +786,7 @@ fn test_solarish(target: &str) { headers! { cfg: + "aio.h", "ctype.h", "dirent.h", "dlfcn.h", @@ -948,6 +949,11 @@ fn test_solarish(target: &str) { } }); + cfg.skip_field_type(move |struct_, field| { + // aio_buf is "volatile void*" + struct_ == "aiocb" && field == "aio_buf" + }); + cfg.skip_field(move |s, field| { match s { // C99 sizing on this is tough @@ -1026,6 +1032,12 @@ fn test_solarish(target: &str) { // excluded from the tests. "getifaddrs" if is_illumos => true, + // FIXME: Our API is unsound. The Rust API allows aliasing + // pointers, but the C API requires pointers not to alias. + // We should probably be at least using `&`/`&mut` here, see: + // https://github.com/gnzlbg/ctest/issues/68 + "lio_listio" => true, + _ => false, } }); diff --git a/libc-test/semver/solarish.txt b/libc-test/semver/solarish.txt index a17ec146bb456..2dcebd06e3399 100644 --- a/libc-test/semver/solarish.txt +++ b/libc-test/semver/solarish.txt @@ -1,3 +1,6 @@ +AIO_ALLDONE +AIO_CANCELED +AIO_NOTCANCELED IPV6_DONTFRAG IPV6_PKTINFO IPV6_RECVTCLASS @@ -6,12 +9,29 @@ IP_DONTFRAG IP_PKTINFO IP_TOS IP_TTL +LIO_NOP +LIO_NOWAIT +LIO_READ +LIO_WAIT +LIO_WRITE PIPE_BUF +SIGEV_PORT +aio_cancel +aio_error +aio_fsync +aio_read +aio_result_t +aio_return +aio_suspend +aio_waitn +aio_write +aiocb arc4random arc4random_buf arc4random_uniform bind in6_pktinfo in_pktinfo +lio_listio recvmsg sendmsg diff --git a/src/unix/solarish/illumos.rs b/src/unix/solarish/illumos.rs index 121b5fa06fe7b..62a07f6279030 100644 --- a/src/unix/solarish/illumos.rs +++ b/src/unix/solarish/illumos.rs @@ -10,6 +10,19 @@ pub type lgrp_rsrc_t = ::c_int; pub type lgrp_affinity_t = ::c_int; s! { + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_offset: ::off_t, + pub aio_reqprio: ::c_int, + pub aio_sigevent: ::sigevent, + pub aio_lio_opcode: ::c_int, + pub aio_resultp: ::aio_result_t, + pub aio_state: ::c_int, + pub aio__pad: [::c_int; 1], + } + pub struct shmid_ds { pub shm_perm: ::ipc_perm, pub shm_segsz: ::size_t, diff --git a/src/unix/solarish/mod.rs b/src/unix/solarish/mod.rs index a2db25aa1a221..64bedf88b73c9 100644 --- a/src/unix/solarish/mod.rs +++ b/src/unix/solarish/mod.rs @@ -420,6 +420,11 @@ s! { pub portnfy_user: *mut ::c_void, } + pub struct aio_result_t { + pub aio_return: ::ssize_t, + pub aio_errno: ::c_int, + } + pub struct exit_status { e_termination: ::c_short, e_exit: ::c_short, @@ -1123,9 +1128,19 @@ pub const SIG_BLOCK: ::c_int = 1; pub const SIG_UNBLOCK: ::c_int = 2; pub const SIG_SETMASK: ::c_int = 3; +pub const AIO_CANCELED: ::c_int = 0; +pub const AIO_ALLDONE: ::c_int = 1; +pub const AIO_NOTCANCELED: ::c_int = 2; +pub const LIO_NOP: ::c_int = 0; +pub const LIO_READ: ::c_int = 1; +pub const LIO_WRITE: ::c_int = 2; +pub const LIO_NOWAIT: ::c_int = 0; +pub const LIO_WAIT: ::c_int = 1; + pub const SIGEV_NONE: ::c_int = 1; pub const SIGEV_SIGNAL: ::c_int = 2; pub const SIGEV_THREAD: ::c_int = 3; +pub const SIGEV_PORT: ::c_int = 4; pub const CLD_EXITED: ::c_int = 1; pub const CLD_KILLED: ::c_int = 2; @@ -3035,6 +3050,30 @@ extern "C" { pub fn sync(); + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + pub fn aio_suspend( + aiocb_list: *const *const aiocb, + nitems: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn aio_waitn( + aiocb_list: *mut *mut aiocb, + nent: ::c_uint, + nwait: *mut ::c_uint, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn lio_listio( + mode: ::c_int, + aiocb_list: *const *mut aiocb, + nitems: ::c_int, + sevp: *mut sigevent, + ) -> ::c_int; + pub fn __major(version: ::c_int, devnum: ::dev_t) -> ::major_t; pub fn __minor(version: ::c_int, devnum: ::dev_t) -> ::minor_t; pub fn __makedev(version: ::c_int, majdev: ::major_t, mindev: ::minor_t) -> ::dev_t; diff --git a/src/unix/solarish/solaris.rs b/src/unix/solarish/solaris.rs index 26bbe38b3e208..2ca6281f495ba 100644 --- a/src/unix/solarish/solaris.rs +++ b/src/unix/solarish/solaris.rs @@ -20,6 +20,21 @@ e! { } s! { + pub struct aiocb { + pub aio_fildes: ::c_int, + pub aio_buf: *mut ::c_void, + pub aio_nbytes: ::size_t, + pub aio_offset: ::off_t, + pub aio_reqprio: ::c_int, + pub aio_sigevent: ::sigevent, + pub aio_lio_opcode: ::c_int, + pub aio_resultp: ::aio_result_t, + pub aio_state: ::c_char, + pub aio_returned: ::c_char, + pub aio__pad1: [::c_char; 2], + pub aio_flags: ::c_int, + } + pub struct shmid_ds { pub shm_perm: ::ipc_perm, pub shm_segsz: ::size_t,