1 /*
2  * Public domain
3  * sys/stat.h compatibility shim
4  */
5 module libressl_d.compat.sys.stat;
6 
7 
8 private static import libressl_d.compat.stdio;
9 public import core.sys.posix.sys.stat;
10 public import core.sys.windows.stat;
11 public import core.sys.windows.windows;
12 
13 extern (C):
14 nothrow @nogc:
15 
16 version (Posix) {
17 	/* for old MinGW */
18 	//enum S_IRWXU = 0;
19 	//enum S_IRWXG = 0;
20 	//enum S_IRGRP = 0;
21 	//enum S_IRWXO = 0;
22 	//enum S_IROTH = 0;
23 } else {
24 	/* File type and permission flags for stat() */
25 	/**
26 	 * File type mask
27 	 */
28 	alias S_IFMT = core.sys.windows.stat.S_IFMT;
29 
30 	/**
31 	 * Directory
32 	 */
33 	alias S_IFDIR = core.sys.windows.stat.S_IFDIR;
34 
35 	/**
36 	 * Character device
37 	 */
38 	alias S_IFCHR = core.sys.windows.stat.S_IFCHR;
39 
40 	//#if !defined(S_IFFIFO)
41 		/*
42 		 * Pipe
43 		 */
44 		//alias S_IFFIFO = _S_IFFIFO;
45 	//#endif
46 
47 	/**
48 	 * Regular file
49 	 */
50 	alias S_IFREG = core.sys.windows.stat.S_IFREG;
51 
52 	/**
53 	 * Read permission
54 	 */
55 	alias S_IREAD = core.sys.windows.stat.S_IREAD;
56 
57 	/**
58 	 * Write permission
59 	 */
60 	alias S_IWRITE = core.sys.windows.stat.S_IWRITE;
61 
62 	/**
63 	 * Execute permission
64 	 */
65 	alias S_IEXEC = core.sys.windows.stat.S_IEXEC;
66 
67 	/**
68 	 * Pipe
69 	 */
70 	alias S_IFIFO = core.sys.windows.stat.S_IFIFO;
71 
72 	/**
73 	 * Block device
74 	 */
75 	alias S_IFBLK = core.sys.windows.stat.S_IFBLK;
76 
77 	/**
78 	 * Link
79 	 */
80 	enum S_IFLNK = 0;
81 
82 	/**
83 	 * Socket
84 	 */
85 	enum S_IFSOCK = 0;
86 
87 	version (Windows) {
88 		/**
89 		 * RWX user
90 		 */
91 		enum S_IRWXU = 0;
92 
93 		/**
94 		 * Read user
95 		 */
96 		alias S_IRUSR = libressl_d.compat.stdio.S_IREAD;
97 
98 		/**
99 		 * Write user
100 		 */
101 		alias S_IWUSR = libressl_d.compat.stdio.S_IWRITE;
102 
103 		/**
104 		 * Execute user
105 		 */
106 		enum S_IXUSR = 0;
107 
108 		/**
109 		 * RWX group
110 		 */
111 		enum S_IRWXG = 0;
112 
113 		/**
114 		 * Read group
115 		 */
116 		enum S_IRGRP = 0;
117 
118 		/**
119 		 * Write group
120 		 */
121 		enum S_IWGRP = 0;
122 
123 		/**
124 		 * Execute group
125 		 */
126 		enum S_IXGRP = 0;
127 
128 		/**
129 		 * RWX others
130 		 */
131 		enum S_IRWXO = 0;
132 
133 		/**
134 		 * Read others
135 		 */
136 		enum S_IROTH = 0;
137 
138 		/**
139 		 * Write others
140 		 */
141 		enum S_IWOTH = 0;
142 
143 		/**
144 		 * Execute others
145 		 */
146 		enum S_IXOTH = 0;
147 	}
148 
149 	/* File type flags for d_type */
150 	enum DT_UNKNOWN = 0;
151 	alias DT_REG = .S_IFREG;
152 	alias DT_DIR = .S_IFDIR;
153 	alias DT_FIFO = .S_IFIFO;
154 	alias DT_SOCK = .S_IFSOCK;
155 	alias DT_CHR = .S_IFCHR;
156 	alias DT_BLK = .S_IFBLK;
157 	alias DT_LNK = .S_IFLNK;
158 
159 	/* Macros for converting between st_mode and d_type */
160 	pragma(inline, true)
161 	pure nothrow @safe @nogc @live
162 	int IFTODT(int mode)
163 
164 		do
165 		{
166 			return mode & .S_IFMT;
167 		}
168 
169 	//#define DTTOIF(type) (type)
170 
171 	/*
172 	 * File type macros.  Note that block devices, sockets and links cannot be
173 	 * distinguished on Windows and the macros S_ISBLK, S_ISSOCK and S_ISLNK are
174 	 * only defined for compatibility.  These macros should always return false
175 	 * on Windows.
176 	 */
177 	pragma(inline, true)
178 	pure nothrow @safe @nogc @live
179 	bool S_ISFIFO(int mode)
180 
181 		out(result)
182 		{
183 			assert(!result);
184 		}
185 
186 		do
187 		{
188 			return (mode & .S_IFMT) == .S_IFIFO;
189 		}
190 
191 	pragma(inline, true)
192 	pure nothrow @safe @nogc @live
193 	bool S_ISDIR(int mode)
194 
195 		out(result)
196 		{
197 			assert(!result);
198 		}
199 
200 		do
201 		{
202 			return (mode & .S_IFMT) == .S_IFDIR;
203 		}
204 
205 	pragma(inline, true)
206 	pure nothrow @safe @nogc @live
207 	bool S_ISREG(int mode)
208 
209 		out(result)
210 		{
211 			assert(!result);
212 		}
213 
214 		do
215 		{
216 			return (mode & .S_IFMT) == .S_IFREG;
217 		}
218 
219 	pragma(inline, true)
220 	pure nothrow @safe @nogc @live
221 	bool S_ISLNK(int mode)
222 
223 		out(result)
224 		{
225 			assert(!result);
226 		}
227 
228 		do
229 		{
230 			return (mode & .S_IFMT) == .S_IFLNK;
231 		}
232 
233 	pragma(inline, true)
234 	pure nothrow @safe @nogc @live
235 	bool S_ISSOCK(int mode)
236 
237 		out(result)
238 		{
239 			assert(!result);
240 		}
241 
242 		do
243 		{
244 			return (mode & .S_IFMT) == .S_IFSOCK;
245 		}
246 
247 	pragma(inline, true)
248 	pure nothrow @safe @nogc @live
249 	bool S_ISCHR(int mode)
250 
251 		out(result)
252 		{
253 			assert(!result);
254 		}
255 
256 		do
257 		{
258 			return (mode & .S_IFMT) == .S_IFCHR;
259 		}
260 
261 	pragma(inline, true)
262 	pure nothrow @safe @nogc @live
263 	bool S_ISBLK(int mode)
264 
265 		out(result)
266 		{
267 			assert(!result);
268 		}
269 
270 		do
271 		{
272 			return (mode & .S_IFMT) == .S_IFBLK;
273 		}
274 }