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 2, 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, 59 Temple Place, Suite 330, Boston, MA 02111 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 (STAT_MACROS_BROKEN)
30#  undef S_ISBLK
31#  undef S_ISCHR
32#  undef S_ISDIR
33#  undef S_ISFIFO
34#  undef S_ISREG
35#  undef S_ISLNK
36#endif /* STAT_MACROS_BROKEN */
37
38/* These are guaranteed to work only on isc386 */
39#if !defined (S_IFDIR) && !defined (S_ISDIR)
40#  define S_IFDIR 0040000
41#endif /* !S_IFDIR && !S_ISDIR */
42#if !defined (S_IFMT)
43#  define S_IFMT  0170000
44#endif /* !S_IFMT */
45
46/* Posix 1003.1 5.6.1.1 <sys/stat.h> file types */
47
48/* Some Posix-wannabe systems define _S_IF* macros instead of S_IF*, but
49   do not provide the S_IS* macros that Posix requires. */
50
51#if defined (_S_IFMT) && !defined (S_IFMT)
52#define S_IFMT _S_IFMT
53#endif
54#if defined (_S_IFIFO) && !defined (S_IFIFO)
55#define S_IFIFO _S_IFIFO
56#endif
57#if defined (_S_IFCHR) && !defined (S_IFCHR)
58#define S_IFCHR _S_IFCHR
59#endif
60#if defined (_S_IFDIR) && !defined (S_IFDIR)
61#define S_IFDIR _S_IFDIR
62#endif
63#if defined (_S_IFBLK) && !defined (S_IFBLK)
64#define S_IFBLK _S_IFBLK
65#endif
66#if defined (_S_IFREG) && !defined (S_IFREG)
67#define S_IFREG _S_IFREG
68#endif
69#if defined (_S_IFLNK) && !defined (S_IFLNK)
70#define S_IFLNK _S_IFLNK
71#endif
72#if defined (_S_IFSOCK) && !defined (S_IFSOCK)
73#define S_IFSOCK _S_IFSOCK
74#endif
75
76/* Test for each symbol individually and define the ones necessary (some
77   systems claiming Posix compatibility define some but not all). */
78
79#if defined (S_IFBLK) && !defined (S_ISBLK)
80#define	S_ISBLK(m)	(((m)&S_IFMT) == S_IFBLK)	/* block device */
81#endif
82
83#if defined (S_IFCHR) && !defined (S_ISCHR)
84#define	S_ISCHR(m)	(((m)&S_IFMT) == S_IFCHR)	/* character device */
85#endif
86
87#if defined (S_IFDIR) && !defined (S_ISDIR)
88#define	S_ISDIR(m)	(((m)&S_IFMT) == S_IFDIR)	/* directory */
89#endif
90
91#if defined (S_IFREG) && !defined (S_ISREG)
92#define	S_ISREG(m)	(((m)&S_IFMT) == S_IFREG)	/* file */
93#endif
94
95#if defined (S_IFIFO) && !defined (S_ISFIFO)
96#define	S_ISFIFO(m)	(((m)&S_IFMT) == S_IFIFO)	/* fifo - named pipe */
97#endif
98
99#if defined (S_IFLNK) && !defined (S_ISLNK)
100#define	S_ISLNK(m)	(((m)&S_IFMT) == S_IFLNK)	/* symbolic link */
101#endif
102
103#if defined (S_IFSOCK) && !defined (S_ISSOCK)
104#define	S_ISSOCK(m)	(((m)&S_IFMT) == S_IFSOCK)	/* socket */
105#endif
106
107/*
108 * POSIX 1003.1 5.6.1.2 <sys/stat.h> File Modes
109 */
110
111#if !defined (S_IRWXU)
112#  if !defined (S_IREAD)
113#    define S_IREAD	00400
114#    define S_IWRITE	00200
115#    define S_IEXEC	00100
116#  endif /* S_IREAD */
117
118#  if !defined (S_IRUSR)
119#    define S_IRUSR	S_IREAD			/* read, owner */
120#    define S_IWUSR	S_IWRITE		/* write, owner */
121#    define S_IXUSR	S_IEXEC			/* execute, owner */
122
123#    define S_IRGRP	(S_IREAD  >> 3)		/* read, group */
124#    define S_IWGRP	(S_IWRITE >> 3)		/* write, group */
125#    define S_IXGRP	(S_IEXEC  >> 3)		/* execute, group */
126
127#    define S_IROTH	(S_IREAD  >> 6)		/* read, other */
128#    define S_IWOTH	(S_IWRITE >> 6)		/* write, other */
129#    define S_IXOTH	(S_IEXEC  >> 6)		/* execute, other */
130#  endif /* !S_IRUSR */
131
132#  define S_IRWXU	(S_IRUSR | S_IWUSR | S_IXUSR)
133#  define S_IRWXG	(S_IRGRP | S_IWGRP | S_IXGRP)
134#  define S_IRWXO	(S_IROTH | S_IWOTH | S_IXOTH)
135#endif /* !S_IRWXU */
136
137/* These are non-standard, but are used in builtins.c$symbolic_umask() */
138#define S_IRUGO		(S_IRUSR | S_IRGRP | S_IROTH)
139#define S_IWUGO		(S_IWUSR | S_IWGRP | S_IWOTH)
140#define S_IXUGO		(S_IXUSR | S_IXGRP | S_IXOTH)
141
142#endif /* _POSIXSTAT_H_ */
143