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 */