Skip to content

Commit 936a356

Browse files
authoredNov 16, 2024
Merge pull request #4033 from Berrysoft/illumos-aio
feat: add `aio` for solarish
2 parents b8093a0 + ccc0b07 commit 936a356

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
@@ -787,6 +787,7 @@ fn test_solarish(target: &str) {
787787

788788
headers! {
789789
cfg:
790+
"aio.h",
790791
"ctype.h",
791792
"dirent.h",
792793
"dlfcn.h",
@@ -949,6 +950,11 @@ fn test_solarish(target: &str) {
949950
}
950951
});
951952

953+
cfg.skip_field_type(move |struct_, field| {
954+
// aio_buf is "volatile void*"
955+
struct_ == "aiocb" && field == "aio_buf"
956+
});
957+
952958
cfg.skip_field(move |s, field| {
953959
match s {
954960
// C99 sizing on this is tough
@@ -1027,6 +1033,12 @@ fn test_solarish(target: &str) {
10271033
// excluded from the tests.
10281034
"getifaddrs" if is_illumos => true,
10291035

1036+
// FIXME: Our API is unsound. The Rust API allows aliasing
1037+
// pointers, but the C API requires pointers not to alias.
1038+
// We should probably be at least using `&`/`&mut` here, see:
1039+
// https://github.com/gnzlbg/ctest/issues/68
1040+
"lio_listio" => true,
1041+
10301042
_ => false,
10311043
}
10321044
});

‎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,12 +9,29 @@ 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
arc4random
1130
arc4random_buf
1231
arc4random_uniform
1332
bind
1433
in6_pktinfo
1534
in_pktinfo
35+
lio_listio
1636
recvmsg
1737
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,
@@ -1123,9 +1128,19 @@ pub const SIG_BLOCK: ::c_int = 1;
11231128
pub const SIG_UNBLOCK: ::c_int = 2;
11241129
pub const SIG_SETMASK: ::c_int = 3;
11251130

1131+
pub const AIO_CANCELED: ::c_int = 0;
1132+
pub const AIO_ALLDONE: ::c_int = 1;
1133+
pub const AIO_NOTCANCELED: ::c_int = 2;
1134+
pub const LIO_NOP: ::c_int = 0;
1135+
pub const LIO_READ: ::c_int = 1;
1136+
pub const LIO_WRITE: ::c_int = 2;
1137+
pub const LIO_NOWAIT: ::c_int = 0;
1138+
pub const LIO_WAIT: ::c_int = 1;
1139+
11261140
pub const SIGEV_NONE: ::c_int = 1;
11271141
pub const SIGEV_SIGNAL: ::c_int = 2;
11281142
pub const SIGEV_THREAD: ::c_int = 3;
1143+
pub const SIGEV_PORT: ::c_int = 4;
11291144

11301145
pub const CLD_EXITED: ::c_int = 1;
11311146
pub const CLD_KILLED: ::c_int = 2;
@@ -3035,6 +3050,30 @@ extern "C" {
30353050

30363051
pub fn sync();
30373052

3053+
pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int;
3054+
pub fn aio_error(aiocbp: *const aiocb) -> ::c_int;
3055+
pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int;
3056+
pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int;
3057+
pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t;
3058+
pub fn aio_suspend(
3059+
aiocb_list: *const *const aiocb,
3060+
nitems: ::c_int,
3061+
timeout: *const ::timespec,
3062+
) -> ::c_int;
3063+
pub fn aio_waitn(
3064+
aiocb_list: *mut *mut aiocb,
3065+
nent: ::c_uint,
3066+
nwait: *mut ::c_uint,
3067+
timeout: *const ::timespec,
3068+
) -> ::c_int;
3069+
pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int;
3070+
pub fn lio_listio(
3071+
mode: ::c_int,
3072+
aiocb_list: *const *mut aiocb,
3073+
nitems: ::c_int,
3074+
sevp: *mut sigevent,
3075+
) -> ::c_int;
3076+
30383077
pub fn __major(version: ::c_int, devnum: ::dev_t) -> ::major_t;
30393078
pub fn __minor(version: ::c_int, devnum: ::dev_t) -> ::minor_t;
30403079
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)