1*86d7f5d3SJohn Marino /* stat-related macros
2*86d7f5d3SJohn Marino 
3*86d7f5d3SJohn Marino    Copyright (C) 1993, 1994, 2001, 2002, 2004 Free Software Foundation, Inc.
4*86d7f5d3SJohn Marino 
5*86d7f5d3SJohn Marino    This program is free software; you can redistribute it and/or modify
6*86d7f5d3SJohn Marino    it under the terms of the GNU General Public License as published by
7*86d7f5d3SJohn Marino    the Free Software Foundation; either version 2, or (at your option)
8*86d7f5d3SJohn Marino    any later version.
9*86d7f5d3SJohn Marino 
10*86d7f5d3SJohn Marino    This program is distributed in the hope that it will be useful,
11*86d7f5d3SJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
12*86d7f5d3SJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*86d7f5d3SJohn Marino    GNU General Public License for more details.
14*86d7f5d3SJohn Marino 
15*86d7f5d3SJohn Marino    You should have received a copy of the GNU General Public License
16*86d7f5d3SJohn Marino    along with this program; if not, write to the Free Software Foundation,
17*86d7f5d3SJohn Marino    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
18*86d7f5d3SJohn Marino 
19*86d7f5d3SJohn Marino /* Written by Paul Eggert and Jim Meyering.  */
20*86d7f5d3SJohn Marino 
21*86d7f5d3SJohn Marino #ifndef STAT_MACROS_H
22*86d7f5d3SJohn Marino # define STAT_MACROS_H 1
23*86d7f5d3SJohn Marino 
24*86d7f5d3SJohn Marino # if ! defined S_ISREG && ! defined S_IFREG
25*86d7f5d3SJohn Marino #  error "you must include <sys/stat.h> before including this file"
26*86d7f5d3SJohn Marino # endif
27*86d7f5d3SJohn Marino 
28*86d7f5d3SJohn Marino # ifndef S_IFMT
29*86d7f5d3SJohn Marino #  define S_IFMT 0170000
30*86d7f5d3SJohn Marino # endif
31*86d7f5d3SJohn Marino 
32*86d7f5d3SJohn Marino # if STAT_MACROS_BROKEN
33*86d7f5d3SJohn Marino #  undef S_ISBLK
34*86d7f5d3SJohn Marino #  undef S_ISCHR
35*86d7f5d3SJohn Marino #  undef S_ISDIR
36*86d7f5d3SJohn Marino #  undef S_ISDOOR
37*86d7f5d3SJohn Marino #  undef S_ISFIFO
38*86d7f5d3SJohn Marino #  undef S_ISLNK
39*86d7f5d3SJohn Marino #  undef S_ISNAM
40*86d7f5d3SJohn Marino #  undef S_ISMPB
41*86d7f5d3SJohn Marino #  undef S_ISMPC
42*86d7f5d3SJohn Marino #  undef S_ISNWK
43*86d7f5d3SJohn Marino #  undef S_ISREG
44*86d7f5d3SJohn Marino #  undef S_ISSOCK
45*86d7f5d3SJohn Marino # endif
46*86d7f5d3SJohn Marino 
47*86d7f5d3SJohn Marino 
48*86d7f5d3SJohn Marino # ifndef S_ISBLK
49*86d7f5d3SJohn Marino #  ifdef S_IFBLK
50*86d7f5d3SJohn Marino #   define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
51*86d7f5d3SJohn Marino #  else
52*86d7f5d3SJohn Marino #   define S_ISBLK(m) 0
53*86d7f5d3SJohn Marino #  endif
54*86d7f5d3SJohn Marino # endif
55*86d7f5d3SJohn Marino 
56*86d7f5d3SJohn Marino # ifndef S_ISCHR
57*86d7f5d3SJohn Marino #  ifdef S_IFCHR
58*86d7f5d3SJohn Marino #   define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
59*86d7f5d3SJohn Marino #  else
60*86d7f5d3SJohn Marino #   define S_ISCHR(m) 0
61*86d7f5d3SJohn Marino #  endif
62*86d7f5d3SJohn Marino # endif
63*86d7f5d3SJohn Marino 
64*86d7f5d3SJohn Marino # ifndef S_ISDIR
65*86d7f5d3SJohn Marino #  ifdef S_IFDIR
66*86d7f5d3SJohn Marino #   define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
67*86d7f5d3SJohn Marino #  else
68*86d7f5d3SJohn Marino #   define S_ISDIR(m) 0
69*86d7f5d3SJohn Marino #  endif
70*86d7f5d3SJohn Marino # endif
71*86d7f5d3SJohn Marino 
72*86d7f5d3SJohn Marino # ifndef S_ISDOOR /* Solaris 2.5 and up */
73*86d7f5d3SJohn Marino #  ifdef S_IFDOOR
74*86d7f5d3SJohn Marino #   define S_ISDOOR(m) (((m) & S_IFMT) == S_IFDOOR)
75*86d7f5d3SJohn Marino #  else
76*86d7f5d3SJohn Marino #   define S_ISDOOR(m) 0
77*86d7f5d3SJohn Marino #  endif
78*86d7f5d3SJohn Marino # endif
79*86d7f5d3SJohn Marino 
80*86d7f5d3SJohn Marino # ifndef S_ISFIFO
81*86d7f5d3SJohn Marino #  ifdef S_IFIFO
82*86d7f5d3SJohn Marino #   define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
83*86d7f5d3SJohn Marino #  else
84*86d7f5d3SJohn Marino #   define S_ISFIFO(m) 0
85*86d7f5d3SJohn Marino #  endif
86*86d7f5d3SJohn Marino # endif
87*86d7f5d3SJohn Marino 
88*86d7f5d3SJohn Marino # ifndef S_ISLNK
89*86d7f5d3SJohn Marino #  ifdef S_IFLNK
90*86d7f5d3SJohn Marino #   define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
91*86d7f5d3SJohn Marino #  else
92*86d7f5d3SJohn Marino #   define S_ISLNK(m) 0
93*86d7f5d3SJohn Marino #  endif
94*86d7f5d3SJohn Marino # endif
95*86d7f5d3SJohn Marino 
96*86d7f5d3SJohn Marino # ifndef S_ISMPB /* V7 */
97*86d7f5d3SJohn Marino #  ifdef S_IFMPB
98*86d7f5d3SJohn Marino #   define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
99*86d7f5d3SJohn Marino #   define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
100*86d7f5d3SJohn Marino #  else
101*86d7f5d3SJohn Marino #   define S_ISMPB(m) 0
102*86d7f5d3SJohn Marino #   define S_ISMPC(m) 0
103*86d7f5d3SJohn Marino #  endif
104*86d7f5d3SJohn Marino # endif
105*86d7f5d3SJohn Marino 
106*86d7f5d3SJohn Marino # ifndef S_ISNAM /* Xenix */
107*86d7f5d3SJohn Marino #  ifdef S_IFNAM
108*86d7f5d3SJohn Marino #   define S_ISNAM(m) (((m) & S_IFMT) == S_IFNAM)
109*86d7f5d3SJohn Marino #  else
110*86d7f5d3SJohn Marino #   define S_ISNAM(m) 0
111*86d7f5d3SJohn Marino #  endif
112*86d7f5d3SJohn Marino # endif
113*86d7f5d3SJohn Marino 
114*86d7f5d3SJohn Marino # ifndef S_ISNWK /* HP/UX */
115*86d7f5d3SJohn Marino #  ifdef S_IFNWK
116*86d7f5d3SJohn Marino #   define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
117*86d7f5d3SJohn Marino #  else
118*86d7f5d3SJohn Marino #   define S_ISNWK(m) 0
119*86d7f5d3SJohn Marino #  endif
120*86d7f5d3SJohn Marino # endif
121*86d7f5d3SJohn Marino 
122*86d7f5d3SJohn Marino # ifndef S_ISREG
123*86d7f5d3SJohn Marino #  ifdef S_IFREG
124*86d7f5d3SJohn Marino #   define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
125*86d7f5d3SJohn Marino #  else
126*86d7f5d3SJohn Marino #   define S_ISREG(m) 0
127*86d7f5d3SJohn Marino #  endif
128*86d7f5d3SJohn Marino # endif
129*86d7f5d3SJohn Marino 
130*86d7f5d3SJohn Marino # ifndef S_ISSOCK
131*86d7f5d3SJohn Marino #  ifdef S_IFSOCK
132*86d7f5d3SJohn Marino #   define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
133*86d7f5d3SJohn Marino #  else
134*86d7f5d3SJohn Marino #   define S_ISSOCK(m) 0
135*86d7f5d3SJohn Marino #  endif
136*86d7f5d3SJohn Marino # endif
137*86d7f5d3SJohn Marino 
138*86d7f5d3SJohn Marino 
139*86d7f5d3SJohn Marino # ifndef S_TYPEISMQ
140*86d7f5d3SJohn Marino #  define S_TYPEISMQ(p) 0
141*86d7f5d3SJohn Marino # endif
142*86d7f5d3SJohn Marino 
143*86d7f5d3SJohn Marino # ifndef S_TYPEISTMO
144*86d7f5d3SJohn Marino #  define S_TYPEISTMO(p) 0
145*86d7f5d3SJohn Marino # endif
146*86d7f5d3SJohn Marino 
147*86d7f5d3SJohn Marino 
148*86d7f5d3SJohn Marino # ifndef S_TYPEISSEM
149*86d7f5d3SJohn Marino #  ifdef S_INSEM
150*86d7f5d3SJohn Marino #   define S_TYPEISSEM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSEM)
151*86d7f5d3SJohn Marino #  else
152*86d7f5d3SJohn Marino #   define S_TYPEISSEM(p) 0
153*86d7f5d3SJohn Marino #  endif
154*86d7f5d3SJohn Marino # endif
155*86d7f5d3SJohn Marino 
156*86d7f5d3SJohn Marino # ifndef S_TYPEISSHM
157*86d7f5d3SJohn Marino #  ifdef S_INSHD
158*86d7f5d3SJohn Marino #   define S_TYPEISSHM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSHD)
159*86d7f5d3SJohn Marino #  else
160*86d7f5d3SJohn Marino #   define S_TYPEISSHM(p) 0
161*86d7f5d3SJohn Marino #  endif
162*86d7f5d3SJohn Marino # endif
163*86d7f5d3SJohn Marino 
164*86d7f5d3SJohn Marino /* contiguous */
165*86d7f5d3SJohn Marino # ifndef S_ISCTG
166*86d7f5d3SJohn Marino #  define S_ISCTG(p) 0
167*86d7f5d3SJohn Marino # endif
168*86d7f5d3SJohn Marino 
169*86d7f5d3SJohn Marino /* Cray DMF (data migration facility): off line, with data  */
170*86d7f5d3SJohn Marino # ifndef S_ISOFD
171*86d7f5d3SJohn Marino #  define S_ISOFD(p) 0
172*86d7f5d3SJohn Marino # endif
173*86d7f5d3SJohn Marino 
174*86d7f5d3SJohn Marino /* Cray DMF (data migration facility): off line, with no data  */
175*86d7f5d3SJohn Marino # ifndef S_ISOFL
176*86d7f5d3SJohn Marino #  define S_ISOFL(p) 0
177*86d7f5d3SJohn Marino # endif
178*86d7f5d3SJohn Marino 
179*86d7f5d3SJohn Marino /* If any of the following are undefined,
180*86d7f5d3SJohn Marino    define them to their de facto standard values.  */
181*86d7f5d3SJohn Marino # if !S_ISUID
182*86d7f5d3SJohn Marino #  define S_ISUID 04000
183*86d7f5d3SJohn Marino # endif
184*86d7f5d3SJohn Marino # if !S_ISGID
185*86d7f5d3SJohn Marino #  define S_ISGID 02000
186*86d7f5d3SJohn Marino # endif
187*86d7f5d3SJohn Marino 
188*86d7f5d3SJohn Marino /* S_ISVTX is a common extension to POSIX.  */
189*86d7f5d3SJohn Marino # ifndef S_ISVTX
190*86d7f5d3SJohn Marino #  define S_ISVTX 01000
191*86d7f5d3SJohn Marino # endif
192*86d7f5d3SJohn Marino 
193*86d7f5d3SJohn Marino # if !S_IRUSR && S_IREAD
194*86d7f5d3SJohn Marino #  define S_IRUSR S_IREAD
195*86d7f5d3SJohn Marino # endif
196*86d7f5d3SJohn Marino # if !S_IRUSR
197*86d7f5d3SJohn Marino #  define S_IRUSR 00400
198*86d7f5d3SJohn Marino # endif
199*86d7f5d3SJohn Marino # if !S_IRGRP
200*86d7f5d3SJohn Marino #  define S_IRGRP (S_IRUSR >> 3)
201*86d7f5d3SJohn Marino # endif
202*86d7f5d3SJohn Marino # if !S_IROTH
203*86d7f5d3SJohn Marino #  define S_IROTH (S_IRUSR >> 6)
204*86d7f5d3SJohn Marino # endif
205*86d7f5d3SJohn Marino 
206*86d7f5d3SJohn Marino # if !S_IWUSR && S_IWRITE
207*86d7f5d3SJohn Marino #  define S_IWUSR S_IWRITE
208*86d7f5d3SJohn Marino # endif
209*86d7f5d3SJohn Marino # if !S_IWUSR
210*86d7f5d3SJohn Marino #  define S_IWUSR 00200
211*86d7f5d3SJohn Marino # endif
212*86d7f5d3SJohn Marino # if !S_IWGRP
213*86d7f5d3SJohn Marino #  define S_IWGRP (S_IWUSR >> 3)
214*86d7f5d3SJohn Marino # endif
215*86d7f5d3SJohn Marino # if !S_IWOTH
216*86d7f5d3SJohn Marino #  define S_IWOTH (S_IWUSR >> 6)
217*86d7f5d3SJohn Marino # endif
218*86d7f5d3SJohn Marino 
219*86d7f5d3SJohn Marino # if !S_IXUSR && S_IEXEC
220*86d7f5d3SJohn Marino #  define S_IXUSR S_IEXEC
221*86d7f5d3SJohn Marino # endif
222*86d7f5d3SJohn Marino # if !S_IXUSR
223*86d7f5d3SJohn Marino #  define S_IXUSR 00100
224*86d7f5d3SJohn Marino # endif
225*86d7f5d3SJohn Marino # if !S_IXGRP
226*86d7f5d3SJohn Marino #  define S_IXGRP (S_IXUSR >> 3)
227*86d7f5d3SJohn Marino # endif
228*86d7f5d3SJohn Marino # if !S_IXOTH
229*86d7f5d3SJohn Marino #  define S_IXOTH (S_IXUSR >> 6)
230*86d7f5d3SJohn Marino # endif
231*86d7f5d3SJohn Marino 
232*86d7f5d3SJohn Marino # if !S_IRWXU
233*86d7f5d3SJohn Marino #  define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
234*86d7f5d3SJohn Marino # endif
235*86d7f5d3SJohn Marino # if !S_IRWXG
236*86d7f5d3SJohn Marino #  define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
237*86d7f5d3SJohn Marino # endif
238*86d7f5d3SJohn Marino # if !S_IRWXO
239*86d7f5d3SJohn Marino #  define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
240*86d7f5d3SJohn Marino # endif
241*86d7f5d3SJohn Marino 
242*86d7f5d3SJohn Marino /* S_IXUGO is a common extension to POSIX.  */
243*86d7f5d3SJohn Marino # if !S_IXUGO
244*86d7f5d3SJohn Marino #  define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
245*86d7f5d3SJohn Marino # endif
246*86d7f5d3SJohn Marino 
247*86d7f5d3SJohn Marino # ifndef S_IRWXUGO
248*86d7f5d3SJohn Marino #  define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO)
249*86d7f5d3SJohn Marino # endif
250*86d7f5d3SJohn Marino 
251*86d7f5d3SJohn Marino /* All the mode bits that can be affected by chmod.  */
252*86d7f5d3SJohn Marino # define CHMOD_MODE_BITS \
253*86d7f5d3SJohn Marino   (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO)
254*86d7f5d3SJohn Marino 
255*86d7f5d3SJohn Marino #endif /* STAT_MACROS_H */
256