1 /* posixstat.h -- Posix stat(2) definitions for systems that
2    don't have them. */
3 
4 /* Copyright (C) 1987,1991 Free Software Foundation, Inc.
5 
6    This file is part of GNU Bash, the Bourne Again SHell.
7 
8    Bash is free software; you can redistribute it and/or modify it
9    under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 1, or (at your option)
11    any later version.
12 
13    Bash is distributed in the hope that it will be useful, but WITHOUT
14    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16    License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with Bash; see the file COPYING.  If not, write to the Free
20    Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21 
22 /* This file should be included instead of <sys/stat.h>.
23    It relies on the local sys/stat.h to work though. */
24 #if !defined (_POSIXSTAT_H)
25 #define _POSIXSTAT_H
26 
27 #include <sys/stat.h>
28 
29 #if defined (isc386)
30 #  if !defined (S_IFDIR)
31 #    define S_IFDIR 0040000
32 #  endif /* !S_IFDIR */
33 #  if !defined (S_IFMT)
34 #    define S_IFMT  0170000
35 #  endif /* !S_IFMT */
36 #endif /* isc386 */
37 
38 /* This text is taken directly from the Cadmus I was trying to
39    compile on:
40     the following MACROs are defined for X/OPEN compatibility
41     however, is the param correct ??
42    #define S_ISBLK(s) ((s.st_mode & S_IFMT) == S_IFBLK)
43 
44   Well, the answer is no.  Thus... */
45 #if defined (BrainDeath)
46 #  undef S_ISBLK
47 #  undef S_ISCHR
48 #  undef S_ISDIR
49 #  undef S_ISFIFO
50 #  undef S_ISREG
51 #endif /* BrainDeath */
52 
53 /* Posix 1003.1 5.6.1.1 <sys/stat.h> file types */
54 
55 /* Some Posix-wannabe systems define _S_IF* macros instead of S_IF*, but
56    do not provide the S_IS* macros that Posix requires. */
57 
58 #if defined (_S_IFMT) && !defined (S_IFMT)
59 #define S_IFMT _S_IFMT
60 #endif
61 #if defined (_S_IFIFO) && !defined (S_IFIFO)
62 #define S_IFIFO _S_IFIFO
63 #endif
64 #if defined (_S_IFCHR) && !defined (S_IFCHR)
65 #define S_IFCHR _S_IFCHR
66 #endif
67 #if defined (_S_IFDIR) && !defined (S_IFDIR)
68 #define S_IFDIR _S_IFDIR
69 #endif
70 #if defined (_S_IFBLK) && !defined (S_IFBLK)
71 #define S_IFBLK _S_IFBLK
72 #endif
73 #if defined (_S_IFREG) && !defined (S_IFREG)
74 #define S_IFREG _S_IFREG
75 #endif
76 #if defined (_S_IFLNK) && !defined (S_IFLNK)
77 #define S_IFLNK _S_IFLNK
78 #endif
79 #if defined (_S_IFSOCK) && !defined (S_IFSOCK)
80 #define S_IFSOCK _S_IFSOCK
81 #endif
82 
83 /* Test for each symbol individually and define the ones necessary (some
84    systems claiming Posix compatibility define some but not all). */
85 
86 #if defined (S_IFBLK) && !defined (S_ISBLK)
87 #define	S_ISBLK(m)	(((m)&S_IFMT) == S_IFBLK)	/* block device */
88 #endif
89 
90 #if defined (S_IFCHR) && !defined (S_ISCHR)
91 #define	S_ISCHR(m)	(((m)&S_IFMT) == S_IFCHR)	/* character device */
92 #endif
93 
94 #if defined (S_IFDIR) && !defined (S_ISDIR)
95 #define	S_ISDIR(m)	(((m)&S_IFMT) == S_IFDIR)	/* directory */
96 #endif
97 
98 #if defined (S_IFREG) && !defined (S_ISREG)
99 #define	S_ISREG(m)	(((m)&S_IFMT) == S_IFREG)	/* file */
100 #endif
101 
102 #if defined (S_IFIFO) && !defined (S_ISFIFO)
103 #define	S_ISFIFO(m)	(((m)&S_IFMT) == S_IFIFO)	/* fifo - named pipe */
104 #endif
105 
106 #if defined (S_IFLNK) && !defined (S_ISLNK)
107 #define	S_ISLNK(m)	(((m)&S_IFMT) == S_IFLNK)	/* symbolic link */
108 #endif
109 
110 #if defined (S_IFSOCK) && !defined (S_ISSOCK)
111 #define	S_ISSOCK(m)	(((m)&S_IFMT) == S_IFSOCK)	/* socket */
112 #endif
113 
114 /*
115  * POSIX 1003.1 5.6.1.2 <sys/stat.h> File Modes
116  */
117 
118 #if !defined (S_IRWXU)
119 #  if !defined (S_IREAD)
120 #    define S_IREAD	00400
121 #    define S_IWRITE	00200
122 #    define S_IEXEC	00100
123 #  endif /* S_IREAD */
124 
125 #  if !defined (S_IRUSR)
126 #    define S_IRUSR	S_IREAD			/* read, owner */
127 #    define S_IWUSR	S_IWRITE		/* write, owner */
128 #    define S_IXUSR	S_IEXEC			/* execute, owner */
129 
130 #    define S_IRGRP	(S_IREAD  >> 3)		/* read, group */
131 #    define S_IWGRP	(S_IWRITE >> 3)		/* write, group */
132 #    define S_IXGRP	(S_IEXEC  >> 3)		/* execute, group */
133 
134 #    define S_IROTH	(S_IREAD  >> 6)		/* read, other */
135 #    define S_IWOTH	(S_IWRITE >> 6)		/* write, other */
136 #    define S_IXOTH	(S_IEXEC  >> 6)		/* execute, other */
137 #  endif /* !S_IRUSR */
138 
139 #  define S_IRWXU	(S_IRUSR | S_IWUSR | S_IXUSR)
140 #  define S_IRWXG	(S_IRGRP | S_IWGRP | S_IXGRP)
141 #  define S_IRWXO	(S_IROTH | S_IWOTH | S_IXOTH)
142 #endif /* !S_IRWXU */
143 
144 /* These are non-standard, but are used in builtins.c$symbolic_umask() */
145 #define S_IRUGO		(S_IRUSR | S_IRGRP | S_IROTH)
146 #define S_IWUGO		(S_IWUSR | S_IWGRP | S_IWOTH)
147 #define S_IXUGO		(S_IXUSR | S_IXGRP | S_IXOTH)
148 
149 #endif /* _POSIXSTAT_H */
150