ReactOS 0.4.16-dev-1946-g52006dd
stat.h
Go to the documentation of this file.
1/*
2 * PROJECT: FreeLoader
3 * LICENSE: Dual-licensed:
4 * LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
5 * MIT (https://spdx.org/licenses/MIT)
6 * PURPOSE: sys/stat.h S_IF* flags used for stat/inode.st_mode, and S_IS*
7 * convenience macros, used by *nix-based file-systems (EXTn, Btrfs, ...)
8 * COPYRIGHT: Copyright 2025 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
9 *
10 * REFERENCE: Based on definitions from MinGW-w64, (u)CRT, schily/stat.h, etc.
11 */
12
13#pragma once
14
15
16/*
17 * Device/File types (st_mode)
18 */
19#define _S_IFMT 0xF000 // File type mask
20#define _S_IFIFO 0x1000 // FIFO buffer (Named pipe)
21#define _S_IFCHR 0x2000 // Character special
22// #define _S_IFMPC 0x3000 // Multiplexed Character special
23#define _S_IFDIR 0x4000 // Directory
24// #define _S_IFNAM 0x5000 // XENIX Named special
25#define _S_IFBLK 0x6000 // Block special
26// #define _S_IFMPB 0x7000 // Multiplexed Block special
27#define _S_IFREG 0x8000 // Regular file
28
29#define _S_IFCTG 0x9000 // Contiguous file
30#define _S_IFCMP 0x9000 // Compressed VxFS
31#define _S_IFNWK 0x9000 // Network Special (HP-UX)
32
33#define _S_IFLNK 0xA000 // Symbolic link
34#define _S_IFSHAD 0xB000 // Solaris shadow inode
35#define _S_IFSOCK 0xC000 // UNIX domain socket
36#define _S_IFDOOR 0xD000 // Solaris DOOR
37#define _S_IFPORT 0xE000 // Solaris event port
38#define _S_IFWHT 0xE000 // BSD whiteout
39#define _S_IFEVC 0xF000 // UNOS eventcount
40
41#define _S_ISTYPE(mode, mask) (((mode) & _S_IFMT) == (mask))
42
43#define _S_ISFIFO(m) _S_ISTYPE(m, _S_IFIFO) // (((m) & _S_IFMT) == _S_IFIFO)
44#define _S_ISCHR(m) _S_ISTYPE(m, _S_IFCHR) // (((m) & _S_IFMT) == _S_IFCHR)
45// #define _S_ISMPC(m) _S_ISTYPE(m, _S_IFMPC) // (((m) & _S_IFMT) == _S_IFMPC)
46#define _S_ISDIR(m) _S_ISTYPE(m, _S_IFDIR) // (((m) & _S_IFMT) == _S_IFDIR)
47// #define _S_ISNAM(m) _S_ISTYPE(m, _S_IFNAM) // (((m) & _S_IFMT) == _S_IFNAM)
48#define _S_ISBLK(m) _S_ISTYPE(m, _S_IFBLK) // (((m) & _S_IFMT) == _S_IFBLK)
49// #define _S_ISMPB(m) _S_ISTYPE(m, _S_IFMPB) // (((m) & _S_IFMT) == _S_IFMPB)
50#define _S_ISREG(m) _S_ISTYPE(m, _S_IFREG) // (((m) & _S_IFMT) == _S_IFREG)
51
52#define _S_ISCTG(m) _S_ISTYPE(m, _S_IFCTG) // (((m) & _S_IFMT) == _S_IFCTG)
53#define _S_ISCMP(m) _S_ISTYPE(m, _S_IFCMP) // (((m) & _S_IFMT) == _S_IFCMP)
54#define _S_ISNWK(m) _S_ISTYPE(m, _S_IFNWK) // (((m) & _S_IFMT) == _S_IFNWK)
55
56#define _S_ISLNK(m) _S_ISTYPE(m, _S_IFLNK ) // (((m) & _S_IFMT) == _S_IFLNK )
57#define _S_ISSHAD(m) _S_ISTYPE(m, _S_IFSHAD) // (((m) & _S_IFMT) == _S_IFSHAD)
58#define _S_ISSOCK(m) _S_ISTYPE(m, _S_IFSOCK) // (((m) & _S_IFMT) == _S_IFSOCK)
59#define _S_ISDOOR(m) _S_ISTYPE(m, _S_IFDOOR) // (((m) & _S_IFMT) == _S_IFDOOR)
60#define _S_ISPORT(m) _S_ISTYPE(m, _S_IFPORT) // (((m) & _S_IFMT) == _S_IFPORT)
61#define _S_ISWHT(m) _S_ISTYPE(m, _S_IFWHT ) // (((m) & _S_IFMT) == _S_IFWHT )
62#define _S_ISEVC(m) _S_ISTYPE(m, _S_IFEVC ) // (((m) & _S_IFMT) == _S_IFEVC )
63
64/*
65 * Major/Minor of device (st_rdev)
66 */
67#define S_INSEM 0x01 // XENIX IFNAM semaphore
68#define S_INSHD 0x02 // XENIX IFNAM shared memory object
69#define S_TYPEISSEM(_stbuf) (S_ISNAM((_stbuf)->st_mode) && \
70 (_stbuf)->st_rdev == S_INSEM)
71#define S_TYPEISSHM(_stbuf) (S_ISNAM((_stbuf)->st_mode) && \
72 (_stbuf)->st_rdev == S_INSHD)
73// #define S_TYPEISMQ(_stbuf) (...) // Test for message queue
74// #define S_TYPEISTMO(_stbuf) (...) // Test for typed memory object
75
76
77/*
78 * Mode permission bits (st_mode)
79 *
80 * S_IREAD/S_IWRITE/S_IEXEC is only available on UNIX V.7 but not on POSIX.
81 * UNIX V.7 has only S_IREAD/S_IWRITE/S_IEXEC and S_ISUID/S_ISGID/S_ISVTX.
82 * S_ISUID/S_ISGID/S_ISVTX is available on UNIX V.7 and POSIX.
83 */
84#define _S_IREAD 0x0100 // Read permission, owner
85#define _S_IWRITE 0x0080 // Write permission, owner
86#define _S_IEXEC 0x0040 // Execute/search permission, owner
87
88#define _S_IRUSR _S_IREAD // -r-------- // Read permission, owner
89#define _S_IWUSR _S_IWRITE // --w------- // Write permission, owner
90#define _S_IXUSR _S_IEXEC // ---x------ // Execute/search permission, owner
91#define _S_IRWXU (_S_IRUSR | _S_IWUSR | _S_IXUSR) // Read, write, execute/search by owner
92
93#define _S_IRGRP (_S_IRUSR >> 3) // ----r----- // Read permission, group
94#define _S_IWGRP (_S_IWUSR >> 3) // -----w---- // Write permission, group
95#define _S_IXGRP (_S_IXUSR >> 3) // ------x--- // Execute/search permission, group
96#define _S_IRWXG (_S_IRGRP | _S_IWGRP | _S_IXGRP) // Read, write, execute/search by group
97
98#define _S_IROTH (_S_IRUSR >> 6) // -------r-- // Read permission, others
99#define _S_IWOTH (_S_IWUSR >> 6) // --------w- // Write permission, others
100#define _S_IXOTH (_S_IXUSR >> 6) // ---------x // Execute/search permission, others
101#define _S_IRWXO (_S_IROTH | _S_IWOTH | _S_IXOTH) // Read, write, execute/search by others
102
103#define _S_ISUID 0x0800 // Set-user-ID on execution
104#define _S_ISGID 0x0400 // Set-group-ID on execution
105#define _S_ISVTX 0x0200 // Sticky bit: on directories, restricted deletion flag
106
107
108/* COMPATIBILITY DEFINITIONS *************************************************/
109
110// #if !defined(NO_OLDNAMES) || (defined(_CRT_INTERNAL_NONSTDC_NAMES) && _CRT_INTERNAL_NONSTDC_NAMES)
111
112/*
113 * Device/File types (st_mode)
114 */
115#define S_IFMT _S_IFMT
116#define S_IFIFO _S_IFIFO
117#define S_IFCHR _S_IFCHR
118// #define S_IFMPC _S_IFMPC
119#define S_IFDIR _S_IFDIR
120// #define S_IFNAM _S_IFNAM
121#define S_IFBLK _S_IFBLK
122// #define S_IFMPB _S_IFMPB
123#define S_IFREG _S_IFREG
124
125#define S_IFCTG _S_IFCTG
126#define S_IFCMP _S_IFCMP
127#define S_IFNWK _S_IFNWK
128
129#define S_IFLNK _S_IFLNK
130#define S_IFSHAD _S_IFSHAD
131#define S_IFSOCK _S_IFSOCK
132#define S_IFDOOR _S_IFDOOR
133#define S_IFPORT _S_IFPORT
134#define S_IFWHT _S_IFWHT
135#define S_IFEVC _S_IFEVC
136
137#define S_ISTYPE(mode, mask) _S_ISTYPE(mode, mask)
138
139#define S_ISFIFO(m) _S_ISFIFO(m)
140#define S_ISCHR(m) _S_ISCHR(m)
141// #define S_ISMPC(m) _S_ISMPC(m)
142#define S_ISDIR(m) _S_ISDIR(m)
143// #define S_ISNAM(m) _S_ISNAM(m)
144#define S_ISBLK(m) _S_ISBLK(m)
145// #define S_ISMPB(m) _S_ISMPB(m)
146#define S_ISREG(m) _S_ISREG(m)
147
148#define S_ISCTG(m) _S_ISCTG(m)
149#define S_ISCMP(m) _S_ISCMP(m)
150#define S_ISNWK(m) _S_ISNWK(m)
151
152#define S_ISLNK(m) _S_ISLNK(m)
153#define S_ISSHAD(m) _S_ISSHAD(m)
154#define S_ISSOCK(m) _S_ISSOCK(m)
155#define S_ISDOOR(m) _S_ISDOOR(m)
156#define S_ISPORT(m) _S_ISPORT(m)
157#define S_ISWHT(m) _S_ISWHT(m)
158#define S_ISEVC(m) _S_ISEVC(m)
159
160
161/*
162 * Mode permission bits (st_mode)
163 */
164#define S_IREAD _S_IREAD
165#define S_IWRITE _S_IWRITE
166#define S_IEXEC _S_IEXEC
167
168#define S_IRUSR _S_IRUSR
169#define S_IWUSR _S_IWUSR
170#define S_IXUSR _S_IXUSR
171#define S_IRWXU _S_IRWXU
172
173#define S_IRGRP _S_IRGRP
174#define S_IWGRP _S_IWGRP
175#define S_IXGRP _S_IXGRP
176#define S_IRWXG _S_IRWXG
177
178#define S_IROTH _S_IROTH
179#define S_IWOTH _S_IWOTH
180#define S_IXOTH _S_IXOTH
181#define S_IRWXO _S_IRWXO
182
183#define S_ISUID _S_ISUID
184#define S_ISGID _S_ISGID
185#define S_ISVTX _S_ISVTX
186
187// #endif // !NO_OLDNAMES || _CRT_INTERNAL_NONSTDC_NAMES