posixstat.h revision 21308
1100384Speter/* posixstat.h -- Posix stat(2) definitions for systems that
2100384Speter   don't have them. */
3100384Speter
4100384Speter/* Copyright (C) 1987,1991 Free Software Foundation, Inc.
5100384Speter
6100384Speter   This file is part of GNU Bash, the Bourne Again SHell.
7100384Speter
8100384Speter   Bash is free software; you can redistribute it and/or modify it
9100384Speter   under the terms of the GNU General Public License as published by
10100384Speter   the Free Software Foundation; either version 1, or (at your option)
11100384Speter   any later version.
12100384Speter
13100384Speter   Bash is distributed in the hope that it will be useful, but WITHOUT
14100384Speter   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15100384Speter   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16100384Speter   License for more details.
17100384Speter
18100384Speter   You should have received a copy of the GNU General Public License
19100384Speter   along with Bash; see the file COPYING.  If not, write to the Free
20100384Speter   Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21100384Speter
22100384Speter/* This file should be included instead of <sys/stat.h>.
23100384Speter   It relies on the local sys/stat.h to work though. */
24100384Speter#if !defined (_POSIXSTAT_H_)
25100384Speter#define _POSIXSTAT_H_
26100384Speter
27118031Sobrien#include <sys/stat.h>
28118031Sobrien
29118031Sobrien#if defined (STAT_MACROS_BROKEN)
30104738Speter#  undef S_ISBLK
31191673Sjamie#  undef S_ISCHR
32191673Sjamie#  undef S_ISDIR
33104738Speter#  undef S_ISFIFO
34205014Snwhitehorn#  undef S_ISREG
35205014Snwhitehorn#  undef S_ISLNK
36100384Speter#endif /* STAT_MACROS_BROKEN */
37100384Speter
38162954Sphk/* These are guaranteed to work only on isc386 */
39100384Speter#if !defined (S_IFDIR) && !defined (S_ISDIR)
40100384Speter#  define S_IFDIR 0040000
41100384Speter#endif /* !S_IFDIR && !S_ISDIR */
42100384Speter#if !defined (S_IFMT)
43185435Sbz#  define S_IFMT  0170000
44100384Speter#endif /* !S_IFMT */
45161343Sjkim
46100384Speter/* Posix 1003.1 5.6.1.1 <sys/stat.h> file types */
47100384Speter
48100384Speter/* Some Posix-wannabe systems define _S_IF* macros instead of S_IF*, but
49205014Snwhitehorn   do not provide the S_IS* macros that Posix requires. */
50151909Sps
51100384Speter#if defined (_S_IFMT) && !defined (S_IFMT)
52100384Speter#define S_IFMT _S_IFMT
53100384Speter#endif
54100384Speter#if defined (_S_IFIFO) && !defined (S_IFIFO)
55183044Sobrien#define S_IFIFO _S_IFIFO
56100384Speter#endif
57100384Speter#if defined (_S_IFCHR) && !defined (S_IFCHR)
58100384Speter#define S_IFCHR _S_IFCHR
59100384Speter#endif
60100384Speter#if defined (_S_IFDIR) && !defined (S_IFDIR)
61146950Sps#define S_IFDIR _S_IFDIR
62100384Speter#endif
63100384Speter#if defined (_S_IFBLK) && !defined (S_IFBLK)
64100384Speter#define S_IFBLK _S_IFBLK
65100384Speter#endif
66100384Speter#if defined (_S_IFREG) && !defined (S_IFREG)
67100384Speter#define S_IFREG _S_IFREG
68150883Sjhb#endif
69113859Sjhb#if defined (_S_IFLNK) && !defined (S_IFLNK)
70100384Speter#define S_IFLNK _S_IFLNK
71100384Speter#endif
72100384Speter#if defined (_S_IFSOCK) && !defined (S_IFSOCK)
73183044Sobrien#define S_IFSOCK _S_IFSOCK
74162551Sdavidxu#endif
75100384Speter
76162551Sdavidxu/* Test for each symbol individually and define the ones necessary (some
77100384Speter   systems claiming Posix compatibility define some but not all). */
78127140Sjhb
79157285Sps#if defined (S_IFBLK) && !defined (S_ISBLK)
80174381Sjhb#define	S_ISBLK(m)	(((m)&S_IFMT) == S_IFBLK)	/* block device */
81174381Sjhb#endif
82157285Sps
83100384Speter#if defined (S_IFCHR) && !defined (S_ISCHR)
84191673Sjamie#define	S_ISCHR(m)	(((m)&S_IFMT) == S_IFCHR)	/* character device */
85191673Sjamie#endif
86191673Sjamie
87191673Sjamie#if defined (S_IFDIR) && !defined (S_ISDIR)
88100384Speter#define	S_ISDIR(m)	(((m)&S_IFMT) == S_IFDIR)	/* directory */
89100384Speter#endif
90100384Speter
91100384Speter#if defined (S_IFREG) && !defined (S_ISREG)
92100384Speter#define	S_ISREG(m)	(((m)&S_IFMT) == S_IFREG)	/* file */
93100384Speter#endif
94100384Speter
95151582Sps#if defined (S_IFIFO) && !defined (S_ISFIFO)
96205014Snwhitehorn#define	S_ISFIFO(m)	(((m)&S_IFMT) == S_IFIFO)	/* fifo - named pipe */
97151582Sps#endif
98183188Sobrien
99183188Sobrien#if defined (S_IFLNK) && !defined (S_ISLNK)
100119333Speter#define	S_ISLNK(m)	(((m)&S_IFMT) == S_IFLNK)	/* symbolic link */
101119333Speter#endif
102174380Sjhb
103163018Sdavidxu#if defined (S_IFSOCK) && !defined (S_ISSOCK)
104119333Speter#define	S_ISSOCK(m)	(((m)&S_IFMT) == S_IFSOCK)	/* socket */
105100384Speter#endif
106121719Speter
107121719Speter/*
108174377Sjhb * POSIX 1003.1 5.6.1.2 <sys/stat.h> File Modes
109121719Speter */
110121719Speter
111174377Sjhb#if !defined (S_IRWXU)
112174377Sjhb#  if !defined (S_IREAD)
113174377Sjhb#    define S_IREAD	00400
114174377Sjhb#    define S_IWRITE	00200
115174377Sjhb#    define S_IEXEC	00100
116174377Sjhb#  endif /* S_IREAD */
117121719Speter
118174377Sjhb#  if !defined (S_IRUSR)
119174377Sjhb#    define S_IRUSR	S_IREAD			/* read, owner */
120174377Sjhb#    define S_IWUSR	S_IWRITE		/* write, owner */
121205014Snwhitehorn#    define S_IXUSR	S_IEXEC			/* execute, owner */
122205014Snwhitehorn
123205014Snwhitehorn#    define S_IRGRP	(S_IREAD  >> 3)		/* read, group */
124205014Snwhitehorn#    define S_IWGRP	(S_IWRITE >> 3)		/* write, group */
125205014Snwhitehorn#    define S_IXGRP	(S_IEXEC  >> 3)		/* execute, group */
126205014Snwhitehorn
127205014Snwhitehorn#    define S_IROTH	(S_IREAD  >> 6)		/* read, other */
128205014Snwhitehorn#    define S_IWOTH	(S_IWRITE >> 6)		/* write, other */
129205014Snwhitehorn#    define S_IXOTH	(S_IEXEC  >> 6)		/* execute, other */
130205014Snwhitehorn#  endif /* !S_IRUSR */
131207007Skib
132207007Skib#  define S_IRWXU	(S_IRUSR | S_IWUSR | S_IXUSR)
133207007Skib#  define S_IRWXG	(S_IRGRP | S_IWGRP | S_IXGRP)
134207007Skib#  define S_IRWXO	(S_IROTH | S_IWOTH | S_IXOTH)
135207007Skib#endif /* !S_IRWXU */
136207007Skib
137207007Skib/* These are non-standard, but are used in builtins.c$symbolic_umask() */
138207007Skib#define S_IRUGO		(S_IRUSR | S_IRGRP | S_IROTH)
139207007Skib#define S_IWUGO		(S_IWUSR | S_IWGRP | S_IWOTH)
140207007Skib#define S_IXUGO		(S_IXUSR | S_IXGRP | S_IXOTH)
141207007Skib
142207007Skib#endif /* _POSIXSTAT_H_ */
143207007Skib