Skip to content

Commit 0185826

Browse files
authored
Merge branch 'main' into 4117-part-3
2 parents d97ce44 + 989b64a commit 0185826

File tree

18 files changed

+210
-159
lines changed

18 files changed

+210
-159
lines changed

libc-test/src/makedev.c

+12-4
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,19 @@
33
#include <sys/sysmacros.h>
44
#endif
55

6-
// Since makedev is a macro instead of a function, it isn't available to FFI.
7-
// libc must reimplement it, which is error-prone. This file provides FFI
8-
// access to the actual macro so it can be tested against the Rust
9-
// reimplementation.
6+
// Since makedev, major, minor are macros instead of functions, they aren't
7+
// available to FFI. libc must reimplement them, which is error-prone. This
8+
// file provides FFI access to the actual macros so they can be tested against
9+
// the Rust reimplementation.
1010

1111
dev_t makedev_ffi(unsigned major, unsigned minor) {
1212
return makedev(major, minor);
1313
}
14+
15+
unsigned int major_ffi(dev_t dev) {
16+
return major(dev);
17+
}
18+
19+
unsigned int minor_ffi(dev_t dev) {
20+
return minor(dev);
21+
}

libc-test/test/makedev.rs

+55-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,50 @@
1-
//! Compare libc's makdev function against the actual C macros, for various
1+
//! Compare libc's makedev, major, minor functions against the actual C macros, for various
22
//! inputs.
33
4+
#[cfg(any(target_os = "solaris", target_os = "illumos"))]
5+
mod ret {
6+
pub type MajorRetType = libc::major_t;
7+
pub type MinorRetType = libc::minor_t;
8+
}
9+
10+
#[cfg(any(
11+
target_os = "linux",
12+
target_os = "l4re",
13+
target_os = "emscripten",
14+
target_os = "fuchsia",
15+
target_os = "aix",
16+
target_os = "nto",
17+
target_os = "hurd",
18+
target_os = "openbsd",
19+
))]
20+
mod ret {
21+
pub type MajorRetType = libc::c_uint;
22+
pub type MinorRetType = libc::c_uint;
23+
}
24+
25+
#[cfg(any(
26+
target_os = "android",
27+
target_os = "dragonfly",
28+
target_os = "netbsd",
29+
target_os = "freebsd",
30+
))]
31+
mod ret {
32+
pub type MajorRetType = libc::c_int;
33+
pub type MinorRetType = libc::c_int;
34+
}
35+
36+
#[cfg(any(
37+
target_os = "macos",
38+
target_os = "ios",
39+
target_os = "tvos",
40+
target_os = "watchos",
41+
target_os = "visionos"
42+
))]
43+
mod ret {
44+
pub type MajorRetType = i32;
45+
pub type MinorRetType = i32;
46+
}
47+
448
#[cfg(any(
549
target_os = "android",
650
target_os = "dragonfly",
@@ -14,13 +58,21 @@
1458
mod t {
1559
use libc::{self, c_uint, dev_t};
1660

61+
use super::ret::*;
62+
1763
extern "C" {
1864
pub fn makedev_ffi(major: c_uint, minor: c_uint) -> dev_t;
65+
pub fn major_ffi(dev: dev_t) -> c_uint;
66+
pub fn minor_ffi(dev: dev_t) -> c_uint;
1967
}
2068

2169
fn compare(major: c_uint, minor: c_uint) {
22-
let expected = unsafe { makedev_ffi(major, minor) };
23-
assert_eq!(libc::makedev(major, minor), expected);
70+
let dev = unsafe { makedev_ffi(major, minor) };
71+
assert_eq!(libc::makedev(major, minor), dev);
72+
let major = unsafe { major_ffi(dev) };
73+
assert_eq!(libc::major(dev), major as MajorRetType);
74+
let minor = unsafe { minor_ffi(dev) };
75+
assert_eq!(libc::minor(dev), minor as MinorRetType);
2476
}
2577

2678
// Every OS should be able to handle 8 bit major and minor numbers

src/fuchsia/mod.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -3423,20 +3423,6 @@ f! {
34233423
set1.bits == set2.bits
34243424
}
34253425

3426-
pub fn major(dev: crate::dev_t) -> c_uint {
3427-
let mut major = 0;
3428-
major |= (dev & 0x00000000000fff00) >> 8;
3429-
major |= (dev & 0xfffff00000000000) >> 32;
3430-
major as c_uint
3431-
}
3432-
3433-
pub fn minor(dev: crate::dev_t) -> c_uint {
3434-
let mut minor = 0;
3435-
minor |= (dev & 0x00000000000000ff) >> 0;
3436-
minor |= (dev & 0x00000ffffff00000) >> 12;
3437-
minor as c_uint
3438-
}
3439-
34403426
pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut c_uchar {
34413427
cmsg.offset(1) as *mut c_uchar
34423428
}
@@ -3519,6 +3505,20 @@ safe_f! {
35193505
dev |= (minor & 0xffffff00) << 12;
35203506
dev
35213507
}
3508+
3509+
pub {const} fn major(dev: crate::dev_t) -> c_uint {
3510+
let mut major = 0;
3511+
major |= (dev & 0x00000000000fff00) >> 8;
3512+
major |= (dev & 0xfffff00000000000) >> 32;
3513+
major as c_uint
3514+
}
3515+
3516+
pub {const} fn minor(dev: crate::dev_t) -> c_uint {
3517+
let mut minor = 0;
3518+
minor |= (dev & 0x00000000000000ff) >> 0;
3519+
minor |= (dev & 0x00000ffffff00000) >> 12;
3520+
minor as c_uint
3521+
}
35223522
}
35233523

