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 version (X86_64)
783 {
784 enum
785 {
786 O_DIRECTORY = 0x010000, // octal 0200000
787 O_NOFOLLOW = 0x020000, // octal 0400000
788 O_DIRECT = 0x004000, // octal 040000
789 O_LARGEFILE = 0,
790 O_TMPFILE = 0x410000, // octal 020200000
791
792 F_GETLK = 5,
793 F_SETLK = 6,
794 F_SETLKW = 7,
795 }
796 }
797 // Note: Definitions for i386 are in arch/generic/bits/fcntl.h
798 else version (X86)
799 {
800 enum
801 {
802 O_DIRECTORY = 0x010000, // octal 0200000
803 O_NOFOLLOW = 0x020000, // octal 0400000
804 O_DIRECT = 0x004000, // octal 040000
805 O_LARGEFILE = 0x008000, // octal 0100000
806 O_TMPFILE = 0x410000, // octal 020200000
807
808 F_GETLK = 12,
809 F_SETLK = 13,
810 F_SETLKW = 14,
811 }
812 }
813 else version (ARM)
814 {
815 enum
816 {
817 O_DIRECTORY = 0x004000, // octal 040000
818 O_NOFOLLOW = 0x008000, // octal 0100000
819 O_DIRECT = 0x010000, // octal 0200000
820 O_LARGEFILE = 0x020000, // octal 0400000
821 O_TMPFILE = 0x404000, // octal 020040000
822
823 F_GETLK = 12,
824 F_SETLK = 13,
825 F_SETLKW = 14,
826 }
827 }
828 else version (AArch64)
829 {
830 enum
831 {
832 O_DIRECTORY = 0x004000, // octal 040000
833 O_NOFOLLOW = 0x008000, // octal 0100000
834 O_DIRECT = 0x010000, // octal 0200000
835 O_LARGEFILE = 0x020000, // octal 0400000
836 O_TMPFILE = 0x404000, // octal 020040000
837
838 F_GETLK = 5,
839 F_SETLK = 6,
840 F_SETLKW = 7,
841 }
842 }
843 else version (SystemZ)
844 {
845 enum
846 {
847 O_DIRECTORY = 0x010000, // octal 0200000
848 O_NOFOLLOW = 0x020000, // octal 0400000
849 O_DIRECT = 0x004000, // octal 040000
850 O_LARGEFILE = 0x008000, // octal 0100000
851 O_TMPFILE = 0x410000, // octal 020200000
852
853 F_GETLK = 5,
854 F_SETLK = 6,
855 F_SETLKW = 7,
856 }
857 }
858 else version (PPC64)
859 {
860 enum
861 {
862 O_DIRECTORY = 0x004000, // octal 040000
863 O_NOFOLLOW = 0x008000, // octal 0100000
864 O_DIRECT = 0x020000, // octal 0400000
865 O_LARGEFILE = 0x010000, // octal 0200000
866 O_TMPFILE = 0x410000, // octal 020200000
867
868 F_GETLK = 5,
869 F_SETLK = 6,
870 F_SETLKW = 7,
871 }
872 }
873 else
874 static assert(0, "Platform not supported");
875
876 enum
877 {
878 O_CREAT = 0x40, // octal 0100
879 O_EXCL = 0x80, // octal 0200
880 O_NOCTTY = 0x100, // octal 0400
881 O_TRUNC = 0x200, // octal 01000
882
883 O_APPEND = 0x400, // octal 02000
884 O_NONBLOCK = 0x800, // octal 04000
885 O_DSYNC = 0x1000, // octal 010000
886 O_SYNC = 0x101000, // octal 04010000
887 O_RSYNC = O_SYNC,
888 O_CLOEXEC = 0x80000,
889
890 O_ASYNC = 0x2000,
891 O_NOATIME = 0x40000,
892 O_PATH = 0x200000,
893 O_NDELAY = O_NONBLOCK,
894 O_SEARCH = O_PATH,
895 O_EXEC = O_PATH,
896
897 O_ACCMODE = (03|O_SEARCH),
898 O_RDONLY = 00,
899 O_WRONLY = 01,
900 O_RDWR = 02,
901 }
902 enum
903 {
904 F_DUPFD = 0,
905 F_GETFD = 1,
906 F_SETFD = 2,
907 F_GETFL = 3,
908 F_SETFL = 4,
909 // F_GETLK, F_SETLK, F_SETLKW are arch-specific
910 F_SETOWN = 8,
911 F_GETOWN = 9,
912 }
913 enum
914 {
915 F_RDLCK = 0,
916 F_WRLCK = 1,
917 F_UNLCK = 2,
918 }
919 struct flock
920 {
921 short l_type;
922 short l_whence;
923 off_t l_start;
924 off_t l_len;
925 pid_t l_pid;
926 }
927 enum FD_CLOEXEC = 1;
928 int open(in char*, int, ...);
929
930 enum AT_FDCWD = -100;
931 }
932 else version (CRuntime_UClibc)
933 {
934 enum F_DUPFD = 0;
935 enum F_GETFD = 1;
936 enum F_SETFD = 2;
937 enum F_GETFL = 3;
938 enum F_SETFL = 4;
939
940 version (X86_64)
941 {
942 enum F_GETLK = 5;
943 enum F_SETLK = 6;
944 enum F_SETLKW = 7;
945 }
946 else static if (__USE_FILE_OFFSET64)
947 {
948 enum F_GETLK = 5;
949 enum F_SETLK = 6;
950 enum F_SETLKW = 7;
951 }
952 else
953 {
954 enum F_GETLK = 12;
955 enum F_SETLK = 13;
956 enum F_SETLKW = 14;
957 }
958
959 enum F_GETOWN = 9;
960 enum F_SETOWN = 8;
961
962 enum FD_CLOEXEC = 1;
963
964 enum F_RDLCK = 0;
965 enum F_UNLCK = 2;
966 enum F_WRLCK = 1;
967
968 version (X86_Any)
969 {
970 enum O_CREAT = 0x40; // octal 0100
971 enum O_EXCL = 0x80; // octal 0200
972 enum O_NOCTTY = 0x100; // octal 0400
973 enum O_TRUNC = 0x200; // octal 01000
974
975 enum O_APPEND = 0x400; // octal 02000
976 enum O_NONBLOCK = 0x800; // octal 04000
977 enum O_CLOEXEC = 0x80000; // octal 02000000
978 enum O_SYNC = 0x1000; // octal 010000
979 enum O_NDELAY = O_NONBLOCK;
980 enum O_FSYNC = O_SYNC;
981 enum O_ASYNC = 0x2000; // octal 020000
982 }
983 else version (MIPS_Any)
984 {
985 enum O_CREAT = 0x0100;
986 enum O_EXCL = 0x0400;
987 enum O_NOCTTY = 0x0800;
988 enum O_TRUNC = 0x0200;
989
990 enum O_APPEND = 0x0008;
991 enum O_SYNC = 0x0010;
992 enum O_NONBLOCK = 0x0080;
993 enum O_CLOEXEC = 0x80000; // octal 02000000
994 enum O_NDELAY = O_NONBLOCK;
995 enum O_FSYNC = O_SYNC;
996 enum O_ASYNC = 0x1000;
997 }
998 else version (ARM_Any)
999 {
1000 enum O_CREAT = 0x40; // octal 0100
1001 enum O_EXCL = 0x80; // octal 0200
1002 enum O_NOCTTY = 0x100; // octal 0400
1003 enum O_TRUNC = 0x200; // octal 01000
1004
1005 enum O_APPEND = 0x400; // octal 02000
1006 enum O_NONBLOCK = 0x800; // octal 04000
1007 enum O_CLOEXEC = 0x80000; // octal 02000000
1008 enum O_SYNC = 0x1000; // octal 010000
1009 enum O_NDELAY = O_NONBLOCK;
1010 enum O_FSYNC = O_SYNC;
1011 enum O_ASYNC = 0x2000; // octal 020000
1012 }
1013 else
1014 static assert(0, "unimplemented");
1015
1016 enum O_ACCMODE = 0x3;
1017 enum O_RDONLY = 0x0;
1018 enum O_WRONLY = 0x1;
1019 enum O_RDWR = 0x2;
1020
1021 struct flock
1022 {
1023 short l_type;
1024 short l_whence;
1025 static if (__USE_FILE_OFFSET64)
1026 {
1027 off64_t l_start;
1028 off64_t l_len;
1029 }
1030 else
1031 {
1032 off_t l_start;
1033 off_t l_len;
1034 }
1035 pid_t l_pid;
1036 }
1037
1038 static if ( __USE_FILE_OFFSET64 )
1039 {
1040 int creat64(in char*, mode_t);
1041 alias creat64 creat;
1042
1043 int open64(in char*, int, ...);
1044 alias open64 open;
1045 }
1046 else
1047 {
1048 int creat(in char*, mode_t);
1049 int open(in char*, int, ...);
1050 }
1051
1052 enum AT_SYMLINK_NOFOLLOW = 0x100;
1053 enum AT_FDCWD = -100;
1054 }
1055 else
1056 {
1057 static assert(false, "Unsupported platform");
1058 }
1059
1060 //int creat(in char*, mode_t);
1061 int fcntl(int, int, ...);
1062 //int open(in char*, int, ...);
1063
1064 // Generic Posix fallocate
1065 int posix_fallocate(int, off_t, off_t);
1066
1067 //
1068 // Advisory Information (ADV)
1069 //
1070 /*
1071 POSIX_FADV_NORMAL
1072 POSIX_FADV_SEQUENTIAL
1073 POSIX_FADV_RANDOM
1074 POSIX_FADV_WILLNEED
1075 POSIX_FADV_DONTNEED
1076 POSIX_FADV_NOREUSE
1077
1078 int posix_fadvise(int, off_t, off_t, int);
1079 */
1080