Skip to content

Commit a15675b

Browse files
committed
Make sigval an union
1 parent 8e6f36c commit a15675b

File tree

3 files changed

+42
-84
lines changed

3 files changed

+42
-84
lines changed

libc-test/build.rs

Lines changed: 2 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -331,9 +331,6 @@ fn test_apple(target: &str) {
331331
return true;
332332
}
333333
match ty {
334-
// FIXME(union): actually a union
335-
"sigval" => true,
336-
337334
// FIXME(macos): The size is changed in recent macOSes.
338335
"malloc_zone_t" => true,
339336
// it is a moving target, changing through versions
@@ -429,14 +426,6 @@ fn test_apple(target: &str) {
429426
}
430427
});
431428

432-
cfg.skip_field_type(move |struct_, field| {
433-
match (struct_, field) {
434-
// FIXME(union): actually a union
435-
("sigevent", "sigev_value") => true,
436-
_ => false,
437-
}
438-
});
439-
440429
cfg.volatile_item(|i| {
441430
use ctest::VolatileItemKind::*;
442431
match i {
@@ -576,23 +565,8 @@ fn test_openbsd(target: &str) {
576565
"sys/param.h",
577566
}
578567

579-
cfg.skip_struct(move |ty| {
580-
if ty.starts_with("__c_anonymous_") {
581-
return true;
582-
}
583-
match ty {
584-
// FIXME(union): actually a union
585-
"sigval" => true,
586-
587-
_ => false,
588-
}
589-
});
590-
591568
cfg.skip_const(move |name| {
592569
match name {
593-
// Removed in OpenBSD 7.7
594-
"ATF_COM" | "ATF_PERM" | "ATF_PUBL" | "ATF_USETRAILERS" => true,
595-
596570
// Removed in OpenBSD 7.8
597571
"CTL_FS" | "SO_NETPROC" => true,
598572

@@ -1174,8 +1148,6 @@ fn test_solarish(target: &str) {
11741148
return true;
11751149
}
11761150
match ty {
1177-
// union, not a struct
1178-
"sigval" => true,
11791151
// a bunch of solaris-only fields
11801152
"utmpx" if is_illumos => true,
11811153
_ => false,
@@ -1195,8 +1167,6 @@ fn test_solarish(target: &str) {
11951167
"sigaction" if field == "sa_sigaction" => true,
11961168
// Missing in illumos
11971169
"sigevent" if field == "ss_sp" => true,
1198-
// Avoid sigval union issues
1199-
"sigevent" if field == "sigev_value" => true,
12001170
// const issues
12011171
"sigevent" if field == "sigev_notify_attributes" => true,
12021172

@@ -1423,8 +1393,6 @@ fn test_netbsd(target: &str) {
14231393

14241394
cfg.skip_struct(move |ty| {
14251395
match ty {
1426-
// This is actually a union, not a struct
1427-
"sigval" => true,
14281396
// These are tested as part of the linux_fcntl tests since there are
14291397
// header conflicts when including them with all the other structs.
14301398
"termios2" => true,
@@ -1476,8 +1444,6 @@ fn test_netbsd(target: &str) {
14761444
(struct_ == "ifaddrs" && field == "ifa_ifu") ||
14771445
// sighandler_t type is super weird
14781446
(struct_ == "sigaction" && field == "sa_sigaction") ||
1479-
// sigval is actually a union, but we pretend it's a struct
1480-
(struct_ == "sigevent" && field == "sigev_value") ||
14811447
// aio_buf is "volatile void*" and Rust doesn't understand volatile
14821448
(struct_ == "aiocb" && field == "aio_buf")
14831449
});
@@ -1606,9 +1572,6 @@ fn test_dragonflybsd(target: &str) {
16061572

16071573
t if t.ends_with("_t") => t.to_string(),
16081574

1609-
// sigval is a struct in Rust, but a union in C:
1610-
"sigval" => "union sigval".to_string(),
1611-
16121575
// put `struct` in front of all structs:.
16131576
t if is_struct => format!("struct {t}"),
16141577

@@ -1701,8 +1664,6 @@ fn test_dragonflybsd(target: &str) {
17011664
(struct_ == "ifaddrs" && field == "ifa_ifu") ||
17021665
// sighandler_t type is super weird
17031666
(struct_ == "sigaction" && field == "sa_sigaction") ||
1704-
// sigval is actually a union, but we pretend it's a struct
1705-
(struct_ == "sigevent" && field == "sigev_value") ||
17061667
// aio_buf is "volatile void*" and Rust doesn't understand volatile
17071668
(struct_ == "aiocb" && field == "aio_buf")
17081669
});
@@ -1993,9 +1954,6 @@ fn test_android(target: &str) {
19931954

19941955
t if t.ends_with("_t") => t.to_string(),
19951956

1996-
// sigval is a struct in Rust, but a union in C:
1997-
"sigval" => "union sigval".to_string(),
1998-
19991957
"Ioctl" => "int".to_string(),
20001958

20011959
// put `struct` in front of all structs:.
@@ -2300,8 +2258,6 @@ fn test_android(target: &str) {
23002258
cfg.skip_field_type(move |struct_, field| {
23012259
// This is a weird union, don't check the type.
23022260
(struct_ == "ifaddrs" && field == "ifa_ifu") ||
2303-
// sigval is actually a union, but we pretend it's a struct
2304-
(struct_ == "sigevent" && field == "sigev_value") ||
23052261
// this one is an anonymous union
23062262
(struct_ == "ff_effect" && field == "u") ||
23072263
// FIXME(android): `sa_sigaction` has type `sighandler_t` but that type is
@@ -2504,9 +2460,6 @@ fn test_freebsd(target: &str) {
25042460

25052461
t if t.ends_with("_t") => t.to_string(),
25062462

2507-
// sigval is a struct in Rust, but a union in C:
2508-
"sigval" => "union sigval".to_string(),
2509-
25102463
// put `struct` in front of all structs:.
25112464
t if is_struct => format!("struct {t}"),
25122465

@@ -3140,9 +3093,6 @@ fn test_emscripten(target: &str) {
31403093
return true;
31413094
}
31423095
match ty {
3143-
// This is actually a union, not a struct
3144-
"sigval" => true,
3145-
31463096
// FIXME(emscripten): Investigate why the test fails.
31473097
// Skip for now to unblock CI.
31483098
"pthread_condattr_t" => true,
@@ -3221,9 +3171,7 @@ fn test_emscripten(target: &str) {
32213171
// This is a weird union, don't check the type.
32223172
(struct_ == "ifaddrs" && field == "ifa_ifu") ||
32233173
// sighandler_t type is super weird
3224-
(struct_ == "sigaction" && field == "sa_sigaction") ||
3225-
// sigval is actually a union, but we pretend it's a struct
3226-
(struct_ == "sigevent" && field == "sigev_value")
3174+
(struct_ == "sigaction" && field == "sa_sigaction")
32273175
});
32283176

32293177
cfg.skip_field(move |struct_, field| {
@@ -3436,9 +3384,6 @@ fn test_neutrino(target: &str) {
34363384
match ty {
34373385
"Elf64_Phdr" | "Elf32_Phdr" => true,
34383386

3439-
// FIXME(union): This is actually a union, not a struct
3440-
"sigval" => true,
3441-
34423387
// union
34433388
"_channel_connect_attr" => true,
34443389

@@ -3493,8 +3438,6 @@ fn test_neutrino(target: &str) {
34933438
});
34943439

34953440
cfg.skip_field_type(move |struct_, field| {
3496-
// sigval is actually a union, but we pretend it's a struct
3497-
struct_ == "sigevent" && field == "sigev_value" ||
34983441
// Anonymous structures
34993442
struct_ == "_idle_hook" && field == "time"
35003443
});
@@ -3505,8 +3448,6 @@ fn test_neutrino(target: &str) {
35053448
("__sched_param", "reserved")
35063449
| ("sched_param", "reserved")
35073450
| ("sigevent", "__padding1") // ensure alignment
3508-
| ("sigevent", "__padding2") // union
3509-
| ("sigevent", "__sigev_un2") // union
35103451
| ("sigaction", "sa_sigaction") // sighandler_t type is super weird
35113452
| ("syspage_entry", "__reserved") // does not exist
35123453
)
@@ -3611,10 +3552,8 @@ fn test_vxworks(target: &str) {
36113552

36123553
// FIXME(vxworks)
36133554
cfg.skip_fn(move |name| match name {
3614-
// sigval
3615-
"sigqueue" | "_sigqueue"
36163555
// sighandler_t
3617-
| "signal"
3556+
"signal"
36183557
// not used in static linking by default
36193558
| "dlerror" => true,
36203559
_ => false,
@@ -4051,9 +3990,6 @@ fn test_linux(target: &str) {
40513990
// which is absent in glibc, has to be defined.
40523991
"__timeval" => true,
40533992

4054-
// FIXME(union): This is actually a union, not a struct
4055-
"sigval" => true,
4056-
40573993
// This type is tested in the `linux_termios.rs` file since there
40583994
// are header conflicts when including them with all the other
40593995
// structs.
@@ -4779,8 +4715,6 @@ fn test_linux(target: &str) {
47794715
(struct_ == "sigaction" && field == "sa_sigaction") ||
47804716
// __timeval type is a patch which doesn't exist in glibc
47814717
(struct_ == "utmpx" && field == "ut_tv") ||
4782-
// sigval is actually a union, but we pretend it's a struct
4783-
(struct_ == "sigevent" && field == "sigev_value") ||
47844718
// this one is an anonymous union
47854719
(struct_ == "ff_effect" && field == "u") ||
47864720
// `__exit_status` type is a patch which is absent in musl
@@ -5261,8 +5195,6 @@ fn test_haiku(target: &str) {
52615195
return true;
52625196
}
52635197
match ty {
5264-
// FIXME(union): actually a union
5265-
"sigval" => true,
52665198
// FIXME(haiku): locale_t does not exist on Haiku
52675199
"locale_t" => true,
52685200
// FIXME(haiku): rusage has a different layout on Haiku
@@ -5369,10 +5301,8 @@ fn test_haiku(target: &str) {
53695301
("stat", "st_crtime_nsec") => true,
53705302

53715303
// these are actually unions, but we cannot represent it well
5372-
("siginfo_t", "sigval") => true,
53735304
("sem_t", "named_sem_id") => true,
53745305
("sigaction", "sa_sigaction") => true,
5375-
("sigevent", "sigev_value") => true,
53765306
("fpu_state", "_fpreg") => true,
53775307
("cpu_topology_node_info", "data") => true,
53785308
// these fields have a simplified data definition in libc
@@ -5423,8 +5353,6 @@ fn test_haiku(target: &str) {
54235353
ty.to_string()
54245354
}
54255355

5426-
// is actually a union
5427-
"sigval" => "union sigval".to_string(),
54285356
t if is_union => format!("union {t}"),
54295357
t if t.ends_with("_t") => t.to_string(),
54305358
t if is_struct => format!("struct {t}"),

src/fuchsia/mod.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -240,11 +240,6 @@ s! {
240240
pub l_linger: c_int,
241241
}
242242

243-
pub struct sigval {
244-
// Actually a union of an int and a void*
245-
pub sival_ptr: *mut c_void,
246-
}
247-
248243
// <sys/time.h>
249244
pub struct itimerval {
250245
pub it_interval: crate::timeval,
@@ -1043,6 +1038,11 @@ s_no_extra_traits! {
10431038
pub struct pthread_cond_t {
10441039
size: [u8; crate::__SIZEOF_PTHREAD_COND_T],
10451040
}
1041+
1042+
pub union sigval {
1043+
pub sival_int: c_int,
1044+
pub sival_ptr: *mut c_void,
1045+
}
10461046
}
10471047

10481048
cfg_if! {
@@ -1305,6 +1305,18 @@ cfg_if! {
13051305
self.size.hash(state);
13061306
}
13071307
}
1308+
1309+
impl PartialEq for sigval {
1310+
fn eq(&self, other: &sigval) -> bool {
1311+
unimplemented!("traits")
1312+
}
1313+
}
1314+
impl Eq for sigval {}
1315+
impl hash::Hash for sigval {
1316+
fn hash<H: hash::Hasher>(&self, state: &mut H) {
1317+
unimplemented!("traits")
1318+
}
1319+
}
13081320
}
13091321
}
13101322

src/unix/mod.rs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -174,11 +174,6 @@ s! {
174174
pub l_linger: c_int,
175175
}
176176

177-
pub struct sigval {
178-
// Actually a union of an int and a void*
179-
pub sival_ptr: *mut c_void,
180-
}
181-
182177
// <sys/time.h>
183178
pub struct itimerval {
184179
pub it_interval: crate::timeval,
@@ -218,6 +213,29 @@ s! {
218213
}
219214
}
220215

216+
s_no_extra_traits! {
217+
pub union sigval {
218+
pub sival_int: c_int,
219+
pub sival_ptr: *mut c_void,
220+
}
221+
}
222+
223+
cfg_if! {
224+
if #[cfg(feature = "extra_traits")] {
225+
impl PartialEq for sigval {
226+
fn eq(&self, _other: &sigval) -> bool {
227+
unimplemented!("traits")
228+
}
229+
}
230+
impl Eq for sigval {}
231+
impl hash::Hash for sigval {
232+
fn hash<H: hash::Hasher>(&self, _state: &mut H) {
233+
unimplemented!("traits")
234+
}
235+
}
236+
}
237+
}
238+
221239
pub const INT_MIN: c_int = -2147483648;
222240
pub const INT_MAX: c_int = 2147483647;
223241

0 commit comments

Comments
 (0)