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