From 800c02c9e16d20101d5d2926a4829214c60829f0 Mon Sep 17 00:00:00 2001 From: qinghon Date: Sun, 25 May 2025 00:44:44 +0800 Subject: [PATCH 1/7] netbsd: Export ioctl request generator macros --- libc-test/semver/netbsd.txt | 15 +++++++++++ libc-test/semver/openbsd.txt | 9 +++++++ src/unix/bsd/netbsdlike/mod.rs | 46 ++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/libc-test/semver/netbsd.txt b/libc-test/semver/netbsd.txt index 57e1cf5c4bd1b..bf642e20cd17b 100644 --- a/libc-test/semver/netbsd.txt +++ b/libc-test/semver/netbsd.txt @@ -426,6 +426,17 @@ IFF_SIMPLEX IFF_UP IMAXBEL INIT_PROCESS +IOCBASECMD +IOCGROUP +IOCGROUP_SHIFT +IOCPARM_LEN +IOCPARM_MASK +IOCPARM_SHIFT +IOC_DIRMASK +IOC_IN +IOC_INOUT +IOC_OUT +IOC_VOID IOV_MAX IPC_CREAT IPC_EXCL @@ -1116,9 +1127,13 @@ XATTR_CREATE XATTR_REPLACE YESEXPR YESSTR +_IO _IOFBF _IOLBF _IONBF +_IOR +_IOW +_IOWR _PC_2_SYMLINKS _PC_ACL_EXTENDED _PC_FILESIZEBITS diff --git a/libc-test/semver/openbsd.txt b/libc-test/semver/openbsd.txt index f609a7b72cd45..f2fac24eb341e 100644 --- a/libc-test/semver/openbsd.txt +++ b/libc-test/semver/openbsd.txt @@ -267,6 +267,15 @@ IFF_SIMPLEX IFF_STATICARP IFF_UP IMAXBEL +IOCBASECMD +IOCGROUP +IOCPARM_LEN +IOCPARM_MASK +IOC_DIRMASK +IOC_IN +IOC_INOUT +IOC_OUT +IOC_VOID IOV_MAX IPC_CREAT IPC_EXCL diff --git a/src/unix/bsd/netbsdlike/mod.rs b/src/unix/bsd/netbsdlike/mod.rs index c95880ecb272c..39d805c3e2c69 100644 --- a/src/unix/bsd/netbsdlike/mod.rs +++ b/src/unix/bsd/netbsdlike/mod.rs @@ -439,6 +439,52 @@ pub const MNT_NODEV: c_int = 0x00000010; pub const MNT_LOCAL: c_int = 0x00001000; pub const MNT_QUOTA: c_int = 0x00002000; +// sys/ioccom.h in NetBSD and OpenBSD +pub const IOCPARM_MASK: u32 = 0x1fff; +pub const IOCPARM_SHIFT: u32 = 16; +pub const IOCGROUP_SHIFT: u32 = 8; + +pub const fn IOCPARM_LEN(x: u32) -> u32 { + (x >> IOCPARM_SHIFT) & IOCPARM_MASK +} + +pub const fn IOCBASECMD(x: u32) -> u32 { + x & (!(IOCPARM_MASK << IOCPARM_SHIFT)) +} + +pub const fn IOCGROUP(x: u32) -> u32 { + (x >> IOCGROUP_SHIFT) & 0xff +} + +pub const IOC_VOID: u32 = 0x20000000; +pub const IOC_OUT: u32 = 0x40000000; +pub const IOC_IN: u32 = 0x80000000; +pub const IOC_INOUT: u32 = IOC_IN | IOC_IN; +pub const IOC_DIRMASK: u32 = 0xe0000000; + +pub const fn _IOC(inout: u32, group: u32, num: u32, len: u32) -> u32 { + (inout) | (((len) & IOCPARM_MASK) << IOCPARM_SHIFT) | ((group) << IOCGROUP_SHIFT) | (num) +} + +pub const fn _IO(g: u32, n: u32) -> u32 { + _IOC(IOC_VOID, g, n, 0) +} + +/// Build an ioctl number for an read-only ioctl. +pub const fn _IOR(g: u32, n: u32) -> u32 { + _IOC(IOC_OUT, g, n, size_of::() as u32) +} + +/// Build an ioctl number for an write-only ioctl. +pub const fn _IOW(g: u32, n: u32) -> u32 { + _IOC(IOC_IN, g, n, size_of::() as u32) +} + +/// Build an ioctl number for a read-write ioctl. +pub const fn _IOWR(g: u32, n: u32) -> u32 { + _IOC(IOC_INOUT, g, n, size_of::() as u32) +} + pub const AF_UNSPEC: c_int = 0; pub const AF_LOCAL: c_int = 1; pub const AF_UNIX: c_int = AF_LOCAL; From 901f410840e017dce23263683b7a4db257040bb2 Mon Sep 17 00:00:00 2001 From: qinghon Date: Sun, 25 May 2025 12:29:46 +0800 Subject: [PATCH 2/7] netbsd: fix build error for x86_64-unknown-netbsd --- src/unix/bsd/netbsdlike/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/unix/bsd/netbsdlike/mod.rs b/src/unix/bsd/netbsdlike/mod.rs index 39d805c3e2c69..41f7b40042dc0 100644 --- a/src/unix/bsd/netbsdlike/mod.rs +++ b/src/unix/bsd/netbsdlike/mod.rs @@ -472,17 +472,17 @@ pub const fn _IO(g: u32, n: u32) -> u32 { /// Build an ioctl number for an read-only ioctl. pub const fn _IOR(g: u32, n: u32) -> u32 { - _IOC(IOC_OUT, g, n, size_of::() as u32) + _IOC(IOC_OUT, g, n, mem::size_of::() as u32) } /// Build an ioctl number for an write-only ioctl. pub const fn _IOW(g: u32, n: u32) -> u32 { - _IOC(IOC_IN, g, n, size_of::() as u32) + _IOC(IOC_IN, g, n, mem::size_of::() as u32) } /// Build an ioctl number for a read-write ioctl. pub const fn _IOWR(g: u32, n: u32) -> u32 { - _IOC(IOC_INOUT, g, n, size_of::() as u32) + _IOC(IOC_INOUT, g, n, mem::size_of::() as u32) } pub const AF_UNSPEC: c_int = 0; From 9fb66062196243e7e6cc09e8feafdc9e2492e7ec Mon Sep 17 00:00:00 2001 From: qinghon Date: Sun, 25 May 2025 18:25:50 +0800 Subject: [PATCH 3/7] openbsd: remove doesn't exist `IOCPARM_SHIFT` and `IOCGROUP_SHIFT` --- src/unix/bsd/netbsdlike/mod.rs | 18 ------------------ src/unix/bsd/netbsdlike/netbsd/mod.rs | 20 ++++++++++++++++++++ src/unix/bsd/netbsdlike/openbsd/mod.rs | 18 ++++++++++++++++++ 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/unix/bsd/netbsdlike/mod.rs b/src/unix/bsd/netbsdlike/mod.rs index 41f7b40042dc0..207dcd38dff31 100644 --- a/src/unix/bsd/netbsdlike/mod.rs +++ b/src/unix/bsd/netbsdlike/mod.rs @@ -441,20 +441,6 @@ pub const MNT_QUOTA: c_int = 0x00002000; // sys/ioccom.h in NetBSD and OpenBSD pub const IOCPARM_MASK: u32 = 0x1fff; -pub const IOCPARM_SHIFT: u32 = 16; -pub const IOCGROUP_SHIFT: u32 = 8; - -pub const fn IOCPARM_LEN(x: u32) -> u32 { - (x >> IOCPARM_SHIFT) & IOCPARM_MASK -} - -pub const fn IOCBASECMD(x: u32) -> u32 { - x & (!(IOCPARM_MASK << IOCPARM_SHIFT)) -} - -pub const fn IOCGROUP(x: u32) -> u32 { - (x >> IOCGROUP_SHIFT) & 0xff -} pub const IOC_VOID: u32 = 0x20000000; pub const IOC_OUT: u32 = 0x40000000; @@ -462,10 +448,6 @@ pub const IOC_IN: u32 = 0x80000000; pub const IOC_INOUT: u32 = IOC_IN | IOC_IN; pub const IOC_DIRMASK: u32 = 0xe0000000; -pub const fn _IOC(inout: u32, group: u32, num: u32, len: u32) -> u32 { - (inout) | (((len) & IOCPARM_MASK) << IOCPARM_SHIFT) | ((group) << IOCGROUP_SHIFT) | (num) -} - pub const fn _IO(g: u32, n: u32) -> u32 { _IOC(IOC_VOID, g, n, 0) } diff --git a/src/unix/bsd/netbsdlike/netbsd/mod.rs b/src/unix/bsd/netbsdlike/netbsd/mod.rs index a1d06ddd0dd7c..8b679d7c48a53 100644 --- a/src/unix/bsd/netbsdlike/netbsd/mod.rs +++ b/src/unix/bsd/netbsdlike/netbsd/mod.rs @@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::unix::bsd::IOCPARM_MASK; use crate::{cmsghdr, off_t}; pub type clock_t = c_uint; @@ -1850,6 +1851,25 @@ pub const MNT_WAIT: c_int = 1; pub const MNT_NOWAIT: c_int = 2; pub const MNT_LAZY: c_int = 3; +// sys/ioccom.h +pub const IOCPARM_SHIFT: u32 = 16; +pub const IOCGROUP_SHIFT: u32 = 8; + +pub const fn IOCPARM_LEN(x: u32) -> u32 { + (x >> IOCPARM_SHIFT) & IOCPARM_MASK +} + +pub const fn IOCBASECMD(x: u32) -> u32 { + x & (!(IOCPARM_MASK << IOCPARM_SHIFT)) +} + +pub const fn IOCGROUP(x: u32) -> u32 { + (x >> IOCGROUP_SHIFT) & 0xff +} +pub const fn _IOC(inout: u32, group: u32, num: u32, len: u32) -> u32 { + (inout) | (((len) & IOCPARM_MASK) << IOCPARM_SHIFT) | ((group) << IOCGROUP_SHIFT) | (num) +} + // pub const CLOCK_PROCESS_CPUTIME_ID: crate::clockid_t = 2; pub const CLOCK_THREAD_CPUTIME_ID: crate::clockid_t = 4; diff --git a/src/unix/bsd/netbsdlike/openbsd/mod.rs b/src/unix/bsd/netbsdlike/openbsd/mod.rs index dc1e7af00e400..32d1462940dbc 100644 --- a/src/unix/bsd/netbsdlike/openbsd/mod.rs +++ b/src/unix/bsd/netbsdlike/openbsd/mod.rs @@ -1,5 +1,6 @@ use crate::prelude::*; use crate::unix::bsd::O_SYNC; +use crate::unix::bsd::IOCPARM_MASK; use crate::{cmsghdr, off_t}; pub type clock_t = i64; @@ -1804,6 +1805,23 @@ pub const PF_R: u32 = 0x4; pub const PF_MASKOS: u32 = 0x0ff00000; pub const PF_MASKPROC: u32 = 0xf0000000; +// sys/ioccom.h +pub const fn IOCPARM_LEN(x: u32) -> u32 { + (x >> 16) & IOCPARM_MASK +} + +pub const fn IOCBASECMD(x: u32) -> u32 { + x & (!(IOCPARM_MASK << 16)) +} + +pub const fn IOCGROUP(x: u32) -> u32 { + (x >> 8) & 0xff +} +pub const fn _IOC(inout: u32, group: u32, num: u32, len: u32) -> u32 { + (inout) | (((len) & IOCPARM_MASK) << 16) | ((group) << 8) | (num) +} + + // sys/mount.h pub const MNT_NOPERM: c_int = 0x00000020; pub const MNT_WXALLOWED: c_int = 0x00000800; From 034c9c73848a46dac2b1777484a4361939ddae33 Mon Sep 17 00:00:00 2001 From: qinghon Date: Sun, 25 May 2025 18:44:46 +0800 Subject: [PATCH 4/7] openbsd: better format --- src/unix/bsd/netbsdlike/netbsd/mod.rs | 7 +++---- src/unix/bsd/netbsdlike/openbsd/mod.rs | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/unix/bsd/netbsdlike/netbsd/mod.rs b/src/unix/bsd/netbsdlike/netbsd/mod.rs index 8b679d7c48a53..032df95d1295e 100644 --- a/src/unix/bsd/netbsdlike/netbsd/mod.rs +++ b/src/unix/bsd/netbsdlike/netbsd/mod.rs @@ -1,5 +1,4 @@ use crate::prelude::*; -use crate::unix::bsd::IOCPARM_MASK; use crate::{cmsghdr, off_t}; pub type clock_t = c_uint; @@ -1856,18 +1855,18 @@ pub const IOCPARM_SHIFT: u32 = 16; pub const IOCGROUP_SHIFT: u32 = 8; pub const fn IOCPARM_LEN(x: u32) -> u32 { - (x >> IOCPARM_SHIFT) & IOCPARM_MASK + (x >> IOCPARM_SHIFT) & crate::IOCPARM_MASK } pub const fn IOCBASECMD(x: u32) -> u32 { - x & (!(IOCPARM_MASK << IOCPARM_SHIFT)) + x & (!(crate::IOCPARM_MASK << IOCPARM_SHIFT)) } pub const fn IOCGROUP(x: u32) -> u32 { (x >> IOCGROUP_SHIFT) & 0xff } pub const fn _IOC(inout: u32, group: u32, num: u32, len: u32) -> u32 { - (inout) | (((len) & IOCPARM_MASK) << IOCPARM_SHIFT) | ((group) << IOCGROUP_SHIFT) | (num) + (inout) | (((len) & crate::IOCPARM_MASK) << IOCPARM_SHIFT) | ((group) << IOCGROUP_SHIFT) | (num) } // diff --git a/src/unix/bsd/netbsdlike/openbsd/mod.rs b/src/unix/bsd/netbsdlike/openbsd/mod.rs index 32d1462940dbc..63cbc105b5db8 100644 --- a/src/unix/bsd/netbsdlike/openbsd/mod.rs +++ b/src/unix/bsd/netbsdlike/openbsd/mod.rs @@ -1,6 +1,5 @@ use crate::prelude::*; use crate::unix::bsd::O_SYNC; -use crate::unix::bsd::IOCPARM_MASK; use crate::{cmsghdr, off_t}; pub type clock_t = i64; @@ -1807,18 +1806,18 @@ pub const PF_MASKPROC: u32 = 0xf0000000; // sys/ioccom.h pub const fn IOCPARM_LEN(x: u32) -> u32 { - (x >> 16) & IOCPARM_MASK + (x >> 16) & crate::IOCPARM_MASK } pub const fn IOCBASECMD(x: u32) -> u32 { - x & (!(IOCPARM_MASK << 16)) + x & (!(crate::IOCPARM_MASK << 16)) } pub const fn IOCGROUP(x: u32) -> u32 { (x >> 8) & 0xff } pub const fn _IOC(inout: u32, group: u32, num: u32, len: u32) -> u32 { - (inout) | (((len) & IOCPARM_MASK) << 16) | ((group) << 8) | (num) + (inout) | (((len) & crate::IOCPARM_MASK) << 16) | ((group) << 8) | (num) } From eb1f2a8983ec6ac977c906a640bc0963a0749f92 Mon Sep 17 00:00:00 2001 From: qinghon Date: Sun, 25 May 2025 21:41:11 +0800 Subject: [PATCH 5/7] openbsd: fix bug for `IOC_INOUT` --- src/unix/bsd/netbsdlike/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unix/bsd/netbsdlike/mod.rs b/src/unix/bsd/netbsdlike/mod.rs index 207dcd38dff31..9fc83776adfda 100644 --- a/src/unix/bsd/netbsdlike/mod.rs +++ b/src/unix/bsd/netbsdlike/mod.rs @@ -445,7 +445,7 @@ pub const IOCPARM_MASK: u32 = 0x1fff; pub const IOC_VOID: u32 = 0x20000000; pub const IOC_OUT: u32 = 0x40000000; pub const IOC_IN: u32 = 0x80000000; -pub const IOC_INOUT: u32 = IOC_IN | IOC_IN; +pub const IOC_INOUT: u32 = IOC_IN | IOC_OUT; pub const IOC_DIRMASK: u32 = 0xe0000000; pub const fn _IO(g: u32, n: u32) -> u32 { From 5f457224cded74a50fbc2663972ec074dec1ea8c Mon Sep 17 00:00:00 2001 From: qinghon Date: Mon, 26 May 2025 22:08:31 +0800 Subject: [PATCH 6/7] openbsd: fix width bug for ioctl builder --- libc-test/semver/netbsd.txt | 1 + libc-test/semver/openbsd.txt | 5 +++++ src/unix/bsd/netbsdlike/mod.rs | 24 ++++++++++++------------ src/unix/bsd/netbsdlike/netbsd/mod.rs | 7 ++++--- src/unix/bsd/netbsdlike/openbsd/mod.rs | 6 +++--- 5 files changed, 25 insertions(+), 18 deletions(-) diff --git a/libc-test/semver/netbsd.txt b/libc-test/semver/netbsd.txt index bf642e20cd17b..677e37ea0a155 100644 --- a/libc-test/semver/netbsd.txt +++ b/libc-test/semver/netbsd.txt @@ -1128,6 +1128,7 @@ XATTR_REPLACE YESEXPR YESSTR _IO +_IOC _IOFBF _IOLBF _IONBF diff --git a/libc-test/semver/openbsd.txt b/libc-test/semver/openbsd.txt index f2fac24eb341e..6e452dadea797 100644 --- a/libc-test/semver/openbsd.txt +++ b/libc-test/semver/openbsd.txt @@ -917,9 +917,14 @@ WSTOPPED WTRAPPED YESEXPR YESSTR +_IO +_IOC _IOFBF _IOLBF _IONBF +_IOR +_IOW +_IOWR _MAX_PAGE_SHIFT _PC_2_SYMLINKS _PC_ALLOC_SIZE_MIN diff --git a/src/unix/bsd/netbsdlike/mod.rs b/src/unix/bsd/netbsdlike/mod.rs index 9fc83776adfda..4b66584b8e562 100644 --- a/src/unix/bsd/netbsdlike/mod.rs +++ b/src/unix/bsd/netbsdlike/mod.rs @@ -442,29 +442,29 @@ pub const MNT_QUOTA: c_int = 0x00002000; // sys/ioccom.h in NetBSD and OpenBSD pub const IOCPARM_MASK: u32 = 0x1fff; -pub const IOC_VOID: u32 = 0x20000000; -pub const IOC_OUT: u32 = 0x40000000; -pub const IOC_IN: u32 = 0x80000000; -pub const IOC_INOUT: u32 = IOC_IN | IOC_OUT; -pub const IOC_DIRMASK: u32 = 0xe0000000; +pub const IOC_VOID: c_ulong = 0x20000000; +pub const IOC_OUT: c_ulong = 0x40000000; +pub const IOC_IN: c_ulong = 0x80000000; +pub const IOC_INOUT: c_ulong = IOC_IN | IOC_OUT; +pub const IOC_DIRMASK: c_ulong = 0xe0000000; -pub const fn _IO(g: u32, n: u32) -> u32 { +pub const fn _IO(g: c_ulong, n: c_ulong) -> c_ulong { _IOC(IOC_VOID, g, n, 0) } /// Build an ioctl number for an read-only ioctl. -pub const fn _IOR(g: u32, n: u32) -> u32 { - _IOC(IOC_OUT, g, n, mem::size_of::() as u32) +pub const fn _IOR(g: c_ulong, n: c_ulong) -> c_ulong { + _IOC(IOC_OUT, g, n, mem::size_of::() as c_ulong) } /// Build an ioctl number for an write-only ioctl. -pub const fn _IOW(g: u32, n: u32) -> u32 { - _IOC(IOC_IN, g, n, mem::size_of::() as u32) +pub const fn _IOW(g: c_ulong, n: c_ulong) -> c_ulong { + _IOC(IOC_IN, g, n, mem::size_of::() as c_ulong) } /// Build an ioctl number for a read-write ioctl. -pub const fn _IOWR(g: u32, n: u32) -> u32 { - _IOC(IOC_INOUT, g, n, mem::size_of::() as u32) +pub const fn _IOWR(g: c_ulong, n: c_ulong) -> c_ulong { + _IOC(IOC_INOUT, g, n, mem::size_of::() as c_ulong) } pub const AF_UNSPEC: c_int = 0; diff --git a/src/unix/bsd/netbsdlike/netbsd/mod.rs b/src/unix/bsd/netbsdlike/netbsd/mod.rs index 032df95d1295e..3d68da68674d6 100644 --- a/src/unix/bsd/netbsdlike/netbsd/mod.rs +++ b/src/unix/bsd/netbsdlike/netbsd/mod.rs @@ -1850,7 +1850,7 @@ pub const MNT_WAIT: c_int = 1; pub const MNT_NOWAIT: c_int = 2; pub const MNT_LAZY: c_int = 3; -// sys/ioccom.h +// sys/ioccom.h pub const IOCPARM_SHIFT: u32 = 16; pub const IOCGROUP_SHIFT: u32 = 8; @@ -1865,8 +1865,9 @@ pub const fn IOCBASECMD(x: u32) -> u32 { pub const fn IOCGROUP(x: u32) -> u32 { (x >> IOCGROUP_SHIFT) & 0xff } -pub const fn _IOC(inout: u32, group: u32, num: u32, len: u32) -> u32 { - (inout) | (((len) & crate::IOCPARM_MASK) << IOCPARM_SHIFT) | ((group) << IOCGROUP_SHIFT) | (num) + +pub const fn _IOC(inout: c_ulong, group: c_ulong, num: c_ulong, len: c_ulong) -> c_ulong { + (inout) | (((len) & crate::IOCPARM_MASK as c_ulong) << IOCPARM_SHIFT) | ((group) << IOCGROUP_SHIFT) | (num) } // diff --git a/src/unix/bsd/netbsdlike/openbsd/mod.rs b/src/unix/bsd/netbsdlike/openbsd/mod.rs index 63cbc105b5db8..99320f0334367 100644 --- a/src/unix/bsd/netbsdlike/openbsd/mod.rs +++ b/src/unix/bsd/netbsdlike/openbsd/mod.rs @@ -1804,7 +1804,7 @@ pub const PF_R: u32 = 0x4; pub const PF_MASKOS: u32 = 0x0ff00000; pub const PF_MASKPROC: u32 = 0xf0000000; -// sys/ioccom.h +// sys/ioccom.h pub const fn IOCPARM_LEN(x: u32) -> u32 { (x >> 16) & crate::IOCPARM_MASK } @@ -1816,11 +1816,11 @@ pub const fn IOCBASECMD(x: u32) -> u32 { pub const fn IOCGROUP(x: u32) -> u32 { (x >> 8) & 0xff } -pub const fn _IOC(inout: u32, group: u32, num: u32, len: u32) -> u32 { + +pub const fn _IOC(inout: c_ulong, group: c_ulong, num: c_ulong, len: c_ulong) -> c_ulong { (inout) | (((len) & crate::IOCPARM_MASK) << 16) | ((group) << 8) | (num) } - // sys/mount.h pub const MNT_NOPERM: c_int = 0x00000020; pub const MNT_WXALLOWED: c_int = 0x00000800; From d0ac62d324eb364e57b42daef7eb056cf94b67c4 Mon Sep 17 00:00:00 2001 From: qinghon Date: Mon, 26 May 2025 22:19:09 +0800 Subject: [PATCH 7/7] openbsd: fix width bug for `_IOC` --- src/unix/bsd/netbsdlike/openbsd/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unix/bsd/netbsdlike/openbsd/mod.rs b/src/unix/bsd/netbsdlike/openbsd/mod.rs index 99320f0334367..95854dfd561ee 100644 --- a/src/unix/bsd/netbsdlike/openbsd/mod.rs +++ b/src/unix/bsd/netbsdlike/openbsd/mod.rs @@ -1818,7 +1818,7 @@ pub const fn IOCGROUP(x: u32) -> u32 { } pub const fn _IOC(inout: c_ulong, group: c_ulong, num: c_ulong, len: c_ulong) -> c_ulong { - (inout) | (((len) & crate::IOCPARM_MASK) << 16) | ((group) << 8) | (num) + (inout) | (((len) & crate::IOCPARM_MASK as c_ulong) << 16) | ((group) << 8) | (num) } // sys/mount.h