Skip to content

Commit e0f69d9

Browse files
Berrysofttgross35
authored andcommitted
feat: add aio for solarish
(backport <rust-lang#4033>) (cherry picked from commit ccc0b07)
1 parent 2f3d880 commit e0f69d9

File tree

5 files changed

+99
-0
lines changed

5 files changed

+99
-0
lines changed

libc-test/build.rs

+12
Original file line numberDiff line numberDiff line change
@@ -847,6 +847,7 @@ fn test_solarish(target: &str) {
847847

848848
headers! {
849849
cfg:
850+
"aio.h",
850851
"ctype.h",
851852
"dirent.h",
852853
"dlfcn.h",
@@ -1009,6 +1010,11 @@ fn test_solarish(target: &str) {
10091010
}
10101011
});
10111012

1013+
cfg.skip_field_type(move |struct_, field| {
1014+
// aio_buf is "volatile void*"
1015+
struct_ == "aiocb" && field == "aio_buf"
1016+
});
1017+
10121018
cfg.skip_field(move |s, field| {
10131019
match s {
10141020
// C99 sizing on this is tough
@@ -1087,6 +1093,12 @@ fn test_solarish(target: &str) {
10871093
// excluded from the tests.
10881094
"getifaddrs" if is_illumos => true,
10891095

1096+
// FIXME: Our API is unsound. The Rust API allows aliasing
1097+
// pointers, but the C API requires pointers not to alias.
1098+
// We should probably be at least using `&`/`&mut` here, see:
1099+
// https://github.com/gnzlbg/ctest/issues/68
1100+
"lio_listio" => true,
1101+
10901102
_ => false,
10911103
}
10921104
});

libc-test/semver/solarish.txt

+20
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
AIO_ALLDONE
2+
AIO_CANCELED
3+
AIO_NOTCANCELED
14
IPV6_DONTFRAG
25
IPV6_PKTINFO
36
IPV6_RECVTCLASS
@@ -6,9 +9,26 @@ IP_DONTFRAG
69
IP_PKTINFO
710
IP_TOS
811
IP_TTL
12+
LIO_NOP
13+
LIO_NOWAIT
14+
LIO_READ
15+
LIO_WAIT
16+
LIO_WRITE
917
PIPE_BUF
18+
SIGEV_PORT
19+
aio_cancel
20+
aio_error
21+
aio_fsync
22+
aio_read
23+
aio_result_t
24+
aio_return
25+
aio_suspend
26+
aio_waitn
27+
aio_write
28+
aiocb
1029
bind
1130
in6_pktinfo
1231
in_pktinfo
32+
lio_listio
1333
recvmsg
1434
sendmsg

src/unix/solarish/illumos.rs

+13
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,19 @@ pub type lgrp_rsrc_t = ::c_int;
1010
pub type lgrp_affinity_t = ::c_int;
1111

1212
s! {
13+
pub struct aiocb {
14+
pub aio_fildes: ::c_int,
15+
pub aio_buf: *mut ::c_void,
16+
pub aio_nbytes: ::size_t,
17+
pub aio_offset: ::off_t,
18+
pub aio_reqprio: ::c_int,
19+
pub aio_sigevent: ::sigevent,
20+
pub aio_lio_opcode: ::c_int,
21+
pub aio_resultp: ::aio_result_t,
22+
pub aio_state: ::c_int,
23+
pub aio__pad: [::c_int; 1],
24+
}
25+
1326
pub struct shmid_ds {
1427
pub shm_perm: ::ipc_perm,
1528
pub shm_segsz: ::size_t,

src/unix/solarish/mod.rs

+39
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,11 @@ s! {
420420
pub portnfy_user: *mut ::c_void,
421421
}
422422

423+
pub struct aio_result_t {
424+
pub aio_return: ::ssize_t,
425+
pub aio_errno: ::c_int,
426+
}
427+
423428
pub struct exit_status {
424429
e_termination: ::c_short,
425430
e_exit: ::c_short,
@@ -1133,9 +1138,19 @@ pub const SIG_BLOCK: ::c_int = 1;
11331138
pub const SIG_UNBLOCK: ::c_int = 2;
11341139
pub const SIG_SETMASK: ::c_int = 3;
11351140

1141+
pub const AIO_CANCELED: ::c_int = 0;
1142+
pub const AIO_ALLDONE: ::c_int = 1;
1143+
pub const AIO_NOTCANCELED: ::c_int = 2;
1144+
pub const LIO_NOP: ::c_int = 0;
1145+
pub const LIO_READ: ::c_int = 1;
1146+
pub const LIO_WRITE: ::c_int = 2;
1147+
pub const LIO_NOWAIT: ::c_int = 0;
1148+
pub const LIO_WAIT: ::c_int = 1;
1149+
11361150
pub const SIGEV_NONE: ::c_int = 1;
11371151
pub const SIGEV_SIGNAL: ::c_int = 2;
11381152
pub const SIGEV_THREAD: ::c_int = 3;
1153+
pub const SIGEV_PORT: ::c_int = 4;
11391154

11401155
pub const CLD_EXITED: ::c_int = 1;
11411156
pub const CLD_KILLED: ::c_int = 2;
@@ -3045,6 +3060,30 @@ extern "C" {
30453060

30463061
pub fn sync();
30473062

3063+
pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int;
3064+
pub fn aio_error(aiocbp: *const aiocb) -> ::c_int;
3065+
pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int;
3066+
pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int;
3067+
pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t;
3068+
pub fn aio_suspend(
3069+
aiocb_list: *const *const aiocb,
3070+
nitems: ::c_int,
3071+
timeout: *const ::timespec,
3072+
) -> ::c_int;
3073+
pub fn aio_waitn(
3074+
aiocb_list: *mut *mut aiocb,
3075+
nent: ::c_uint,
3076+
nwait: *mut ::c_uint,
3077+
timeout: *const ::timespec,
3078+
) -> ::c_int;
3079+
pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int;
3080+
pub fn lio_listio(
3081+
mode: ::c_int,
3082+
aiocb_list: *const *mut aiocb,
3083+
nitems: ::c_int,
3084+
sevp: *mut sigevent,
3085+
) -> ::c_int;
3086+
30483087
pub fn __major(version: ::c_int, devnum: ::dev_t) -> ::major_t;
30493088
pub fn __minor(version: ::c_int, devnum: ::dev_t) -> ::minor_t;
30503089
pub fn __makedev(version: ::c_int, majdev: ::major_t, mindev: ::minor_t) -> ::dev_t;

src/unix/solarish/solaris.rs

+15
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ e! {
2020
}
2121

2222
s! {
23+
pub struct aiocb {
24+
pub aio_fildes: ::c_int,
25+
pub aio_buf: *mut ::c_void,
26+
pub aio_nbytes: ::size_t,
27+
pub aio_offset: ::off_t,
28+
pub aio_reqprio: ::c_int,
29+
pub aio_sigevent: ::sigevent,
30+
pub aio_lio_opcode: ::c_int,
31+
pub aio_resultp: ::aio_result_t,
32+
pub aio_state: ::c_char,
33+
pub aio_returned: ::c_char,
34+
pub aio__pad1: [::c_char; 2],
35+
pub aio_flags: ::c_int,
36+
}
37+
2338
pub struct shmid_ds {
2439
pub shm_perm: ::ipc_perm,
2540
pub shm_segsz: ::size_t,

0 commit comments

Comments
 (0)