35243524
fn __CMSG_LEN(cmsg: *const cmsghdr) -> ssize_t {

src/unix/aix/mod.rs

+19-19
Original file line numberDiff line numberDiff line change
@@ -2545,25 +2545,6 @@ f! {
25452545
let fd = fd as usize;
25462546
return ((*set).fds_bits[fd / bits] & (1 << (fd % bits))) != 0;
25472547
}
2548-
2549-
pub fn major(dev: crate::dev_t) -> c_uint {
2550-
let x = dev >> 16;
2551-
x as c_uint
2552-
}
2553-
2554-
pub fn minor(dev: crate::dev_t) -> c_uint {
2555-
let y = dev & 0xFFFF;
2556-
y as c_uint
2557-
}
2558-
2559-
pub fn makedev(major: c_uint, minor: c_uint) -> crate::dev_t {
2560-
let major = major as crate::dev_t;
2561-
let minor = minor as crate::dev_t;
2562-
let mut dev = 0;
2563-
dev |= major << 16;
2564-
dev |= minor;
2565-
dev
2566-
}
25672548
}
25682549

25692550
safe_f! {
@@ -2611,6 +2592,25 @@ safe_f! {
26112592
pub {const} fn WCOREDUMP(_status: c_int) -> bool {
26122593
false
26132594
}
2595+
2596+
pub {const} fn major(dev: crate::dev_t) -> c_uint {
2597+
let x = dev >> 16;
2598+
x as c_uint
2599+
}
2600+
2601+
pub {const} fn minor(dev: crate::dev_t) -> c_uint {
2602+
let y = dev & 0xFFFF;
2603+
y as c_uint
2604+
}
2605+
2606+
pub {const} fn makedev(major: c_uint, minor: c_uint) -> crate::dev_t {
2607+
let major = major as crate::dev_t;
2608+
let minor = minor as crate::dev_t;
2609+
let mut dev = 0;
2610+
dev |= major << 16;
2611+
dev |= minor;
2612+
dev
2613+
}
26142614
}
26152615

26162616
#[link(name = "thread")]

src/unix/bsd/apple/mod.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -5543,18 +5543,6 @@ f! {
55435543
pub {const} fn VM_MAKE_TAG(id: u8) -> u32 {
55445544
(id as u32) << 24u32
55455545
}
5546-
5547-
pub fn major(dev: dev_t) -> i32 {
5548-
(dev >> 24) & 0xff
5549-
}
5550-
5551-
pub fn minor(dev: dev_t) -> i32 {
5552-
dev & 0xffffff
5553-
}
5554-
5555-
pub fn makedev(major: i32, minor: i32) -> dev_t {
5556-
(major << 24) | minor
5557-
}
55585546
}
55595547

55605548
safe_f! {
@@ -5577,6 +5565,18 @@ safe_f! {
55775565
pub {const} fn WIFSTOPPED(status: c_int) -> bool {
55785566
_WSTATUS(status) == _WSTOPPED && WSTOPSIG(status) != 0x13
55795567
}
5568+
5569+
pub {const} fn makedev(major: i32, minor: i32) -> dev_t {
5570+
(major << 24) | minor
5571+
}
5572+
5573+
pub {const} fn major(dev: dev_t) -> i32 {
5574+
(dev >> 24) & 0xff
5575+
}
5576+
5577+
pub {const} fn minor(dev: dev_t) -> i32 {
5578+
dev & 0xffffff
5579+
}
55805580
}
55815581

55825582
extern "C" {

src/unix/bsd/freebsdlike/dragonfly/mod.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -1590,14 +1590,6 @@ f! {
15901590
let (idx, offset) = ((cpu >> 6) & 3, cpu & 63);
15911591
0 != cpuset.ary[idx] & (1 << offset)
15921592
}
1593-
1594-
pub fn major(dev: crate::dev_t) -> c_int {
1595-
((dev >> 8) & 0xff) as c_int
1596-
}
1597-
1598-
pub fn minor(dev: crate::dev_t) -> c_int {
1599-
(dev & 0xffff00ff) as c_int
1600-
}
16011593
}
16021594

16031595
safe_f! {
@@ -1613,6 +1605,14 @@ safe_f! {
16131605
dev |= minor;
16141606
dev
16151607
}
1608+
1609+
pub {const} fn major(dev: crate::dev_t) -> c_int {
1610+
((dev >> 8) & 0xff) as c_int
1611+
}
1612+
1613+
pub {const} fn minor(dev: crate::dev_t) -> c_int {
1614+
(dev & 0xffff00ff) as c_int
1615+
}
16161616
}
16171617

16181618
extern "C" {

src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -441,14 +441,12 @@ safe_f! {
441441
let minor = minor as crate::dev_t;
442442
(major << 8) | minor
443443
}
444-
}
445444

446-
f! {
447-
pub fn major(dev: crate::dev_t) -> c_int {
445+
pub {const} fn major(dev: crate::dev_t) -> c_int {
448446
((dev >> 8) & 0xff) as c_int
449447
}
450448

451-
pub fn minor(dev: crate::dev_t) -> c_int {
449+
pub {const} fn minor(dev: crate::dev_t) -> c_int {
452450
(dev & 0xffff00ff) as c_int
453451
}
454452
}

src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -496,14 +496,12 @@ safe_f! {
496496
dev |= ((minor & 0xffff00ff) as dev_t) << 0;
497497
dev
498498
}
499-
}
500499

501-
f! {
502-
pub fn major(dev: crate::dev_t) -> c_int {
500+
pub {const} fn major(dev: crate::dev_t) -> c_int {
503501
(((dev >> 32) & 0xffffff00) | ((dev >> 8) & 0xff)) as c_int
504502
}
505503

506-
pub fn minor(dev: crate::dev_t) -> c_int {
504+
pub {const} fn minor(dev: crate::dev_t) -> c_int {
507505
(((dev >> 24) & 0xff00) | (dev & 0xffff00ff)) as c_int
508506
}
509507
}

src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -518,14 +518,12 @@ safe_f! {
518518
dev |= ((minor & 0xffff00ff) as dev_t) << 0;
519519
dev
520520
}
521-
}
522521

523-
f! {
524-
pub fn major(dev: crate::dev_t) -> c_int {
522+
pub {const} fn major(dev: crate::dev_t) -> c_int {
525523
(((dev >> 32) & 0xffffff00) | ((dev >> 8) & 0xff)) as c_int
526524
}
527525

528-
pub fn minor(dev: crate::dev_t) -> c_int {
526+
pub {const} fn minor(dev: crate::dev_t) -> c_int {
529527
(((dev >> 24) & 0xff00) | (dev & 0xffff00ff)) as c_int
530528
}
531529
}

src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -518,14 +518,12 @@ safe_f! {
518518
dev |= ((minor & 0xffff00ff) as dev_t) << 0;
519519
dev
520520
}
521-
}
522521

523-
f! {
524-
pub fn major(dev: crate::dev_t) -> c_int {
522+
pub {const} fn major(dev: crate::dev_t) -> c_int {
525523
(((dev >> 32) & 0xffffff00) | ((dev >> 8) & 0xff)) as c_int
526524
}
527525

528-
pub fn minor(dev: crate::dev_t) -> c_int {
526+
pub {const} fn minor(dev: crate::dev_t) -> c_int {
529527
(((dev >> 24) & 0xff00) | (dev & 0xffff00ff)) as c_int
530528
}
531529
}

src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -519,14 +519,12 @@ safe_f! {
519519
dev |= ((minor & 0xffff00ff) as dev_t) << 0;
520520
dev
521521
}
522-
}
523522

524-
f! {
525-
pub fn major(dev: crate::dev_t) -> c_int {
523+
pub {const} fn major(dev: crate::dev_t) -> c_int {
526524
(((dev >> 32) & 0xffffff00) | ((dev >> 8) & 0xff)) as c_int
527525
}
528526

529-
pub fn minor(dev: crate::dev_t) -> c_int {
527+
pub {const} fn minor(dev: crate::dev_t) -> c_int {
530528
(((dev >> 24) & 0xff00) | (dev & 0xffff00ff)) as c_int
531529
}
532530
}

src/unix/bsd/netbsdlike/netbsd/mod.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -2461,17 +2461,6 @@ f! {
24612461
pub fn PROT_MPROTECT_EXTRACT(x: c_int) -> c_int {
24622462
(x >> 3) & 0x7
24632463
}
2464-
2465-
pub fn major(dev: crate::dev_t) -> c_int {
2466-
(((dev as u32) & 0x000fff00) >> 8) as c_int
2467-
}
2468-
2469-
pub fn minor(dev: crate::dev_t) -> c_int {
2470-
let mut res = 0;
2471-
res |= ((dev as u32) & 0xfff00000) >> 12;
2472-
res |= (dev as u32) & 0x000000ff;
2473-
res as c_int
2474-
}
24752464
}
24762465

24772466
safe_f! {
@@ -2500,6 +2489,17 @@ safe_f! {
25002489
dev |= minor & 0xff;
25012490
dev
25022491
}
2492+
2493+
pub {const} fn major(dev: crate::dev_t) -> c_int {
2494+
(((dev as u32) & 0x000fff00) >> 8) as c_int
2495+
}
2496+
2497+
pub {const} fn minor(dev: crate::dev_t) -> c_int {
2498+
let mut res = 0;
2499+
res |= ((dev as u32) & 0xfff00000) >> 12;
2500+
res |= (dev as u32) & 0x000000ff;
2501+
res as c_int
2502+
}
25032503
}
25042504

25052505
extern "C" {

0 commit comments

Comments
 (0)