1 #[cfg(not(all(target_os = "android", target_pointer_width = "32")))]
2 use crate::backend::c;
3 use crate::fs::Dev;
4 
5 #[cfg(not(any(
6     apple,
7     solarish,
8     target_os = "aix",
9     target_os = "android",
10     target_os = "emscripten",
11 )))]
12 #[inline]
makedev(maj: u32, min: u32) -> Dev13 pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
14     c::makedev(maj, min)
15 }
16 
17 #[cfg(solarish)]
makedev(maj: u32, min: u32) -> Dev18 pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
19     // SAFETY: Solarish's `makedev` is marked unsafe but it isn't doing
20     // anything unsafe.
21     unsafe { c::makedev(maj, min) }
22 }
23 
24 #[cfg(all(target_os = "android", not(target_pointer_width = "32")))]
25 #[inline]
makedev(maj: u32, min: u32) -> Dev26 pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
27     c::makedev(maj, min)
28 }
29 
30 #[cfg(all(target_os = "android", target_pointer_width = "32"))]
31 #[inline]
makedev(maj: u32, min: u32) -> Dev32 pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
33     // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit, so we do
34     // it ourselves.
35     ((u64::from(maj) & 0xffff_f000_u64) << 32)
36         | ((u64::from(maj) & 0x0000_0fff_u64) << 8)
37         | ((u64::from(min) & 0xffff_ff00_u64) << 12)
38         | (u64::from(min) & 0x0000_00ff_u64)
39 }
40 
41 #[cfg(target_os = "emscripten")]
42 #[inline]
makedev(maj: u32, min: u32) -> Dev43 pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
44     // Emscripten's `makedev` has a 32-bit return value.
45     Dev::from(c::makedev(maj, min))
46 }
47 
48 #[cfg(apple)]
49 #[inline]
makedev(maj: u32, min: u32) -> Dev50 pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
51     // Apple's `makedev` oddly has signed argument types and is `unsafe`.
52     unsafe { c::makedev(maj as i32, min as i32) }
53 }
54 
55 #[cfg(target_os = "aix")]
56 #[inline]
makedev(maj: u32, min: u32) -> Dev57 pub(crate) fn makedev(maj: u32, min: u32) -> Dev {
58     // AIX's `makedev` oddly is `unsafe`.
59     unsafe { c::makedev(maj, min) }
60 }
61 
62 #[cfg(not(any(
63     apple,
64     freebsdlike,
65     target_os = "android",
66     target_os = "emscripten",
67     target_os = "netbsd"
68 )))]
69 #[inline]
major(dev: Dev) -> u3270 pub(crate) fn major(dev: Dev) -> u32 {
71     unsafe { c::major(dev) }
72 }
73 
74 #[cfg(any(
75     apple,
76     freebsdlike,
77     target_os = "netbsd",
78     all(target_os = "android", not(target_pointer_width = "32")),
79 ))]
80 #[inline]
major(dev: Dev) -> u3281 pub(crate) fn major(dev: Dev) -> u32 {
82     // On some platforms `major` oddly has signed return types.
83     (unsafe { c::major(dev) }) as u32
84 }
85 
86 #[cfg(all(target_os = "android", target_pointer_width = "32"))]
87 #[inline]
major(dev: Dev) -> u3288 pub(crate) fn major(dev: Dev) -> u32 {
89     // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit, so we do
90     // it ourselves.
91     (((dev >> 31 >> 1) & 0xffff_f000) | ((dev >> 8) & 0x0000_0fff)) as u32
92 }
93 
94 #[cfg(target_os = "emscripten")]
95 #[inline]
major(dev: Dev) -> u3296 pub(crate) fn major(dev: Dev) -> u32 {
97     // Emscripten's `major` has a 32-bit argument value.
98     unsafe { c::major(dev as u32) }
99 }
100 
101 #[cfg(not(any(
102     apple,
103     freebsdlike,
104     target_os = "android",
105     target_os = "emscripten",
106     target_os = "netbsd"
107 )))]
108 #[inline]
minor(dev: Dev) -> u32109 pub(crate) fn minor(dev: Dev) -> u32 {
110     unsafe { c::minor(dev) }
111 }
112 
113 #[cfg(any(
114     apple,
115     freebsdlike,
116     target_os = "netbsd",
117     all(target_os = "android", not(target_pointer_width = "32"))
118 ))]
119 #[inline]
minor(dev: Dev) -> u32120 pub(crate) fn minor(dev: Dev) -> u32 {
121     // On some platforms, `minor` oddly has signed return types.
122     (unsafe { c::minor(dev) }) as u32
123 }
124 
125 #[cfg(all(target_os = "android", target_pointer_width = "32"))]
126 #[inline]
minor(dev: Dev) -> u32127 pub(crate) fn minor(dev: Dev) -> u32 {
128     // 32-bit Android's `dev_t` is 32-bit, but its `st_dev` is 64-bit, so we do
129     // it ourselves.
130     (((dev >> 12) & 0xffff_ff00) | (dev & 0x0000_00ff)) as u32
131 }
132 
133 #[cfg(target_os = "emscripten")]
134 #[inline]
minor(dev: Dev) -> u32135 pub(crate) fn minor(dev: Dev) -> u32 {
136     // Emscripten's `minor` has a 32-bit argument value.
137     unsafe { c::minor(dev as u32) }
138 }
139