1 //! Compare libc's makdev function against the actual C macros, for various 2 //! inputs. 3 4 #[cfg(any( 5 target_os = "android", 6 target_os = "dragonfly", 7 target_os = "emscripten", 8 target_os = "freebsd", 9 target_os = "fuchsia", 10 target_os = "linux", 11 target_os = "netbsd", 12 target_os = "openbsd", 13 ))] 14 mod t { 15 use libc::{self, c_uint, dev_t}; 16 17 extern "C" { 18 pub fn makedev_ffi(major: c_uint, minor: c_uint) -> dev_t; 19 } 20 21 fn compare(major: c_uint, minor: c_uint) { 22 let expected = unsafe { makedev_ffi(major, minor) }; 23 assert_eq!(libc::makedev(major, minor), expected); 24 } 25 26 // Every OS should be able to handle 8 bit major and minor numbers 27 #[test] 28 fn test_8bits() { 29 for major in 0..256 { 30 for minor in 0..256 { 31 compare(major, minor); 32 } 33 } 34 } 35 36 // Android allows 12 bits for major and 20 for minor 37 #[test] 38 #[cfg(target_os = "android")] 39 fn test_android_like() { 40 for major in [0, 1, 255, 256, 4095] { 41 for minor_exp in [1, 8, 16] { 42 for minor in [(1 << minor_exp) - 1, (1 << minor_exp)] { 43 compare(major, minor); 44 } 45 } 46 compare(major, (1 << 20) - 1); 47 } 48 } 49 50 // These OSes allow 32 bits for minor, but only 8 for major 51 #[test] 52 #[cfg(any(target_os = "dragonfly", target_os = "freebsd", target_os = "netbsd",))] 53 fn test_fbsd11_like() { 54 for major in [0, 1, 255] { 55 for minor_exp in [1, 8, 16, 24, 31] { 56 for minor in [(1 << minor_exp) - 1, (1 << minor_exp)] { 57 compare(major, minor); 58 } 59 } 60 compare(major, c_uint::MAX); 61 } 62 } 63 64 // OpenBSD allows 8 bits for major and 24 for minor 65 #[test] 66 #[cfg(target_os = "openbsd")] 67 fn test_openbsd_like() { 68 for major in [0, 1, 255] { 69 for minor_exp in [1, 8, 16] { 70 for minor in [(1 << minor_exp) - 1, (1 << minor_exp)] { 71 compare(major, minor); 72 } 73 } 74 compare(major, (1 << 24) - 1); 75 } 76 } 77 78 // These OSes allow 32 bits for both minor and major 79 #[cfg(any( 80 target_os = "emscripten", 81 target_os = "freebsd", 82 target_os = "fuchsia", 83 target_os = "linux", 84 ))] 85 #[test] 86 fn test_fbsd12_like() { 87 if std::mem::size_of::<dev_t>() >= 8 { 88 for major_exp in [0, 16, 24, 31] { 89 for major in [(1 << major_exp) - 1, (1 << major_exp)] { 90 for minor_exp in [1, 8, 16, 24, 31] { 91 for minor in [(1 << minor_exp) - 1, (1 << minor_exp)] { 92 compare(major, minor); 93 } 94 } 95 compare(major, c_uint::MAX); 96 } 97 compare(c_uint::MAX, c_uint::MAX); 98 } 99 } 100 } 101 } 102