Skip to content

Commit c038816

Browse files
committed
Add optional zerocopy trait derives
1 parent 0644a87 commit c038816

File tree

152 files changed

+1307
-15
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

152 files changed

+1307
-15
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ cargo-args = ["-Zbuild-std=core"]
130130

131131
[dependencies]
132132
rustc-std-workspace-core = { version = "1.0.0", optional = true }
133+
zerocopy = { version = "0.7.16", optional = true, features = ["derive"] }
133134

134135
[features]
135136
default = ["std"]

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ newer Rust features are only available on newer Rust toolchains:
5656
| `core::ffi::c_void` | 1.30.0 |
5757
| `repr(packed(N))` | 1.33.0 |
5858
| `cfg(target_vendor)` | 1.33.0 |
59+
| `zerocopy` | 1.61.0 |
5960
| `const-extern-fn` | 1.62.0 |
6061

6162
## Platform support

ci/build.sh

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ if [ "${TOOLCHAIN}" = "nightly" ] ; then
1818
rustup component add rust-src
1919
fi
2020

21+
version_gte() {
22+
# Adapted from https://stackoverflow.com/a/4024263/836390
23+
[ "$2" = "$(echo -e "$1\n$2" | sort -V | head -n1)" ]
24+
}
25+
2126
test_target() {
2227
BUILD_CMD="${1}"
2328
TARGET="${2}"
@@ -66,15 +71,22 @@ test_target() {
6671
--target "${TARGET}" --features extra_traits
6772
fi
6873

69-
# Test the 'const-extern-fn' feature on nightly
70-
if [ "${RUST}" = "nightly" ]; then
74+
# Test the 'const-extern-fn' feature on nightly and the 'zerocopy' feature
75+
# any version starting with zerocopy's MSRV (1.61.0).
76+
if [ "${RUST}" = "nightly" ] || version_gte "${RUST}" "1.61.0"; then
77+
if [ "${RUST}" = "nightly" ]; then
78+
FEATURES="const-extern-fn,zerocopy"
79+
else
80+
FEATURES="zerocopy"
81+
fi
82+
7183
if [ "${NO_STD}" != "1" ]; then
7284
cargo "+${RUST}" "${BUILD_CMD}" -vv --no-default-features --target "${TARGET}" \
73-
--features const-extern-fn
85+
--features "$FEATURES"
7486
else
7587
RUSTFLAGS="-A improper_ctypes_definitions" cargo "+${RUST}" "${BUILD_CMD}" \
7688
-Z build-std=core,alloc -vv --no-default-features \
77-
--target "${TARGET}" --features const-extern-fn
89+
--target "${TARGET}" --features "$FEATURES"
7890
fi
7991
fi
8092

ci/run.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ if [ "$TARGET" = "s390x-unknown-linux-gnu" ]; then
101101
continue
102102
fi
103103
elif [ "$passed" = "2" ]; then
104-
if cargo test --features extra_traits --manifest-path libc-test/Cargo.toml --target "${TARGET}" ${LIBC_CI_ZBUILD_STD+"-Zbuild-std"}; then
104+
if cargo test --features extra_traits,zerocopy --manifest-path libc-test/Cargo.toml --target "${TARGET}" ${LIBC_CI_ZBUILD_STD+"-Zbuild-std"}; then
105105
break
106106
fi
107107
fi
@@ -114,6 +114,6 @@ else
114114

115115
cargo test --manifest-path libc-test/Cargo.toml --target "${TARGET}" ${LIBC_CI_ZBUILD_STD+"-Zbuild-std"}
116116

117-
RUST_BACKTRACE=1 cargo test --features extra_traits --manifest-path libc-test/Cargo.toml \
117+
RUST_BACKTRACE=1 cargo test --features extra_traits,zerocopy --manifest-path libc-test/Cargo.toml \
118118
--target "${TARGET}" ${LIBC_CI_ZBUILD_STD+"-Zbuild-std"}
119119
fi

libc-test/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ default = ["std"]
2525
std = ["libc/std"]
2626
align = ["libc/align"]
2727
extra_traits = ["libc/extra_traits"]
28+
zerocopy = ["libc/zerocopy"]
2829

2930
[[test]]
3031
name = "main"

src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
#![cfg_attr(feature = "rustc-dep-of-std", no_core)]
2525
#![cfg_attr(libc_const_extern_fn_unstable, feature(const_extern_fn))]
2626

27+
#[cfg(feature = "zerocopy")]
28+
#[macro_use]
29+
extern crate zerocopy;
30+
2731
#[macro_use]
2832
mod macros;
2933

src/unix/aix/mod.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,24 +71,29 @@ e! {
7171
}
7272

7373
s! {
74+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
7475
pub struct fsid_t {
7576
pub val: [::c_uint; 2],
7677
}
7778

79+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
7880
pub struct fsid64_t {
7981
pub val: [::uint64_t; 2],
8082
}
8183

84+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
8285
pub struct timezone {
8386
pub tz_minuteswest: ::c_int,
8487
pub tz_dsttime: ::c_int,
8588
}
8689

90+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
8791
pub struct ip_mreq {
8892
pub imr_multiaddr: in_addr,
8993
pub imr_interface: in_addr,
9094
}
9195

96+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
9297
pub struct dirent {
9398
pub d_offset: ::c_ulong,
9499
pub d_ino: ::ino_t,
@@ -97,6 +102,7 @@ s! {
97102
pub d_name: [::c_char; 256]
98103
}
99104

105+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
100106
pub struct termios {
101107
pub c_iflag: ::tcflag_t,
102108
pub c_oflag: ::tcflag_t,
@@ -105,6 +111,7 @@ s! {
105111
pub c_cc: [::cc_t; ::NCCS]
106112
}
107113

114+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
108115
pub struct flock64 {
109116
pub l_type: ::c_short,
110117
pub l_whence: ::c_short,
@@ -125,6 +132,7 @@ s! {
125132
pub msg_flags: ::c_int,
126133
}
127134

135+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
128136
pub struct statvfs64 {
129137
pub f_bsize: ::blksize64_t,
130138
pub f_frsize: ::blksize64_t,
@@ -171,6 +179,7 @@ s! {
171179
pub int_n_sign_posn: ::c_char,
172180
}
173181

182+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
174183
pub struct tm {
175184
pub tm_sec: ::c_int,
176185
pub tm_min: ::c_int,
@@ -195,22 +204,26 @@ s! {
195204
pub ai_eflags: ::c_int,
196205
}
197206

207+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
198208
pub struct in_addr {
199209
pub s_addr: in_addr_t
200210
}
201211

212+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
202213
pub struct ip_mreq_source {
203214
pub imr_multiaddr: in_addr,
204215
pub imr_sourceaddr: in_addr,
205216
pub imr_interface: in_addr,
206217
}
207218

219+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
208220
pub struct sockaddr {
209221
pub sa_len: ::c_uchar,
210222
pub sa_family: sa_family_t,
211223
pub sa_data: [::c_char; 14],
212224
}
213225

226+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
214227
pub struct sockaddr_dl {
215228
pub sdl_len: ::c_uchar,
216229
pub sdl_family: ::c_uchar,
@@ -222,6 +235,7 @@ s! {
222235
pub sdl_data: [::c_char; 120],
223236
}
224237

238+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
225239
pub struct sockaddr_in {
226240
pub sin_len: ::c_uchar,
227241
pub sin_family: sa_family_t,
@@ -230,6 +244,7 @@ s! {
230244
pub sin_zero: [::c_char; 8]
231245
}
232246

247+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
233248
pub struct sockaddr_in6 {
234249
pub sin6_len: ::c_uchar,
235250
pub sin6_family: ::c_uchar,
@@ -239,6 +254,7 @@ s! {
239254
pub sin6_scope_id: ::uint32_t
240255
}
241256

257+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
242258
pub struct sockaddr_storage {
243259
pub __ss_len: ::c_uchar,
244260
pub ss_family: sa_family_t,
@@ -247,17 +263,20 @@ s! {
247263
__ss_pad2: [::c_char; 1265],
248264
}
249265

266+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
250267
pub struct sockaddr_un {
251268
pub sun_len: ::c_uchar,
252269
pub sun_family: sa_family_t,
253270
pub sun_path: [::c_char; 1023]
254271
}
255272

273+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
256274
pub struct st_timespec {
257275
pub tv_sec: ::time_t,
258276
pub tv_nsec: ::c_int,
259277
}
260278

279+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
261280
pub struct statfs64 {
262281
pub f_version: ::c_int,
263282
pub f_type: ::c_int,
@@ -289,6 +308,7 @@ s! {
289308
pub pw_shell: *mut ::c_char
290309
}
291310

311+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
292312
pub struct utsname {
293313
pub sysname: [::c_char; 32],
294314
pub nodename: [::c_char; 32],
@@ -297,12 +317,14 @@ s! {
297317
pub machine: [::c_char; 32],
298318
}
299319

320+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
300321
pub struct xutsname {
301322
pub nid: ::c_uint,
302323
pub reserved: ::c_int,
303324
pub longnid: ::c_ulonglong,
304325
}
305326

327+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
306328
pub struct cmsghdr {
307329
pub cmsg_len: ::socklen_t,
308330
pub cmsg_level: ::c_int,
@@ -318,10 +340,12 @@ s! {
318340
}
319341

320342
// Should be union with another 'sival_int'
343+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
321344
pub struct sigval64 {
322345
pub sival_ptr: ::c_ulonglong,
323346
}
324347

348+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
325349
pub struct sigevent64 {
326350
pub sigev_value: sigval64,
327351
pub sigev_signo: ::c_int,
@@ -335,6 +359,7 @@ s! {
335359
pub sevt_signo: signal_t,
336360
}
337361

362+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
338363
pub struct poll_ctl {
339364
pub cmd: ::c_short,
340365
pub events: ::c_short,
@@ -353,11 +378,13 @@ s! {
353378
pub bytes_sent: ::uint64_t,
354379
}
355380

381+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
356382
pub struct mmsghdr {
357383
pub msg_hdr: ::msghdr,
358384
pub msg_len: ::c_uint,
359385
}
360386

387+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
361388
pub struct sched_param {
362389
pub sched_priority: ::c_int,
363390
pub sched_policy: ::c_int,
@@ -371,6 +398,7 @@ s! {
371398
pub __pad: [::c_int; 4],
372399
}
373400

401+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
374402
pub struct posix_spawnattr_t {
375403
pub posix_attr_flags: ::c_short,
376404
pub posix_attr_pgroup: ::pid_t,
@@ -388,6 +416,7 @@ s! {
388416
pub gl_ptx: *mut ::c_void,
389417
}
390418

419+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
391420
pub struct mallinfo {
392421
pub arena: ::c_ulong,
393422
pub ordblks: ::c_int,
@@ -401,11 +430,13 @@ s! {
401430
pub keepcost: ::c_int,
402431
}
403432

433+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
404434
pub struct utmp_exit_status {
405435
pub e_termination: ::c_short,
406436
pub e_exit: ::c_short,
407437
}
408438

439+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
409440
pub struct utmp {
410441
pub ut_user: [::c_char; 256],
411442
pub ut_id: [::c_char; 14],
@@ -420,6 +451,7 @@ s! {
420451
pub __reservedV: [::c_int; 6],
421452
}
422453

454+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
423455
pub struct regmatch_t {
424456
pub rm_so: regoff_t,
425457
pub rm_eo: regoff_t,
@@ -439,11 +471,13 @@ s! {
439471
pub __unused: [*mut ::c_void; 34],
440472
}
441473

474+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
442475
pub struct rlimit64 {
443476
pub rlim_cur: rlim64_t,
444477
pub rlim_max: rlim64_t,
445478
}
446479

480+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
447481
pub struct shmid_ds {
448482
pub shm_perm: ipc_perm,
449483
pub shm_segsz: ::size_t,
@@ -462,6 +496,7 @@ s! {
462496
pub shm_reserved1: ::int64_t,
463497
}
464498

499+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
465500
pub struct stat64 {
466501
pub st_dev: dev_t,
467502
pub st_ino: ino_t,
@@ -494,6 +529,7 @@ s! {
494529
pub mnt_passno: ::c_int,
495530
}
496531

532+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
497533
pub struct ipc_perm {
498534
pub uid: ::uid_t,
499535
pub gid: ::gid_t,
@@ -510,13 +546,15 @@ s! {
510546
pub data: *mut ::c_void,
511547
}
512548

549+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
513550
pub struct mq_attr {
514551
pub mq_flags: ::c_long,
515552
pub mq_maxmsg: ::c_long,
516553
pub mq_msgsize: ::c_long,
517554
pub mq_curmsgs: ::c_long,
518555
}
519556

557+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
520558
pub struct sembuf {
521559
pub sem_num: ::c_ushort,
522560
pub sem_op: ::c_short,
@@ -528,6 +566,7 @@ s! {
528566
pub if_name: *mut ::c_char,
529567
}
530568

569+
#[cfg_attr(feature = "zerocopy", derive(FromZeroes, FromBytes, AsBytes))]
531570
pub struct itimerspec {
532571
pub it_interval: ::timespec,
533572
pub it_value: ::timespec,

0 commit comments

Comments
 (0)