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