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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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