nydus_utils/
compact.rs

1// Copyright 2020 Ant Group. All rights reserved.
2// Copyright (C) 2020 Alibaba Cloud. All rights reserved.
3//
4// SPDX-License-Identifier: Apache-2.0
5use nix::sys::stat::dev_t;
6
7// makedev calculations compact with macos
8// view https://opensource.apple.com/source/xnu/xnu-201/bsd/sys/types.h.auto.html
9pub fn makedev(major: u64, minor: u64) -> dev_t {
10    #[cfg(target_os = "linux")]
11    {
12        nix::sys::stat::makedev(major, minor)
13    }
14    #[cfg(target_os = "macos")]
15    {
16        ((major & 0xff << 24) | (minor & 0xffffff)) as dev_t
17    }
18}
19
20pub fn major_dev(dev: u64) -> u64 {
21    #[cfg(target_os = "linux")]
22    {
23        nix::sys::stat::major(dev)
24    }
25    #[cfg(target_os = "macos")]
26    {
27        (dev >> 24) & 0xff
28    }
29}
30
31pub fn minor_dev(dev: u64) -> u64 {
32    #[cfg(target_os = "linux")]
33    {
34        nix::sys::stat::minor(dev)
35    }
36    #[cfg(target_os = "macos")]
37    {
38        dev & 0xffffff
39    }
40}
41
42#[cfg(all(test, target_os = "linux"))]
43mod tests {
44
45    use super::*;
46
47    #[test]
48    fn test_dev() {
49        let major: u64 = 0xffff_ffff_ffff_abcd;
50        let minor: u64 = 0xffff_ffff_abcd_ffff;
51        let dev = nix::sys::stat::makedev(major, minor);
52        assert_eq!(major_dev(dev), 0xffff_abcd);
53        assert_eq!(minor_dev(dev), 0xabcd_ffff);
54    }
55}