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