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