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