ReactOS 0.4.15-dev-8102-g108db8f
stat.h
Go to the documentation of this file.
1/* @(#)stat.h 1.20 15/08/23 Copyright 1998-2015 J. Schilling */
2/*
3 * Definitions for stat() file mode
4 *
5 * Copyright (c) 1998-2015 J. Schilling
6 */
7/*
8 * The contents of this file are subject to the terms of the
9 * Common Development and Distribution License, Version 1.0 only
10 * (the "License"). You may not use this file except in compliance
11 * with the License.
12 *
13 * See the file CDDL.Schily.txt in this distribution for details.
14 * A copy of the CDDL is also available via the Internet at
15 * http://www.opensource.org/licenses/cddl1.txt
16 *
17 * When distributing Covered Code, include this CDDL HEADER in each
18 * file and include the License file CDDL.Schily.txt from this distribution.
19 */
20
21#ifndef _SCHILY_STAT_H
22#define _SCHILY_STAT_H
23
24#ifndef _SCHILY_MCONFIG_H
25#include <schily/mconfig.h>
26#endif
27
28#ifndef _SCHILY_TYPES_H
29#include <schily/types.h> /* Needed for sys/stat.h */
30#endif
31#ifndef _INCL_SYS_STAT_H
32#include <sys/stat.h> /* For S_IS* and S_IF* */
33#define _INCL_SYS_STAT_H
34#endif
35
36#if !defined(HAVE_LSTAT) || !defined(S_IFLNK)
37#define lstat stat
38#endif
39
40/*
41 * Apollo Domain/OS has a broken sys/stat.h that defines
42 * S_IFIFO == S_IFSOCK and creates trouble if the constants
43 * are used as case labels.
44 */
45#if S_IFIFO == S_IFSOCK
46# undef S_IFSOCK
47#endif
48
49#ifdef STAT_MACROS_BROKEN
50#undef S_ISFIFO /* Named pipe */
51#undef S_ISCHR /* Character special */
52#undef S_ISMPC /* UNUSED multiplexed c */
53#undef S_ISDIR /* Directory */
54#undef S_ISNAM /* Named file (XENIX) */
55#undef S_ISBLK /* Block special */
56#undef S_ISMPB /* UNUSED multiplexed b */
57#undef S_ISREG /* Regular file */
58#undef S_ISCTG /* Contiguous file */
59#undef S_ISLNK /* Symbolic link */
60#undef S_ISSHAD /* Solaris shadow inode */
61#undef S_ISSOCK /* UNIX domain socket */
62#undef S_ISDOOR /* Solaris DOOR */
63#undef S_ISPORT /* Solaris event port */
64#undef S_ISWHT /* BSD whiteout */
65#undef S_ISEVC /* UNOS eventcount */
66#endif
67
68#ifndef S_ISFIFO /* 1 Named pipe */
69# ifdef S_IFIFO
70# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
71# else
72# define S_ISFIFO(m) (0)
73# endif
74#endif
75#ifndef S_ISCHR /* 2 Character special */
76# ifdef S_IFCHR
77# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
78# else
79# define S_ISCHR(m) (0)
80# endif
81#endif
82#ifndef S_ISMPC /* 3 UNUSED multiplexed char */
83# ifdef S_IFMPC
84# define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
85# else
86# define S_ISMPC(m) (0)
87# endif
88#endif
89#ifndef S_ISDIR /* 4 Directory */
90# ifdef S_IFDIR
91# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
92# else
93# define S_ISDIR(m) (0)
94# endif
95#endif
96#ifndef S_ISNAM /* 5 Named file (XENIX) */
97# ifdef S_IFNAM
98# define S_ISNAM(m) (((m) & S_IFMT) == S_IFNAM)
99# else
100# define S_ISNAM(m) (0)
101# endif
102#endif
103#ifndef S_ISBLK /* 6 Block special */
104# ifdef S_IFBLK
105# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
106# else
107# define S_ISBLK(m) (0)
108# endif
109#endif
110#ifndef S_ISMPB /* 7 UNUSED multiplexed block */
111# ifdef S_IFMPB
112# define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
113# else
114# define S_ISMPB(m) (0)
115# endif
116#endif
117#ifndef S_ISREG /* 8 Regular file */
118# ifdef S_IFREG
119# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
120# else
121# define S_ISREG(m) (0)
122# endif
123#endif
124#ifndef S_ISCTG /* 9 Contiguous file */
125# ifdef S_IFCTG
126# define S_ISCTG(m) (((m) & S_IFMT) == S_IFCTG)
127# else
128# define S_ISCTG(m) (0)
129# endif
130#endif
131#ifndef S_ISLNK /* 10 Symbolic link */
132# ifdef S_IFLNK
133# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
134# else
135# define S_ISLNK(m) (0)
136# endif
137#endif
138#ifndef S_ISSHAD /* 11 Solaris shadow inode */
139# ifdef S_IFSHAD
140# define S_ISSHAD(m) (((m) & S_IFMT) == S_IFSHAD)
141# else
142# define S_ISSHAD(m) (0)
143# endif
144#endif
145#ifndef S_ISSOCK /* 12 UNIX domain socket */
146# ifdef S_IFSOCK
147# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
148# else
149# define S_ISSOCK(m) (0)
150# endif
151#endif
152#ifndef S_ISDOOR /* 13 Solaris DOOR */
153# ifdef S_IFDOOR
154# define S_ISDOOR(m) (((m) & S_IFMT) == S_IFDOOR)
155# else
156# define S_ISDOOR(m) (0)
157# endif
158#endif
159#ifndef S_ISPORT /* 14 Solaris event port */
160# ifdef S_IFPORT
161# define S_ISPORT(m) (((m) & S_IFMT) == S_IFPORT)
162# else
163# define S_ISPORT(m) (0)
164# endif
165#endif
166#ifndef S_ISWHT /* 14 BSD whiteout */
167# ifdef S_IFWHT
168# define S_ISWHT(m) (((m) & S_IFMT) == S_ISWHT)
169# else
170# define S_ISWHT(m) (0)
171# endif
172#endif
173#ifndef S_IFEVC /* 15 UNOS eventcount */
174# ifdef S_IFEVC
175# define S_ISEVC(m) (((m) & S_IFMT) == S_IFEVC)
176# else
177# define S_ISEVC(m) (0)
178# endif
179#endif
180
181#ifndef S_TYPEISMQ
182/*
183 * XXX ??? where is a definition of a message queue ???
184 */
185# define S_TYPEISMQ(_stbuf) (0)
186#endif
187#ifndef S_TYPEISSEM
188# ifdef S_INSEM
189# define S_TYPEISSEM(_stbuf) (S_ISNAM((_stbuf)->st_mode) && \
190 (_stbuf)->st_rdev == S_INSEM)
191# else
192# define S_TYPEISSEM(_stbuf) (0)
193# endif
194#endif
195#ifndef S_TYPEISSHM
196# ifdef S_INSHD
197# define S_TYPEISSHM(_stbuf) (S_ISNAM((_stbuf)->st_mode) && \
198 (_stbuf)->st_rdev == S_INSHD)
199# else
200# define S_TYPEISSHM(_stbuf) (0)
201# endif
202#endif
203
204/*
205 * Mode permission bits.
206 * UNIX V.7 has only S_ISUID/S_ISGID/S_ISVTX and S_IREAD/S_IWRITE/S_IEXEC
207 *
208 * S_ISUID/S_ISGID/S_ISVTX is available on UNIX V.7 and POSIX
209 */
210#ifndef S_ISUID /* Set-user-ID on execution */
211#define S_ISUID 0 /* If it is not defined, it is not supported */
212#endif
213#ifndef S_ISGID /* Set-group-ID on execution */
214#define S_ISGID 0 /* If it is not defined, it is not supported */
215#endif
216#ifndef S_ISVTX /* On directories, restricted deletion flag */
217#define S_ISVTX 0 /* If it is not defined, it is not supported */
218#endif
219
220/*
221 * S_IREAD/S_IWRITE/S_IEXEC is only available on UNIX V.7 but not on POSIX
222 * Emulate these definitions to support compilation of programs like
223 * SCCS and the Bourne Shell and to make the other definitions simpler.
224 */
225#ifndef S_IREAD
226#ifdef S_IRUSR
227#define S_IREAD S_IRUSR /* Use POSIX name */
228#else
229#define S_IREAD 0400 /* Very old UNIX, use own definition */
230#endif
231#endif
232#ifndef S_IWRITE
233#ifdef S_IWUSR
234#define S_IWRITE S_IWUSR /* Use POSIX name */
235#else
236#define S_IWRITE 0200 /* Very old UNIX, use own definition */
237#endif
238#endif
239#ifndef S_IEXEC
240#ifdef S_IXUSR
241#define S_IEXEC S_IXUSR /* Use POSIX name */
242#else
243#define S_IEXEC 0100 /* Very old UNIX, use own definition */
244#endif
245#endif
246
247#ifndef S_IRUSR /* Read permission, owner */
248#define S_IRUSR S_IREAD /* Needed on old UNIX systems */
249#endif
250#ifndef S_IWUSR /* Write permission, owner */
251#define S_IWUSR S_IWRITE /* Needed on old UNIX systems */
252#endif
253#ifndef S_IXUSR /* Execute/search permission, owner */
254#define S_IXUSR S_IEXEC /* Needed on old UNIX systems */
255#endif
256#ifndef S_IRGRP /* Read permission, group */
257#define S_IRGRP (S_IREAD >> 3) /* Needed on old UNIX systems */
258#endif
259#ifndef S_IWGRP /* Write permission, group */
260#define S_IWGRP (S_IWRITE >> 3) /* Needed on old UNIX systems */
261#endif
262#ifndef S_IXGRP /* Execute/search permission, group */
263#define S_IXGRP (S_IEXEC >> 3) /* Needed on old UNIX systems */
264#endif
265#ifndef S_IROTH /* Read permission, others */
266#define S_IROTH (S_IREAD >> 6) /* Needed on old UNIX systems */
267#endif
268#ifndef S_IWOTH /* Write permission, others */
269#define S_IWOTH (S_IWRITE >> 6) /* Needed on old UNIX systems */
270#endif
271#ifndef S_IXOTH /* Execute/search permission, others */
272#define S_IXOTH (S_IEXEC >> 6) /* Needed on old UNIX systems */
273#endif
274
275#ifndef S_IRWXU /* Read, write, execute/search by owner */
276#define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR)
277#endif
278#ifndef S_IRWXG /* Read, write, execute/search by group */
279#define S_IRWXG (S_IRGRP|S_IWGRP|S_IXGRP)
280#endif
281#ifndef S_IRWXO /* Read, write, execute/search by others */
282#define S_IRWXO (S_IROTH|S_IWOTH|S_IXOTH)
283#endif
284
285/*
286 * SCO UnixWare has st_atim.st__tim.tv_nsec but the st_atim.tv_nsec tests also
287 * succeeds. If we use st_atim.tv_nsec on UnixWare, we get a warning about
288 * illegal structure usage. For this reason, our code needs to have
289 * #ifdef HAVE_ST__TIM before #ifdef HAVE_ST_NSEC.
290 */
291#if defined(HAVE_ST_ATIMENSEC)
292
293/*
294 * Found e.g. on NetBSD and OpenBSD.
295 */
296#define stat_ansecs(s) ((s)->st_atimensec)
297#define stat_mnsecs(s) ((s)->st_mtimensec)
298#define stat_cnsecs(s) ((s)->st_ctimensec)
299
300#define stat_set_ansecs(s, n) ((s)->st_atimensec = n)
301#define stat_set_mnsecs(s, n) ((s)->st_mtimensec = n)
302#define stat_set_cnsecs(s, n) ((s)->st_ctimensec = n)
303
304#define _FOUND_STAT_NSECS_
305#endif
306
307#if defined(HAVE_ST_ATIME_N)
308
309/*
310 * Found e.g. on AIX.
311 */
312#define stat_ansecs(s) ((s)->st_atime_n)
313#define stat_mnsecs(s) ((s)->st_mtime_n)
314#define stat_cnsecs(s) ((s)->st_ctime_n)
315
316#define stat_set_ansecs(s, n) ((s)->st_atime_n = n)
317#define stat_set_mnsecs(s, n) ((s)->st_mtime_n = n)
318#define stat_set_cnsecs(s, n) ((s)->st_ctime_n = n)
319
320#define _FOUND_STAT_NSECS_
321#endif
322
323#if defined(HAVE_ST__TIM) && !defined(_FOUND_STAT_NSECS_)
324
325/*
326 * Found e.g. on UnixWare.
327 */
328#define stat_ansecs(s) ((s)->st_atim.st__tim.tv_nsec)
329#define stat_mnsecs(s) ((s)->st_mtim.st__tim.tv_nsec)
330#define stat_cnsecs(s) ((s)->st_ctim.st__tim.tv_nsec)
331
332#define stat_set_ansecs(s, n) ((s)->st_atim.st__tim.tv_nsec = n)
333#define stat_set_mnsecs(s, n) ((s)->st_mtim.st__tim.tv_nsec = n)
334#define stat_set_cnsecs(s, n) ((s)->st_ctim.st__tim.tv_nsec = n)
335
336#define _FOUND_STAT_NSECS_
337#endif
338
339#if defined(HAVE_ST_NSEC) && !defined(_FOUND_STAT_NSECS_)
340
341/*
342 * Found e.g. on SunOS-5.x and IRIX.
343 */
344#define stat_ansecs(s) ((s)->st_atim.tv_nsec)
345#define stat_mnsecs(s) ((s)->st_mtim.tv_nsec)
346#define stat_cnsecs(s) ((s)->st_ctim.tv_nsec)
347
348#define stat_set_ansecs(s, n) ((s)->st_atim.tv_nsec = n)
349#define stat_set_mnsecs(s, n) ((s)->st_mtim.tv_nsec = n)
350#define stat_set_cnsecs(s, n) ((s)->st_ctim.tv_nsec = n)
351
352#define _FOUND_STAT_NSECS_
353#endif
354
355#if defined(HAVE_ST_ATIMESPEC) && !defined(_FOUND_STAT_NSECS_)
356
357/*
358 * Found e.g. on FreeBSD and Mac OS X.
359 */
360#define stat_ansecs(s) ((s)->st_atimespec.tv_nsec)
361#define stat_mnsecs(s) ((s)->st_mtimespec.tv_nsec)
362#define stat_cnsecs(s) ((s)->st_ctimespec.tv_nsec)
363
364#define stat_set_ansecs(s, n) ((s)->st_atimespec.tv_nsec = n)
365#define stat_set_mnsecs(s, n) ((s)->st_mtimespec.tv_nsec = n)
366#define stat_set_cnsecs(s, n) ((s)->st_ctimespec.tv_nsec = n)
367
368#define _FOUND_STAT_NSECS_
369#endif
370
371/*
372 * st_spare1 is last as some implementations keep backwards
373 * compatibility although there is one of the nsec implementations.
374 */
375#if defined(HAVE_ST_SPARE1) && !defined(_FOUND_STAT_NSECS_)
376
377/*
378 * Found e.g. on SunOS-4.x and HP-UX.
379 */
380#define stat_ansecs(s) ((s)->st_spare1 * 1000)
381#define stat_mnsecs(s) ((s)->st_spare2 * 1000)
382#define stat_cnsecs(s) ((s)->st_spare3 * 1000)
383
384#define stat_set_ansecs(s, n) ((s)->st_spare1 = n / 1000)
385#define stat_set_mnsecs(s, n) ((s)->st_spare2 = n / 1000)
386#define stat_set_cnsecs(s, n) ((s)->st_spare3 = n / 1000)
387
388#define _FOUND_STAT_USECS_
389#define _FOUND_STAT_NSECS_
390#endif
391
392#if !defined(_FOUND_STAT_NSECS_)
393#define stat_ansecs(s) (0)
394#define stat_mnsecs(s) (0)
395#define stat_cnsecs(s) (0)
396
397#define stat_set_ansecs(s, n) (0)
398#define stat_set_mnsecs(s, n) (0)
399#define stat_set_cnsecs(s, n) (0)
400#endif
401
402#endif /* _SCHILY_STAT_H */