The OpenD Programming Language

1 /**
2  * D header file for POSIX.
3  *
4  * Copyright: Copyright Sean Kelly 2005 - 2009.
5  * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6  * Authors:   Sean Kelly, Alex Rønne Petersen
7  * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8  */
9 
10 /*          Copyright Sean Kelly 2005 - 2009.
11  * Distributed under the Boost Software License, Version 1.0.
12  *    (See accompanying file LICENSE or copy at
13  *          http://www.boost.org/LICENSE_1_0.txt)
14  */
15 module core.sys.posix.fcntl;
16 
17 import core.sys.posix.config;
18 import core.stdc.stdint;
19 public import core.sys.posix.sys.types; // for off_t, mode_t
20 public import core.sys.posix.sys.stat;  // for S_IFMT, etc.
21 
22 version (OSX)
23     version = Darwin;
24 else version (iOS)
25     version = Darwin;
26 else version (TVOS)
27     version = Darwin;
28 else version (WatchOS)
29     version = Darwin;
30 
31 version (ARM)     version = ARM_Any;
32 version (AArch64) version = ARM_Any;
33 version (HPPA)    version = HPPA_Any;
34 version (MIPS32)  version = MIPS_Any;
35 version (MIPS64)  version = MIPS_Any;
36 version (PPC)     version = PPC_Any;
37 version (PPC64)   version = PPC_Any;
38 version (RISCV32) version = RISCV_Any;
39 version (RISCV64) version = RISCV_Any;
40 version (S390)    version = IBMZ_Any;
41 version (SPARC)   version = SPARC_Any;
42 version (SPARC64) version = SPARC_Any;
43 version (SystemZ) version = IBMZ_Any;
44 version (X86)     version = X86_Any;
45 version (X86_64)  version = X86_Any;
46 
47 version (Posix):
48 extern (C):
49 
50 nothrow:
51 @nogc:
52 
53 //
54 // Required
55 //
56 /*
57 F_DUPFD
58 F_GETFD
59 F_SETFD
60 F_GETFL
61 F_SETFL
62 F_GETLK
63 F_SETLK
64 F_SETLKW
65 F_GETOWN
66 F_SETOWN
67 
68 FD_CLOEXEC
69 
70 F_RDLCK
71 F_UNLCK
72 F_WRLCK
73 
74 O_CREAT
75 O_EXCL
76 O_NOCTTY
77 O_TRUNC
78 
79 O_APPEND
80 O_DSYNC
81 O_NONBLOCK
82 O_RSYNC
83 O_SYNC
84 
85 O_ACCMODE
86 O_RDONLY
87 O_RDWR
88 O_WRONLY
89 
90 struct flock
91 {
92     short   l_type;
93     short   l_whence;
94     off_t   l_start;
95     off_t   l_len;
96     pid_t   l_pid;
97 }
98 */
99 version (linux)
100 {
101     enum F_DUPFD        = 0;
102     enum F_GETFD        = 1;
103     enum F_SETFD        = 2;
104     enum F_GETFL        = 3;
105     enum F_SETFL        = 4;
106   version (X86_64)
107   {
108     static assert(off_t.sizeof == 8);
109     enum F_GETLK        = 5;
110     enum F_SETLK        = 6;
111     enum F_SETLKW       = 7;
112   }
113   else version (AArch64)
114   {
115     enum F_GETLK        = 5;
116     enum F_SETLK        = 6;
117     enum F_SETLKW       = 7;
118   }
119   else version (PPC64)
120   {
121     enum F_GETLK        = 5;
122     enum F_SETLK        = 6;
123     enum F_SETLKW       = 7;
124   }
125   else version (RISCV64)
126   {
127     enum F_GETLK        = 5;
128     enum F_SETLK        = 6;
129     enum F_SETLKW       = 7;
130   }
131   else version (SystemZ)
132   {
133     static assert(off_t.sizeof == 8);
134     enum F_GETLK        = 5;
135     enum F_SETLK        = 6;
136     enum F_SETLKW       = 7;
137   }
138   else version (MIPS_N64)
139   {
140     enum F_GETLK        = 14;
141     enum F_SETLK        = 6;
142     enum F_SETLKW       = 7;
143   }
144   else version (MIPS_Any)
145   {
146     version (CRuntime_Musl)
147     {
148         enum F_GETLK      = 14;
149         enum F_SETLK      = 6;
150         enum F_SETLKW     = 7;
151     }
152     else
153     {
154         static if ( __USE_FILE_OFFSET64 )
155         {
156             enum F_GETLK      = 33;
157             enum F_SETLK      = 34;
158             enum F_SETLKW     = 35;
159         }
160         else
161         {
162             enum F_GETLK      = 14;
163             enum F_SETLK      = 6;
164             enum F_SETLKW     = 7;
165         }
166     }
167   }
168   else version (LoongArch64)
169   {
170     static assert(off_t.sizeof == 8);
171     enum F_GETLK        = 5;
172     enum F_SETLK        = 6;
173     enum F_SETLKW       = 7;
174   } else
175   static if ( __USE_FILE_OFFSET64 )
176   {
177     enum F_GETLK        = 12;
178     enum F_SETLK        = 13;
179     enum F_SETLKW       = 14;
180   }
181   else
182   {
183     enum F_GETLK        = 5;
184     enum F_SETLK        = 6;
185     enum F_SETLKW       = 7;
186   }
187     enum F_GETOWN       = 9;
188     enum F_SETOWN       = 8;
189 
190     enum FD_CLOEXEC     = 1;
191 
192     enum F_RDLCK        = 0;
193     enum F_UNLCK        = 2;
194     enum F_WRLCK        = 1;
195 
196     version (X86_Any)
197     {
198         enum O_CREAT        = 0x40;     // octal     0100
199         enum O_EXCL         = 0x80;     // octal     0200
200         enum O_NOCTTY       = 0x100;    // octal     0400
201         enum O_TRUNC        = 0x200;    // octal    01000
202 
203         enum O_APPEND       = 0x400;    // octal    02000
204         enum O_NONBLOCK     = 0x800;    // octal    04000
205         enum O_CLOEXEC      = 0x80000;  // octal 02000000
206         enum O_SYNC         = 0x101000; // octal 04010000
207         enum O_DSYNC        = 0x1000;   // octal   010000
208         enum O_RSYNC        = O_SYNC;
209 
210         enum O_DIRECTORY    = 0x010000; // octal   0200000
211         enum O_NOFOLLOW     = 0x020000; // octal   0400000
212         enum O_DIRECT       = 0x004000; // octal    040000
213         version (X86_64)
214             enum O_LARGEFILE = 0;
215         else
216             enum O_LARGEFILE = 0x08000; // octal   0100000
217         enum O_TMPFILE      = 0x410000; // octal 020200000
218         enum O_ASYNC        = 0x2000;   // octal    020000
219         enum O_NOATIME      = 0x40000;  // octal  01000000
220         enum O_PATH         = 0x200000; // octal 010000000
221         enum O_NDELAY       = O_NONBLOCK;
222     }
223     else version (HPPA_Any)
224     {
225         enum O_CREAT        = 0x00100;  // octal    04000
226         enum O_EXCL         = 0x00400;  // octal     0200
227         enum O_NOCTTY       = 0x20000;  // octal     0400
228         enum O_TRUNC        = 0x00200;  // octal    01000
229 
230         enum O_APPEND       = 0x00008;  // octal      010
231         enum O_NONBLOCK     = 0x10004;  // octal  0200004
232         enum O_CLOEXEC      = 0x200000; // octal 02000000
233         enum O_SYNC         = 0x48000;  // octal 01100000
234         enum O_DSYNC        = 0x40000;  // octal 01000000
235         enum O_RSYNC        = 0x80000;  // octal 02000000
236 
237         enum O_DIRECTORY    = 0x001000; // octal 000010000
238         enum O_NOFOLLOW     = 0x000080; // octal 000000200
239         enum O_DIRECT       = 0x004000; // octal    040000
240         enum O_LARGEFILE    = 0x000800; // octal  00004000
241         enum O_TMPFILE      = 0x801000; // octal 040010000
242         enum O_ASYNC        = 0x2000;   // octal    020000
243         enum O_NOATIME      = 0x100000; // octal 004000000
244         enum O_PATH         = 0x400000; // octal 020000000
245         enum O_NDELAY       = O_NONBLOCK;
246     }
247     else version (MIPS_Any)
248     {
249         enum O_CREAT        = 0x0100;
250         enum O_EXCL         = 0x0400;
251         enum O_NOCTTY       = 0x0800;
252         enum O_TRUNC        = 0x0200;
253 
254         enum O_APPEND       = 0x0008;
255         enum O_DSYNC        = 0x0010;
256         enum O_NONBLOCK     = 0x0080;
257         enum O_CLOEXEC      = 0x80000;
258         enum O_RSYNC        = O_SYNC;
259         enum O_SYNC         = 0x4010;
260 
261         enum O_DIRECTORY    = 0x010000;
262         enum O_NOFOLLOW     = 0x020000;
263         enum O_DIRECT       = 0x8000;
264         version (MIPS_N64)
265             enum O_LARGEFILE = 0;
266         else
267             enum O_LARGEFILE = 0x2000;
268         enum O_TMPFILE      = 0x410000;
269         enum O_ASYNC        = 0x1000;
270         enum O_NOATIME      = 0x40000;
271         enum O_PATH         = 0x200000;
272         enum O_NDELAY       = O_NONBLOCK;
273     }
274     else version (PPC_Any)
275     {
276         enum O_CREAT        = 0x40;     // octal     0100
277         enum O_EXCL         = 0x80;     // octal     0200
278         enum O_NOCTTY       = 0x100;    // octal     0400
279         enum O_TRUNC        = 0x200;    // octal    01000
280 
281         enum O_APPEND       = 0x400;    // octal    02000
282         enum O_NONBLOCK     = 0x800;    // octal    04000
283         enum O_CLOEXEC      = 0x80000;  // octal 02000000
284         enum O_SYNC         = 0x101000; // octal 04010000
285         enum O_DSYNC        = 0x1000;   // octal   010000
286         enum O_RSYNC        = O_SYNC;
287 
288         enum O_DIRECTORY    = 0x004000; // octal    040000
289         enum O_NOFOLLOW     = 0x008000; // octal   0100000
290         enum O_DIRECT       = 0x020000; // octal   0400000
291         version (D_LP64)
292             enum O_LARGEFILE = 0;
293         else
294             enum O_LARGEFILE = 0x10000; // octal   0200000
295         enum O_TMPFILE      = 0x404000; // octal 020040000
296         enum O_ASYNC        = 0x2000;   // octal    020000
297         enum O_NOATIME      = 0x40000;  // octal  01000000
298         enum O_PATH         = 0x200000;
299         enum O_NDELAY       = O_NONBLOCK;
300     }
301     else version (ARM_Any)
302     {
303         enum O_CREAT        = 0x40;     // octal     0100
304         enum O_EXCL         = 0x80;     // octal     0200
305         enum O_NOCTTY       = 0x100;    // octal     0400
306         enum O_TRUNC        = 0x200;    // octal    01000
307 
308         enum O_APPEND       = 0x400;    // octal    02000
309         enum O_NONBLOCK     = 0x800;    // octal    04000
310         enum O_CLOEXEC      = 0x80000;  // octal 02000000
311         enum O_SYNC         = 0x101000; // octal 04010000
312         enum O_DSYNC        = 0x1000;   // octal   010000
313         enum O_RSYNC        = O_SYNC;
314 
315         enum O_DIRECTORY    = 0x004000; // octal    040000
316         enum O_NOFOLLOW     = 0x008000; // octal   0100000
317         enum O_DIRECT       = 0x010000; // octal   0200000
318         version (D_LP64)
319             enum O_LARGEFILE = 0;
320         else
321             enum O_LARGEFILE = 0x20000; // octal   0400000
322         enum O_TMPFILE      = 0x404000; // octal 020040000
323         enum O_ASYNC        = 0x2000;   // octal    020000
324         enum O_NOATIME      = 0x40000;  // octal  01000000
325         enum O_PATH         = 0x200000; // octal 010000000
326         enum O_NDELAY       = O_NONBLOCK;
327     }
328     else version (RISCV_Any)
329     {
330         enum O_CREAT        = 0x40;     // octal     0100
331         enum O_EXCL         = 0x80;     // octal     0200
332         enum O_NOCTTY       = 0x100;    // octal     0400
333         enum O_TRUNC        = 0x200;    // octal    01000
334 
335         enum O_APPEND       = 0x400;    // octal    02000
336         enum O_NONBLOCK     = 0x800;    // octal    04000
337         enum O_CLOEXEC      = 0x80000;  // octal 02000000
338         enum O_SYNC         = 0x101000; // octal 04010000
339         enum O_DSYNC        = 0x1000;   // octal   010000
340         enum O_RSYNC        = O_SYNC;
341 
342         enum O_DIRECTORY    = 0x010000;
343         enum O_NOFOLLOW     = 0x020000;
344         enum O_DIRECT       = 0x004000;
345         version (D_LP64)
346             enum O_LARGEFILE = 0;
347         else
348             enum O_LARGEFILE = 0x8000;
349         enum O_TMPFILE      = 0x410000;
350         enum O_ASYNC        = 0x2000;
351         enum O_NOATIME      = 0x40000;
352         enum O_PATH         = 0x200000;
353         enum O_NDELAY       = O_NONBLOCK;
354     }
355     else version (SPARC_Any)
356     {
357         enum O_CREAT        = 0x200;
358         enum O_EXCL         = 0x800;
359         enum O_NOCTTY       = 0x8000;
360         enum O_TRUNC        = 0x400;
361 
362         enum O_APPEND       = 0x8;
363         enum O_NONBLOCK     = 0x4000;
364         enum O_CLOEXEC      = 0x400000;
365         enum O_SYNC         = 0x802000;
366         enum O_DSYNC        = 0x2000;
367         enum O_RSYNC        = O_SYNC;
368 
369         enum O_DIRECTORY    = 0x10000;
370         enum O_NOFOLLOW     = 0x20000;
371         enum O_DIRECT       = 0x100000;
372         version (D_LP64)
373             enum O_LARGEFILE = 0;
374         else
375             enum O_LARGEFILE = 0x40000;
376         enum O_TMPFILE      = 0x2010000;
377         enum O_ASYNC        = 0x0040;
378         enum O_NOATIME      = 0x200000;
379         enum O_PATH         = 0x1000000;
380         enum O_NDELAY       = (0x0004|O_NONBLOCK);
381     }
382     else version (IBMZ_Any)
383     {
384         enum O_CREAT        = 0x40;     // octal     0100
385         enum O_EXCL         = 0x80;     // octal     0200
386         enum O_NOCTTY       = 0x100;    // octal     0400
387         enum O_TRUNC        = 0x200;    // octal    01000
388 
389         enum O_APPEND       = 0x400;    // octal    02000
390         enum O_NONBLOCK     = 0x800;    // octal    04000
391         enum O_CLOEXEC      = 0x80000;  // octal 02000000
392         enum O_SYNC         = 0x101000; // octal 04010000
393         enum O_DSYNC        = 0x1000;   // octal   010000
394         enum O_RSYNC        = O_SYNC;
395 
396         enum O_DIRECTORY    = 0x010000; // octal   0200000
397         enum O_NOFOLLOW     = 0x020000; // octal   0400000
398         enum O_DIRECT       = 0x004000; // octal    040000
399         version (D_LP64)
400             enum O_LARGEFILE = 0;
401         else
402             enum O_LARGEFILE = 0x08000; // octal   0100000
403         enum O_TMPFILE      = 0x410000; // octal 020200000
404         enum O_ASYNC        = 0x2000;   // octal    020000
405         enum O_NOATIME      = 0x40000;  // octal  01000000
406         enum O_PATH         = 0x200000; // octal 010000000
407         enum O_NDELAY       = O_NONBLOCK;
408     }
409     else version (LoongArch64)
410     {
411         enum O_CREAT        = 0x40;     // octal     0100
412         enum O_EXCL         = 0x80;     // octal     0200
413         enum O_NOCTTY       = 0x100;    // octal     0400
414         enum O_TRUNC        = 0x200;    // octal    01000
415 
416         enum O_APPEND       = 0x400;    // octal    02000
417         enum O_NONBLOCK     = 0x800;    // octal    04000
418         enum O_CLOEXEC      = 0x80000;  // octal 02000000
419         enum O_SYNC         = 0x101000; // octal 04010000
420         enum O_DSYNC        = 0x1000;   // octal   010000
421         enum O_RSYNC        = O_SYNC;
422 
423         enum O_DIRECTORY    = 0x010000; // octal    200000
424         enum O_NOFOLLOW     = 0x020000; // octal    400000
425         enum O_DIRECT       = 0x004000; // octal    040000
426         version (D_LP64)
427             enum O_LARGEFILE = 0;
428         else
429             enum O_LARGEFILE = 0x8000;  // octal   0100000
430         enum O_TMPFILE      = 0x404000; // octal 020040000
431         enum O_ASYNC        = 0x2000;   // octal    020000
432         enum O_NOATIME      = 0x40000;  // octal  01000000
433         enum O_PATH         = 0x200000; // octal 010000000
434         enum O_NDELAY       = O_NONBLOCK;
435     }
436     else version (WebAssembly)
437     {
438 	// FIXME: numbers might be wrong
439         enum O_CREAT        = 0x40;     // octal     0100
440         enum O_EXCL         = 0x80;     // octal     0200
441         enum O_NOCTTY       = 0x100;    // octal     0400
442         enum O_TRUNC        = 0x200;    // octal    01000
443 
444         enum O_APPEND       = 0x400;    // octal    02000
445         enum O_NONBLOCK     = 0x800;    // octal    04000
446         enum O_CLOEXEC      = 0x80000;  // octal 02000000
447         enum O_SYNC         = 0x101000; // octal 04010000
448         enum O_DSYNC        = 0x1000;   // octal   010000
449         enum O_RSYNC        = O_SYNC;
450 
451         enum O_DIRECTORY    = 0x010000; // octal   0200000
452         enum O_NOFOLLOW     = 0x020000; // octal   0400000
453         enum O_DIRECT       = 0x004000; // octal    040000
454         version (X86_64)
455             enum O_LARGEFILE = 0;
456         else
457             enum O_LARGEFILE = 0x08000; // octal   0100000
458         enum O_TMPFILE      = 0x410000; // octal 020200000
459         enum O_ASYNC        = 0x2000;   // octal    020000
460         enum O_NOATIME      = 0x40000;  // octal  01000000
461         enum O_PATH         = 0x200000; // octal 010000000
462         enum O_NDELAY       = O_NONBLOCK;
463 
464     }
465     else
466         static assert(0, "unimplemented");
467 
468     version (CRuntime_Musl)
469     {
470         enum O_SEARCH   = O_PATH;
471         enum O_EXEC     = O_PATH;
472         enum O_ACCMODE  = (3|O_SEARCH);
473     }
474     else
475     {
476         enum O_ACCMODE  = 0x3;
477     }
478     enum O_RDONLY       = 0x0;
479     enum O_WRONLY       = 0x1;
480     enum O_RDWR         = 0x2;
481 
482     struct flock
483     {
484         short   l_type;
485         short   l_whence;
486         off_t   l_start;
487         off_t   l_len;
488         pid_t   l_pid;
489     }
490 
491     enum AT_SYMLINK_NOFOLLOW = 0x100;
492     enum AT_FDCWD = -100;
493     enum AT_REMOVEDIR = 0x200;
494     enum AT_SYMLINK_FOLLOW = 0x400;
495     enum AT_EACCESS = 0x200;
496 }
497 else version (Darwin)
498 {
499     enum F_DUPFD        = 0;
500     enum F_GETFD        = 1;
501     enum F_SETFD        = 2;
502     enum F_GETFL        = 3;
503     enum F_SETFL        = 4;
504     enum F_GETOWN       = 5;
505     enum F_SETOWN       = 6;
506     enum F_GETLK        = 7;
507     enum F_SETLK        = 8;
508     enum F_SETLKW       = 9;
509 
510     enum FD_CLOEXEC     = 1;
511 
512     enum F_RDLCK        = 1;
513     enum F_UNLCK        = 2;
514     enum F_WRLCK        = 3;
515 
516     enum O_CREAT        = 0x0200;
517     enum O_EXCL         = 0x0800;
518     enum O_NOCTTY       = 0;
519     enum O_TRUNC        = 0x0400;
520 
521     enum O_RDONLY       = 0x0000;
522     enum O_WRONLY       = 0x0001;
523     enum O_RDWR         = 0x0002;
524     enum O_ACCMODE      = 0x0003;
525 
526     enum O_NONBLOCK     = 0x0004;
527     enum O_APPEND       = 0x0008;
528     enum O_SYNC         = 0x0080;
529     //enum O_DSYNC
530     //enum O_RSYNC
531 
532     struct flock
533     {
534         off_t   l_start;
535         off_t   l_len;
536         pid_t   l_pid;
537         short   l_type;
538         short   l_whence;
539     }
540 }
541 else version (FreeBSD)
542 {
543     enum F_DUPFD        = 0;
544     enum F_GETFD        = 1;
545     enum F_SETFD        = 2;
546     enum F_GETFL        = 3;
547     enum F_SETFL        = 4;
548     enum F_GETOWN       = 5;
549     enum F_SETOWN       = 6;
550     enum F_GETLK        = 11;
551     enum F_SETLK        = 12;
552     enum F_SETLKW       = 13;
553     enum F_OGETLK       = 7;
554     enum F_OSETLK       = 8;
555     enum F_OSETLKW      = 9;
556     enum F_DUP2FD       = 10;
557 
558     enum FD_CLOEXEC     = 1;
559 
560     enum F_RDLCK        = 1;
561     enum F_UNLCK        = 2;
562     enum F_WRLCK        = 3;
563 
564     enum O_CREAT        = 0x0200;
565     enum O_EXCL         = 0x0800;
566     enum O_NOCTTY       = 0x8000;
567     enum O_TRUNC        = 0x0400;
568 
569     enum O_RDONLY       = 0x0000;
570     enum O_WRONLY       = 0x0001;
571     enum O_RDWR         = 0x0002;
572     enum O_ACCMODE      = 0x0003;
573 
574     enum O_NONBLOCK     = 0x0004;
575     enum O_APPEND       = 0x0008;
576     enum O_SYNC         = 0x0080;
577     //enum O_DSYNC
578     //enum O_RSYNC
579 
580     struct flock
581     {
582         off_t   l_start;
583         off_t   l_len;
584         pid_t   l_pid;
585         short   l_type;
586         short   l_whence;
587         int     l_sysid;
588     }
589 
590     struct oflock
591     {
592         off_t   l_start;
593         off_t   l_len;
594         pid_t   l_pid;
595         short   l_type;
596         short   l_whence;
597     }
598 
599     enum AT_SYMLINK_NOFOLLOW = 0x200;
600     enum AT_FDCWD = -100;
601 }
602 else version (OpenBSD)
603 {
604     enum F_DUPFD        = 0;
605     enum F_GETFD        = 1;
606     enum F_SETFD        = 2;
607     enum F_GETFL        = 3;
608     enum F_SETFL        = 4;
609     enum F_GETOWN       = 5;
610     enum F_SETOWN       = 6;
611     enum F_GETLK        = 7;
612     enum F_SETLK        = 8;
613     enum F_SETLKW       = 9;
614     enum F_DUPFD_CLOEXEC= 10;
615     enum F_ISATTY       = 11;
616 
617     enum FD_CLOEXEC     = 1;
618 
619     enum F_RDLCK        = 1;
620     enum F_UNLCK        = 2;
621     enum F_WRLCK        = 3;
622 
623     enum O_CREAT        = 0x0200;
624     enum O_EXCL         = 0x0800;
625     enum O_NOCTTY       = 0x8000;
626     enum O_TRUNC        = 0x0400;
627 
628     enum O_RDONLY       = 0x0000;
629     enum O_WRONLY       = 0x0001;
630     enum O_RDWR         = 0x0002;
631     enum O_ACCMODE      = 0x0003;
632     enum O_SHLOCK       = 0x0010;
633     enum O_EXLOCK       = 0x0020;
634     enum O_ASYNC        = 0x0040;
635     enum O_FSYNC        = 0x0080;
636     enum O_NOFOLLOW     = 0x0100;
637 
638     enum O_NONBLOCK     = 0x0004;
639     enum O_APPEND       = 0x0008;
640     enum O_SYNC         = 0x0080;
641     enum O_DSYNC        = O_SYNC;
642     enum O_RSYNC        = O_SYNC;
643 
644     enum O_CLOEXEC      = 0x10000;
645     enum O_DIRECTORY    = 0x20000;
646 
647     enum LOCK_SH        = 0x01;
648     enum LOCK_EX        = 0x02;
649     enum LOCK_NB        = 0x04;
650     enum LOCK_UN        = 0x08;
651 
652     struct flock
653     {
654         off_t   l_start;
655         off_t   l_len;
656         pid_t   l_pid;
657         short   l_type;
658         short   l_whence;
659     }
660 
661     enum AT_FDCWD            = -100;
662 
663     enum AT_EACCESS          = 0x01;
664     enum AT_SYMLINK_NOFOLLOW = 0x02;
665     enum AT_SYMLINK_FOLLOW   = 0x04;
666     enum AT_REMOVEDIR        = 0x08;
667 }
668 else version (NetBSD)
669 {
670     enum F_DUPFD        = 0;
671     enum F_GETFD        = 1;
672     enum F_SETFD        = 2;
673     enum F_GETFL        = 3;
674     enum F_SETFL        = 4;
675     enum F_GETOWN       = 5;
676     enum F_SETOWN       = 6;
677     enum F_GETLK        = 7;
678     enum F_SETLK        = 8;
679     enum F_SETLKW       = 9;
680     enum F_CLOSEM       = 10;
681     enum F_MAXFD        = 11;
682     enum F_DUPFD_CLOEXEC= 12;
683     enum F_GETNOSIGPIPE = 13;
684     enum F_SETNOSIGPIPE = 14;
685 
686     enum FD_CLOEXEC     = 1;
687 
688     enum F_RDLCK        = 1;
689     enum F_UNLCK        = 2;
690     enum F_WRLCK        = 3;
691 
692     enum O_CREAT        = 0x0200;
693     enum O_EXCL         = 0x0800;
694     enum O_NOCTTY       = 0x8000;
695     enum O_TRUNC        = 0x0400;
696 
697     enum O_RDONLY       = 0x0000;
698     enum O_WRONLY       = 0x0001;
699     enum O_RDWR         = 0x0002;
700     enum O_ACCMODE      = 0x0003;
701 
702     enum O_NONBLOCK     = 0x0004;
703     enum O_APPEND       = 0x0008;
704     enum O_SYNC         = 0x0080;
705     //enum O_DSYNC
706     //enum O_RSYNC
707 
708     struct flock
709     {
710         off_t   l_start;
711         off_t   l_len;
712         pid_t   l_pid;
713         short   l_type;
714         short   l_whence;
715     }
716 }
717 else version (DragonFlyBSD)
718 {
719     enum O_RDONLY       = 0x0000;
720     enum O_WRONLY       = 0x0001;
721     enum O_RDWR         = 0x0002;
722     enum O_ACCMODE      = 0x0003;
723 
724     enum FREAD          = 0x0001;
725     enum FWRITE         = 0x0002;
726     enum O_NONBLOCK     = 0x0000004;
727     enum O_APPEND       = 0x0000008;
728     enum O_SHLOCK       = 0x0000010;
729     enum O_EXLOCK       = 0x0000020;
730     enum O_ASYNC        = 0x0000040;
731     enum O_FSYNC        = 0x0000080;
732     enum O_SYNC         = 0x0000080;
733     enum O_NOFOLLOW     = 0x0000100;
734     enum O_CREAT        = 0x0000200;
735     enum O_TRUNC        = 0x0000400;
736     enum O_EXCL         = 0x0000800;
737     enum O_NOCTTY       = 0x0008000;
738     enum O_DIRECT       = 0x0010000;
739     enum O_CLOEXEC      = 0x0020000;
740     enum O_FBLOCKING    = 0x0040000;
741     enum O_FNONBLOCKING = 0x0080000;
742     enum O_FAPPEND      = 0x0100000;
743     enum O_FOFFSET      = 0x0200000;
744     enum O_FSYNCWRITE   = 0x0400000;
745     enum O_FASYNCWRITE  = 0x0800000;
746     enum O_DIRECTORY    = 0x8000000;
747 
748     enum FAPPEND        = O_APPEND;
749     enum FASYNC         = O_ASYNC;
750     enum FFSYNC         = O_FSYNC;
751     enum FNONBLOCK      = O_NONBLOCK;
752     enum FNDELAY        = O_NONBLOCK;
753     enum O_NDELAY       = O_NONBLOCK;
754     enum FPOSIXSHM      = O_NOFOLLOW;
755 
756     enum FCNTLFLAGS = (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|FPOSIXSHM|O_DIRECT);
757 
758     enum F_DUPFD        = 0;
759     enum F_GETFD        = 1;
760     enum F_SETFD        = 2;
761     enum F_GETFL        = 3;
762     enum F_SETFL        = 4;
763     enum F_GETOWN       = 5;
764     enum F_SETOWN       = 6;
765     enum F_GETLK        = 7;
766 //    enum F_SETLK        = 8;
767     enum F_SETLK        = 8;
768     enum F_SETLKW       = 9;
769     enum F_OGETLK       = F_GETLK;
770     enum F_OSETLK       = F_SETLK;
771     enum F_OSETLKW      = F_SETLKW;
772     enum F_DUP2FD       = 10;
773     //enum F_GETLK        = 11;
774     //enum F_SETLK        = 12;
775     //enum F_SETLKW       = 13;
776     enum F_DUPFD_CLOEXEC = 17;
777     enum F_DUP2FD_CLOEXEC = 18;
778 
779     enum FD_CLOEXEC     = 1;
780 
781     enum F_RDLCK        = 1;
782     enum F_UNLCK        = 2;
783     enum F_WRLCK        = 3;
784 
785     enum LOCK_SH        = 0x01;
786     enum LOCK_EX        = 0x02;
787     enum LOCK_NB        = 0x04;
788     enum LOCK_UN        = 0x08;
789 
790     struct flock
791     {
792         off_t   l_start;
793         off_t   l_len;
794         pid_t   l_pid;
795         short   l_type;
796         short   l_whence;
797     }
798 
799     alias oflock = flock;
800 }
801 else version (Solaris)
802 {
803     enum F_DUPFD = 0;
804     enum F_GETFD = 1;
805     enum F_SETFD = 2;
806     enum F_GETFL = 3;
807     enum F_SETFL = 4;
808 
809     version (D_LP64)
810     {
811         enum F_GETLK = 14;
812         enum F_SETLK = 6;
813         enum F_SETLKW = 7;
814     }
815     else
816     {
817         static if (__USE_FILE_OFFSET64)
818         {
819             enum F_GETLK = 14;
820             enum F_SETLK = 6;
821             enum F_SETLKW = 7;
822         }
823         else
824         {
825             enum F_GETLK = 33;
826             enum F_SETLK = 34;
827             enum F_SETLKW = 35;
828         }
829     }
830 
831     enum F_GETOWN = 23;
832     enum F_SETOWN = 24;
833 
834     enum FD_CLOEXEC = 1;
835 
836     enum F_RDLCK = 1;
837     enum F_UNLCK = 3;
838     enum F_WRLCK = 2;
839     enum F_UNCKSYS = 4;
840 
841     enum O_CREAT = 0x0100;
842     enum O_EXCL = 0x0400;
843     enum O_NOCTTY = 0x0800;
844     enum O_TRUNC = 0x0200;
845 
846     enum O_APPEND = 0x0008;
847     enum O_NONBLOCK = 0x0080;
848     enum O_SYNC = 0x0010;
849     enum O_DSYNC = 0x0040;
850     enum O_RSYNC = 0x8000;
851 
852     enum O_ACCMODE = (O_SEARCH | O_EXEC | 0x3);
853     enum O_RDONLY = 0;
854     enum O_WRONLY = 1;
855     enum O_RDWR = 2;
856     enum O_SEARCH = 0x200000;
857     enum O_EXEC = 0x400000;
858 
859     struct flock
860     {
861         short l_type;
862         short l_whence;
863         off_t l_start;
864         off_t l_len;
865         int l_sysid;
866         pid_t l_pid;
867         c_long[4] l_pad;
868     }
869 
870     static if (__USE_LARGEFILE64)
871     {
872         struct flock64
873         {
874             short       l_type;
875             short       l_whence;
876             off64_t     l_start;
877             off64_t     l_len;
878             int         l_sysid;
879             pid_t       l_pid;
880             c_long[4]   l_pad;
881         }
882     }
883 }
884 else
885 {
886     static assert(false, "Unsupported platform");
887 }
888 
889 /*
890 int creat(const scope char*, mode_t);
891 int fcntl(int, int, ...);
892 int open(const scope char*, int, ...);
893 */
894 version (CRuntime_Glibc)
895 {
896     static if ( __USE_FILE_OFFSET64 )
897     {
898         int   creat64(const scope char*, mode_t);
899         alias creat64 creat;
900 
901         int   open64(const scope char*, int, ...);
902         alias open64 open;
903     }
904     else
905     {
906         int   creat(const scope char*, mode_t);
907         int   open(const scope char*, int, ...);
908     }
909 }
910 else version (Darwin)
911 {
912     int creat(const scope char*, mode_t);
913     int open(const scope char*, int, ...);
914 }
915 else version (FreeBSD)
916 {
917     int creat(const scope char*, mode_t);
918     int open(const scope char*, int, ...);
919 }
920 else version (OpenBSD)
921 {
922     int creat(const scope char*, mode_t);
923     int open(const scope char*, int, ...);
924 }
925 else version (NetBSD)
926 {
927     int creat(const scope char*, mode_t);
928     int open(const scope char*, int, ...);
929 }
930 else version (DragonFlyBSD)
931 {
932     int creat(const scope char*, mode_t);
933     int open(const scope char*, int, ...);
934 }
935 else version (Solaris)
936 {
937     version (D_LP64)
938     {
939         int creat(const scope char*, mode_t);
940         int open(const scope char*, int, ...);
941 
942         static if (__USE_LARGEFILE64)
943         {
944             alias creat creat64;
945             alias open open64;
946         }
947     }
948     else
949     {
950         static if (__USE_LARGEFILE64)
951         {
952             int creat64(const scope char*, mode_t);
953             alias creat64 creat;
954 
955             int open64(const scope char*, int, ...);
956             alias open64 open;
957         }
958         else
959         {
960             int creat(const scope char*, mode_t);
961             int open(const scope char*, int, ...);
962         }
963     }
964 }
965 else version (CRuntime_Bionic)
966 {
967     int   creat(const scope char*, mode_t);
968     int   open(const scope char*, int, ...);
969 }
970 else version (CRuntime_Musl)
971 {
972     int open(const scope char*, int, ...);
973 }
974 else version (CRuntime_UClibc)
975 {
976     static if ( __USE_FILE_OFFSET64 )
977     {
978         int   creat64(const scope char*, mode_t);
979         alias creat64 creat;
980 
981         int   open64(const scope char*, int, ...);
982         alias open64 open;
983     }
984     else
985     {
986         int   creat(const scope char*, mode_t);
987         int   open(const scope char*, int, ...);
988     }
989 }
990 else
991 {
992     static assert(false, "Unsupported platform");
993 }
994 
995 //int creat(const scope char*, mode_t);
996 int fcntl(int, int, ...);
997 //int open(const scope char*, int, ...);
998 
999 // Generic Posix fallocate
1000 int posix_fallocate(int, off_t, off_t);
1001 
1002 //
1003 // Advisory Information (ADV)
1004 //
1005 /*
1006 POSIX_FADV_NORMAL
1007 POSIX_FADV_SEQUENTIAL
1008 POSIX_FADV_RANDOM
1009 POSIX_FADV_WILLNEED
1010 POSIX_FADV_DONTNEED
1011 POSIX_FADV_NOREUSE
1012 
1013 int posix_fadvise(int, off_t, off_t, int);
1014 */