summaryrefslogtreecommitdiffstats
path: root/vendor/rustix/src/backend/libc/fs/makedev.rs
blob: afe942a59a47aa8e11c786680c33d7a1b90a3b37 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#[cfg(not(all(target_os = "android", target_pointer_width = "32")))]
use super::super::c;
use crate::fs::Dev;

#[cfg(not(any(
    apple,
    target_os = "aix",
    target_os = "android",
    target_os = "emscripten",
)))]
#[inline]
pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
    c::makedev(maj, min)
}

#[cfg(all(target_os = "android", not(target_pointer_width = "32")))]
#[inline]
pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
    c::makedev(maj, min)
}

#[cfg(all(target_os = "android", target_pointer_width = "32"))]
#[inline]
pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
    // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit,
    // so we do it ourselves.
    ((u64::from(maj) & 0xffff_f000_u64) << 32)
        | ((u64::from(maj) & 0x0000_0fff_u64) << 8)
        | ((u64::from(min) & 0xffff_ff00_u64) << 12)
        | (u64::from(min) & 0x0000_00ff_u64)
}

#[cfg(target_os = "emscripten")]
#[inline]
pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
    // Emscripten's `makedev` has a 32-bit return value.
    Dev::from(c::makedev(maj, min))
}

#[cfg(apple)]
#[inline]
pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
    // Apple's `makedev` oddly has signed argument types and is `unsafe`.
    unsafe { c::makedev(maj as i32, min as i32) }
}

#[cfg(target_os = "aix")]
#[inline]
pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
    // AIX's `makedev` oddly is `unsafe`.
    unsafe { c::makedev(maj, min) }
}

#[cfg(not(any(
    apple,
    freebsdlike,
    netbsdlike,
    target_os = "android",
    target_os = "emscripten",
)))]
#[inline]
pub(crate) fn major(dev: Dev) -> u32 {
    unsafe { c::major(dev) }
}

#[cfg(all(target_os = "android", not(target_pointer_width = "32")))]
#[inline]
pub(crate) fn major(dev: Dev) -> u32 {
    // Android's `major` oddly has signed return types.
    (unsafe { c::major(dev) }) as u32
}

#[cfg(all(target_os = "android", target_pointer_width = "32"))]
#[inline]
pub(crate) fn major(dev: Dev) -> u32 {
    // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit,
    // so we do it ourselves.
    (((dev >> 31 >> 1) & 0xffff_f000) | ((dev >> 8) & 0x0000_0fff)) as u32
}

#[cfg(target_os = "emscripten")]
#[inline]
pub(crate) fn major(dev: Dev) -> u32 {
    // Emscripten's `major` has a 32-bit argument value.
    unsafe { c::major(dev as u32) }
}

#[cfg(not(any(
    apple,
    freebsdlike,
    netbsdlike,
    target_os = "android",
    target_os = "emscripten",
)))]
#[inline]
pub(crate) fn minor(dev: Dev) -> u32 {
    unsafe { c::minor(dev) }
}

#[cfg(all(target_os = "android", not(target_pointer_width = "32")))]
#[inline]
pub(crate) fn minor(dev: Dev) -> u32 {
    // Android's `minor` oddly has signed return types.
    (unsafe { c::minor(dev) }) as u32
}

#[cfg(all(target_os = "android", target_pointer_width = "32"))]
#[inline]
pub(crate) fn minor(dev: Dev) -> u32 {
    // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit,
    // so we do it ourselves.
    (((dev >> 12) & 0xffff_ff00) | (dev & 0x0000_00ff)) as u32
}

#[cfg(target_os = "emscripten")]
#[inline]
pub(crate) fn minor(dev: Dev) -> u32 {
    // Emscripten's `minor` has a 32-bit argument value.
    unsafe { c::minor(dev as u32) }
}