2 * D header file for POSIX.
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
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)
15 module core.sys.posix.sys.stat;
17 private import core.sys.posix.config;
18 private import core.stdc.stdint;
19 private import core.sys.posix.time; // for timespec
20 public import core.sys.posix.sys.types; // for off_t, mode_t
28 else version (WatchOS)
32 extern (C) nothrow @nogc:
80 int chmod(in char*, mode_t);
81 int fchmod(int, mode_t);
82 int fstat(int, stat*);
83 int lstat(in char*, stat*);
84 int mkdir(in char*, mode_t);
85 int mkfifo(in char*, mode_t);
86 int stat(in char*, stat*);
90 version (CRuntime_Glibc)
98 static if (!__USE_FILE_OFFSET64)
113 blksize_t st_blksize;
115 static if (__USE_MISC || __USE_XOPEN2K8)
122 @property ref time_t st_atime() { return st_atim.tv_sec; }
123 @property ref time_t st_mtime() { return st_mtim.tv_sec; }
124 @property ref time_t st_ctime() { return st_ctim.tv_sec; }
130 ulong_t st_atimensec;
132 ulong_t st_mtimensec;
134 ulong_t st_ctimensec;
136 static if (__USE_FILE_OFFSET64)
147 else version (X86_64)
160 blksize_t st_blksize;
162 static if (__USE_MISC || __USE_XOPEN2K8)
169 @property ref time_t st_atime() { return st_atim.tv_sec; }
170 @property ref time_t st_mtime() { return st_mtim.tv_sec; }
171 @property ref time_t st_ctime() { return st_ctim.tv_sec; }
177 ulong_t st_atimensec;
179 ulong_t st_mtimensec;
181 ulong_t st_ctimensec;
186 else version (MIPS_O32)
198 static if (!__USE_FILE_OFFSET64)
209 static if (__USE_MISC || __USE_XOPEN2K8)
216 @property ref time_t st_atime() { return st_atim.tv_sec; }
217 @property ref time_t st_mtime() { return st_mtim.tv_sec; }
218 @property ref time_t st_ctime() { return st_ctim.tv_sec; }
224 c_ulong st_atimensec;
226 c_ulong st_mtimensec;
228 c_ulong st_ctimensec;
230 blksize_t st_blksize;
231 static if (!__USE_FILE_OFFSET64)
243 else version (MIPS64)
249 static if (!__USE_FILE_OFFSET64)
262 static if (!__USE_FILE_OFFSET64)
273 static if (__USE_MISC || __USE_XOPEN2K8)
280 @property ref time_t st_atime() { return st_atim.tv_sec; }
281 @property ref time_t st_mtime() { return st_mtim.tv_sec; }
282 @property ref time_t st_ctime() { return st_ctim.tv_sec; }
288 c_ulong st_atimensec;
290 c_ulong st_mtimensec;
292 c_ulong st_ctimensec;
294 blksize_t st_blksize;
296 static if (!__USE_FILE_OFFSET64)
322 c_ulong st_atime_nsec;
324 c_ulong st_mtime_nsec;
326 c_ulong st_ctime_nsec;
346 c_ulong st_atime_nsec;
348 c_ulong st_mtime_nsec;
350 c_ulong st_ctime_nsec;
360 alias __dev_t = ulong;
361 alias __ino_t = c_ulong;
362 alias __ino64_t = ulong;
363 alias __mode_t = uint;
364 alias __nlink_t = size_t;
365 alias __uid_t = uint;
366 alias __gid_t = uint;
367 alias __off_t = c_long;
368 alias __off64_t = long;
369 alias __blksize_t = c_long;
370 alias __blkcnt_t = c_long;
371 alias __blkcnt64_t = long;
372 alias __timespec = timespec;
373 alias __time_t = time_t;
380 static if (!__USE_FILE_OFFSET64)
395 static if (!__USE_FILE_OFFSET64)
403 __blksize_t st_blksize;
405 static if (!__USE_FILE_OFFSET64)
407 __blkcnt_t st_blocks;
411 __blkcnt64_t st_blocks;
414 static if ( __USE_MISC || __USE_XOPEN2K8)
421 @property ref time_t st_atime() { return st_atim.tv_sec; }
422 @property ref time_t st_mtime() { return st_mtim.tv_sec; }
423 @property ref time_t st_ctime() { return st_ctim.tv_sec; }
429 c_ulong st_atimensec;
431 c_ulong st_mtimensec;
433 c_ulong st_ctimensec;
436 static if (!__USE_FILE_OFFSET64)
446 static if (__USE_FILE_OFFSET64)
447 static assert(stat_t.sizeof == 104);
449 static assert(stat_t.sizeof == 88);
451 else version (AArch64)
455 alias __dev_t = ulong;
456 alias __ino_t = c_ulong;
457 alias __ino64_t = ulong;
458 alias __mode_t = uint;
459 alias __nlink_t = uint;
460 alias __uid_t = uint;
461 alias __gid_t = uint;
462 alias __off_t = c_long;
463 alias __off64_t = long;
464 alias __blksize_t = int;
465 alias __blkcnt_t = c_long;
466 alias __blkcnt64_t = long;
467 alias __timespec = timespec;
468 alias __time_t = time_t;
474 static if (!__USE_FILE_OFFSET64)
489 static if (!__USE_FILE_OFFSET64)
497 __blksize_t st_blksize;
500 static if (!__USE_FILE_OFFSET64)
502 __blkcnt_t st_blocks;
506 __blkcnt64_t st_blocks;
509 static if (__USE_MISC)
516 @property ref time_t st_atime() { return st_atim.tv_sec; }
517 @property ref time_t st_mtime() { return st_mtim.tv_sec; }
518 @property ref time_t st_ctime() { return st_ctim.tv_sec; }
524 c_ulong st_atimensec;
526 c_ulong st_mtimensec;
528 c_ulong st_ctimensec;
532 static if (__USE_FILE_OFFSET64)
533 static assert(stat_t.sizeof == 128);
535 static assert(stat_t.sizeof == 128);
537 else version (SPARC64)
541 alias __dev_t = ulong;
542 alias __ino_t = c_ulong;
543 alias __ino64_t = ulong;
544 alias __mode_t = uint;
545 alias __nlink_t = uint;
546 alias __uid_t = uint;
547 alias __gid_t = uint;
548 alias __off_t = c_long;
549 alias __off64_t = long;
550 alias __blksize_t = c_long;
551 alias __blkcnt_t = c_long;
552 alias __blkcnt64_t = long;
553 alias __timespec = timespec;
554 alias __time_t = time_t;
568 static if (!__USE_FILE_OFFSET64)
576 __blksize_t st_blksize;
578 static if (!__USE_FILE_OFFSET64)
580 __blkcnt_t st_blocks;
584 __blkcnt64_t st_blocks;
587 static if (__USE_XOPEN2K8)
594 @property ref time_t st_atime() { return st_atim.tv_sec; }
595 @property ref time_t st_mtime() { return st_mtim.tv_sec; }
596 @property ref time_t st_ctime() { return st_ctim.tv_sec; }
602 c_ulong st_atimensec;
604 c_ulong st_mtimensec;
606 c_ulong st_ctimensec;
612 static assert(stat_t.sizeof == 144);
614 else version (SystemZ)
618 alias __dev_t = ulong;
619 alias __ino_t = c_ulong;
620 alias __ino64_t = ulong;
621 alias __mode_t = uint;
622 alias __nlink_t = uint;
623 alias __uid_t = uint;
624 alias __gid_t = uint;
625 alias __off_t = c_long;
626 alias __off64_t = long;
627 alias __blksize_t = int;
628 alias __blkcnt_t = c_long;
629 alias __blkcnt64_t = long;
630 alias __timespec = timespec;
631 alias __time_t = time_t;
641 int __glibc_reserved0;
644 static if (__USE_XOPEN2K8)
651 @property ref time_t st_atime() { return st_atim.tv_sec; }
652 @property ref time_t st_mtime() { return st_mtim.tv_sec; }
653 @property ref time_t st_ctime() { return st_ctim.tv_sec; }
659 c_ulong st_atimensec;
661 c_ulong st_mtimensec;
663 c_ulong st_ctimensec;
665 __blksize_t st_blksize;
666 __blkcnt_t st_blocks;
667 c_long[3] __glibc_reserved;
669 static if (__USE_XOPEN2K8)
670 static assert(stat_t.sizeof == 144);
672 static assert(stat_t.sizeof == 144);
675 static assert(0, "unimplemented");
677 enum S_IRUSR = 0x100; // octal 0400
678 enum S_IWUSR = 0x080; // octal 0200
679 enum S_IXUSR = 0x040; // octal 0100
680 enum S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR;
682 enum S_IRGRP = S_IRUSR >> 3;
683 enum S_IWGRP = S_IWUSR >> 3;
684 enum S_IXGRP = S_IXUSR >> 3;
685 enum S_IRWXG = S_IRWXU >> 3;
687 enum S_IROTH = S_IRGRP >> 3;
688 enum S_IWOTH = S_IWGRP >> 3;
689 enum S_IXOTH = S_IXGRP >> 3;
690 enum S_IRWXO = S_IRWXG >> 3;
692 enum S_ISUID = 0x800; // octal 04000
693 enum S_ISGID = 0x400; // octal 02000
694 enum S_ISVTX = 0x200; // octal 01000
698 extern (D) bool S_ISTYPE( mode_t mode, uint mask )
700 return ( mode & S_IFMT ) == mask;
704 extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); }
705 extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); }
706 extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); }
707 extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); }
708 extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); }
709 extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); }
710 extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
712 static if ( true /*__USE_POSIX199309*/ )
714 extern bool S_TYPEISMQ( stat_t* buf ) { return false; }
715 extern bool S_TYPEISSEM( stat_t* buf ) { return false; }
716 extern bool S_TYPEISSHM( stat_t* buf ) { return false; }
719 enum UTIME_NOW = 0x3fffffff;
720 enum UTIME_OMIT = 0x3ffffffe;
722 int utimensat(int dirfd, const char *pathname,
723 ref const(timespec)[2] times, int flags);
724 int futimens(int fd, ref const(timespec)[2] times);
726 else version (Darwin)
728 // _DARWIN_FEATURE_64_BIT_INODE stat is default for Mac OSX >10.5 and is
729 // only meaningful type for other OS X/Darwin variants (e.g. iOS).
730 // man stat(2) gives details.
744 timespec st_atimespec;
745 timespec st_mtimespec;
746 timespec st_ctimespec;
747 timespec st_birthtimespec;
758 c_long st_birthtimensec;
763 blksize_t st_blksize;
770 enum S_IRUSR = 0x100; // octal 0400
771 enum S_IWUSR = 0x080; // octal 0200
772 enum S_IXUSR = 0x040; // octal 0100
773 enum S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR;
775 enum S_IRGRP = S_IRUSR >> 3;
776 enum S_IWGRP = S_IWUSR >> 3;
777 enum S_IXGRP = S_IXUSR >> 3;
778 enum S_IRWXG = S_IRWXU >> 3;
780 enum S_IROTH = S_IRGRP >> 3;
781 enum S_IWOTH = S_IWGRP >> 3;
782 enum S_IXOTH = S_IXGRP >> 3;
783 enum S_IRWXO = S_IRWXG >> 3;
785 enum S_ISUID = 0x800; // octal 04000
786 enum S_ISGID = 0x400; // octal 02000
787 enum S_ISVTX = 0x200; // octal 01000
791 extern (D) bool S_ISTYPE( mode_t mode, uint mask )
793 return ( mode & S_IFMT ) == mask;
797 extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); }
798 extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); }
799 extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); }
800 extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); }
801 extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); }
802 extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); }
803 extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
805 else version (FreeBSD)
807 // https://github.com/freebsd/freebsd/blob/master/sys/sys/stat.h
820 c_long __st_atimensec;
822 c_long __st_mtimensec;
824 c_long __st_ctimensec;
828 blksize_t st_blksize;
834 c_long st_birthtimensec;
836 ubyte[16 - timespec.sizeof] padding;
839 enum S_IRUSR = 0x100; // octal 0000400
840 enum S_IWUSR = 0x080; // octal 0000200
841 enum S_IXUSR = 0x040; // octal 0000100
842 enum S_IRWXU = 0x1C0; // octal 0000700
844 enum S_IRGRP = 0x020; // octal 0000040
845 enum S_IWGRP = 0x010; // octal 0000020
846 enum S_IXGRP = 0x008; // octal 0000010
847 enum S_IRWXG = 0x038; // octal 0000070
849 enum S_IROTH = 0x4; // 0000004
850 enum S_IWOTH = 0x2; // 0000002
851 enum S_IXOTH = 0x1; // 0000001
852 enum S_IRWXO = 0x7; // 0000007
854 enum S_ISUID = 0x800; // octal 0004000
855 enum S_ISGID = 0x400; // octal 0002000
856 enum S_ISVTX = 0x200; // octal 0001000
860 extern (D) bool S_ISTYPE( mode_t mode, uint mask )
862 return ( mode & S_IFMT ) == mask;
866 extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); }
867 extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); }
868 extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); }
869 extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); }
870 extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); }
871 extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); }
872 extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
875 enum UTIME_OMIT = -2;
880 int utimensat(int dirfd, const char *pathname,
881 ref const(timespec)[2] times, int flags);
882 int futimens(int fd, ref const(timespec)[2] times);
885 else version (NetBSD)
889 dev_t st_dev; /* inode's device */
890 mode_t st_mode; /* inode protection mode */
891 ino_t st_ino; /* inode's number */
892 nlink_t st_nlink; /* number of hard links */
893 uid_t st_uid; /* user ID of the file's owner */
894 gid_t st_gid; /* group ID of the file's group */
895 dev_t st_rdev; /* device type */
896 time_t st_atime; /* time of last access */
897 long st_atimensec; /* nsec of last access */
898 time_t st_mtime; /* time of last data modification */
899 long st_mtimensec; /* nsec of last data modification */
900 time_t st_ctime; /* time of last file status change */
901 long st_ctimensec; /* nsec of last file status change */
902 time_t st_birthtime; /* time of creation */
903 long st_birthtimensec; /* nsec of time of creation */
904 off_t st_size; /* file size, in bytes */
905 blkcnt_t st_blocks; /* blocks allocated for file */
906 blksize_t st_blksize; /* optimal blocksize for I/O */
907 uint32_t st_flags; /* user defined flags for file */
908 uint32_t st_gen; /* file generation number */
909 uint32_t[2] st_spare;
912 enum S_IRUSR = 0x100; // octal 0000400
913 enum S_IWUSR = 0x080; // octal 0000200
914 enum S_IXUSR = 0x040; // octal 0000100
915 enum S_IRWXU = 0x1C0; // octal 0000700
917 enum S_IRGRP = 0x020; // octal 0000040
918 enum S_IWGRP = 0x010; // octal 0000020
919 enum S_IXGRP = 0x008; // octal 0000010
920 enum S_IRWXG = 0x038; // octal 0000070
922 enum S_IROTH = 0x4; // 0000004
923 enum S_IWOTH = 0x2; // 0000002
924 enum S_IXOTH = 0x1; // 0000001
925 enum S_IRWXO = 0x7; // 0000007
927 enum S_ISUID = 0x800; // octal 0004000
928 enum S_ISGID = 0x400; // octal 0002000
929 enum S_ISVTX = 0x200; // octal 0001000
933 extern (D) bool S_ISTYPE( mode_t mode, uint mask )
935 return ( mode & S_IFMT ) == mask;
939 extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); }
940 extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); }
941 extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); }
942 extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); }
943 extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); }
944 extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); }
945 extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
947 else version (DragonFlyBSD)
950 ino_t st_ino; /* inode's number */
951 nlink_t st_nlink; /* number of hard links */
952 dev_t st_dev; /* inode's device */
953 mode_t st_mode; /* inode protection mode */
954 uint16_t st_padding1;
955 uid_t st_uid; /* user ID of the file's owner */
956 gid_t st_gid; /* group ID of the file's group */
957 dev_t st_rdev; /* device type */
959 c_long __st_atimensec;
961 c_long __st_mtimensec;
963 c_long __st_ctimensec;
964 off_t st_size; /* file size, in bytes */
965 int64_t st_blocks; /* blocks allocated for file */
966 uint32_t st_blksize; /* optimal blocksize for I/O */
967 uint32_t st_flags; /* user defined flags for file */
968 uint32_t st_gen; /* file generation number */
970 int64_t st_qspare1; /* was recursive change detect */
974 enum S_IRUSR = 0x100; // octal 0000400
975 enum S_IWUSR = 0x080; // octal 0000200
976 enum S_IXUSR = 0x040; // octal 0000100
977 enum S_IRWXU = 0x1C0; // octal 0000700
979 enum S_IRGRP = 0x020; // octal 0000040
980 enum S_IWGRP = 0x010; // octal 0000020
981 enum S_IXGRP = 0x008; // octal 0000010
982 enum S_IRWXG = 0x038; // octal 0000070
984 enum S_IROTH = 0x4; // 0000004
985 enum S_IWOTH = 0x2; // 0000002
986 enum S_IXOTH = 0x1; // 0000001
987 enum S_IRWXO = 0x7; // 0000007
989 enum S_ISUID = 0x800; // octal 0004000
990 enum S_ISGID = 0x400; // octal 0002000
991 enum S_ISVTX = 0x200; // octal 0001000
995 extern (D) bool S_ISTYPE( mode_t mode, uint mask )
997 return ( mode & S_IFMT ) == mask;
1001 extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); }
1002 extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); }
1003 extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); }
1004 extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); }
1005 extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); }
1006 extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); }
1007 extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
1009 else version (Solaris)
1011 private enum _ST_FSTYPSZ = 16;
1027 timestruc_t st_atim;
1032 timestruc_t st_mtim;
1037 timestruc_t st_ctim;
1040 blksize_t st_blksize;
1042 char[_ST_FSTYPSZ] st_fstype;
1045 static if (__USE_LARGEFILE64) alias stat_t stat64_t;
1064 timestruc_t st_atim;
1069 timestruc_t st_mtim;
1074 timestruc_t st_ctim;
1077 blksize_t st_blksize;
1079 char[_ST_FSTYPSZ] st_fstype;
1098 timestruc_t st_atim;
1103 timestruc_t st_mtim;
1108 timestruc_t st_ctim;
1111 blksize_t st_blksize;
1112 blkcnt64_t st_blocks;
1113 char[_ST_FSTYPSZ] st_fstype;
1117 static if (__USE_FILE_OFFSET64)
1118 alias stat64_t stat_t;
1120 alias stat32_t stat_t;
1124 enum S_IRUSR = 0x100;
1125 enum S_IWUSR = 0x080;
1126 enum S_IXUSR = 0x040;
1127 enum S_IRWXU = 0x1C0;
1129 enum S_IRGRP = 0x020;
1130 enum S_IWGRP = 0x010;
1131 enum S_IXGRP = 0x008;
1132 enum S_IRWXG = 0x038;
1134 enum S_IROTH = 0x4; // 0000004
1135 enum S_IWOTH = 0x2; // 0000002
1136 enum S_IXOTH = 0x1; // 0000001
1137 enum S_IRWXO = 0x7; // 0000007
1139 enum S_ISUID = 0x800;
1140 enum S_ISGID = 0x400;
1141 enum S_ISVTX = 0x200;
1145 extern (D) bool S_ISTYPE(mode_t mode, uint mask)
1147 return (mode & S_IFMT) == mask;
1151 extern (D) bool S_ISBLK(mode_t mode) { return S_ISTYPE(mode, S_IFBLK); }
1152 extern (D) bool S_ISCHR(mode_t mode) { return S_ISTYPE(mode, S_IFCHR); }
1153 extern (D) bool S_ISDIR(mode_t mode) { return S_ISTYPE(mode, S_IFDIR); }
1154 extern (D) bool S_ISFIFO(mode_t mode) { return S_ISTYPE(mode, S_IFIFO); }
1155 extern (D) bool S_ISREG(mode_t mode) { return S_ISTYPE(mode, S_IFREG); }
1156 extern (D) bool S_ISLNK(mode_t mode) { return S_ISTYPE(mode, S_IFLNK); }
1157 extern (D) bool S_ISSOCK(mode_t mode) { return S_ISTYPE(mode, S_IFSOCK); }
1158 extern (D) bool S_ISDOOR(mode_t mode) { return S_ISTYPE(mode, S_IFDOOR); }
1159 extern (D) bool S_ISPORT(mode_t mode) { return S_ISTYPE(mode, S_IFPORT); }
1161 else version (CRuntime_Bionic)
1181 c_ulong st_atime_nsec;
1183 c_ulong st_mtime_nsec;
1185 c_ulong st_ctime_nsec;
1207 c_ulong st_atime_nsec;
1209 c_ulong st_mtime_nsec;
1211 c_ulong st_ctime_nsec;
1215 else version (AArch64)
1233 ulong st_atime_nsec;
1235 ulong st_mtime_nsec;
1237 ulong st_ctime_nsec;
1244 static assert(false, "Architecture not supported.");
1247 enum S_IRUSR = 0x100; // octal 0000400
1248 enum S_IWUSR = 0x080; // octal 0000200
1249 enum S_IXUSR = 0x040; // octal 0000100
1250 enum S_IRWXU = 0x1C0; // octal 0000700
1252 enum S_IRGRP = 0x020; // octal 0000040
1253 enum S_IWGRP = 0x010; // octal 0000020
1254 enum S_IXGRP = 0x008; // octal 0000010
1255 enum S_IRWXG = 0x038; // octal 0000070
1257 enum S_IROTH = 0x4; // 0000004
1258 enum S_IWOTH = 0x2; // 0000002
1259 enum S_IXOTH = 0x1; // 0000001
1260 enum S_IRWXO = 0x7; // 0000007
1262 enum S_ISUID = 0x800; // octal 0004000
1263 enum S_ISGID = 0x400; // octal 0002000
1264 enum S_ISVTX = 0x200; // octal 0001000
1268 extern (D) bool S_ISTYPE( uint mode, uint mask )
1270 return ( mode & S_IFMT ) == mask;
1274 extern (D) bool S_ISBLK( uint mode ) { return S_ISTYPE( mode, S_IFBLK ); }
1275 extern (D) bool S_ISCHR( uint mode ) { return S_ISTYPE( mode, S_IFCHR ); }
1276 extern (D) bool S_ISDIR( uint mode ) { return S_ISTYPE( mode, S_IFDIR ); }
1277 extern (D) bool S_ISFIFO( uint mode ) { return S_ISTYPE( mode, S_IFIFO ); }
1278 extern (D) bool S_ISREG( uint mode ) { return S_ISTYPE( mode, S_IFREG ); }
1279 extern (D) bool S_ISLNK( uint mode ) { return S_ISTYPE( mode, S_IFLNK ); }
1280 extern (D) bool S_ISSOCK( uint mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
1282 // Added since Lollipop
1283 int utimensat(int dirfd, const char *pathname,
1284 ref const(timespec)[2] times, int flags);
1286 else version (CRuntime_Musl)
1288 alias __mode_t = uint;
1290 S_IRUSR = 0x100, // octal 0400
1291 S_IWUSR = 0x080, // octal 0200
1292 S_IXUSR = 0x040, // octal 0100
1293 S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR,
1295 S_IRGRP = S_IRUSR >> 3,
1296 S_IWGRP = S_IWUSR >> 3,
1297 S_IXGRP = S_IXUSR >> 3,
1298 S_IRWXG = S_IRWXU >> 3,
1300 S_IROTH = S_IRGRP >> 3,
1301 S_IWOTH = S_IWGRP >> 3,
1302 S_IXOTH = S_IXGRP >> 3,
1303 S_IRWXO = S_IRWXG >> 3,
1305 S_ISUID = 0x800, // octal 04000
1306 S_ISGID = 0x400, // octal 02000
1307 S_ISVTX = 0x200, // octal 01000
1320 blksize_t st_blksize;
1326 extern(D) @safe @property
1328 ref time_t st_atime() return { return st_atim.tv_sec; }
1329 ref time_t st_mtime() return { return st_mtim.tv_sec; }
1330 ref time_t st_ctime() return { return st_ctim.tv_sec; }
1336 extern (D) bool S_ISTYPE( mode_t mode, uint mask )
1338 return ( mode & S_IFMT ) == mask;
1342 extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); }
1343 extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); }
1344 extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); }
1345 extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); }
1346 extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); }
1347 extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); }
1348 extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
1350 int utimensat(int dirfd, const char *pathname,
1351 ref const(timespec)[2] times, int flags);
1353 else version (CRuntime_UClibc)
1368 blksize_t st_blksize;
1371 ulong_t st_atimensec;
1373 ulong_t st_mtimensec;
1375 ulong_t st_ctimensec;
1376 slong_t[3] __unused;
1379 else version (MIPS_O32)
1391 static if (!__USE_FILE_OFFSET64)
1402 static if (__USE_MISC || __USE_XOPEN2K8)
1409 @property ref time_t st_atime() { return st_atim.tv_sec; }
1410 @property ref time_t st_mtime() { return st_mtim.tv_sec; }
1411 @property ref time_t st_ctime() { return st_ctim.tv_sec; }
1417 c_ulong st_atimensec;
1419 c_ulong st_mtimensec;
1421 c_ulong st_ctimensec;
1423 blksize_t st_blksize;
1424 static if (!__USE_FILE_OFFSET64)
1440 alias __dev_t = ulong;
1441 alias __ino_t = c_ulong;
1442 alias __ino64_t = ulong;
1443 alias __mode_t = uint;
1444 alias __nlink_t = size_t;
1445 alias __uid_t = uint;
1446 alias __gid_t = uint;
1447 alias __off_t = c_long;
1448 alias __off64_t = long;
1449 alias __blksize_t = c_long;
1450 alias __blkcnt_t = c_long;
1451 alias __blkcnt64_t = long;
1452 alias __timespec = timespec;
1453 alias __time_t = time_t;
1460 static if (!__USE_FILE_OFFSET64)
1475 static if (!__USE_FILE_OFFSET64)
1483 __blksize_t st_blksize;
1485 static if (!__USE_FILE_OFFSET64)
1487 __blkcnt_t st_blocks;
1491 __blkcnt64_t st_blocks;
1495 c_ulong st_atimensec;
1497 c_ulong st_mtimensec;
1499 c_ulong st_ctimensec;
1501 static if (!__USE_FILE_OFFSET64)
1511 static if (__USE_FILE_OFFSET64)
1512 static assert(stat_t.sizeof == 104);
1514 static assert(stat_t.sizeof == 88);
1517 static assert(0, "unimplemented");
1519 enum S_IRUSR = 0x100; // octal 0400
1520 enum S_IWUSR = 0x080; // octal 0200
1521 enum S_IXUSR = 0x040; // octal 0100
1522 enum S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR;
1524 enum S_IRGRP = S_IRUSR >> 3;
1525 enum S_IWGRP = S_IWUSR >> 3;
1526 enum S_IXGRP = S_IXUSR >> 3;
1527 enum S_IRWXG = S_IRWXU >> 3;
1529 enum S_IROTH = S_IRGRP >> 3;
1530 enum S_IWOTH = S_IWGRP >> 3;
1531 enum S_IXOTH = S_IXGRP >> 3;
1532 enum S_IRWXO = S_IRWXG >> 3;
1534 enum S_ISUID = 0x800; // octal 04000
1535 enum S_ISGID = 0x400; // octal 02000
1536 enum S_ISVTX = 0x200; // octal 01000
1540 extern (D) bool S_ISTYPE( mode_t mode, uint mask )
1542 return ( mode & S_IFMT ) == mask;
1546 extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); }
1547 extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); }
1548 extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); }
1549 extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); }
1550 extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); }
1551 extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); }
1552 extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); }
1554 static if ( true /*__USE_POSIX199309*/ )
1556 extern bool S_TYPEISMQ( stat_t* buf ) { return false; }
1557 extern bool S_TYPEISSEM( stat_t* buf ) { return false; }
1558 extern bool S_TYPEISSHM( stat_t* buf ) { return false; }
1561 enum UTIME_NOW = 0x3fffffff;
1562 enum UTIME_OMIT = 0x3ffffffe;
1564 int utimensat(int dirfd, const char *pathname,
1565 ref const(timespec)[2] times, int flags);
1566 int futimens(int fd, ref const(timespec)[2] times);
1570 static assert(false, "Unsupported platform");
1573 int chmod(in char*, mode_t);
1574 int fchmod(int, mode_t);
1575 //int fstat(int, stat_t*);
1576 //int lstat(in char*, stat_t*);
1577 int mkdir(in char*, mode_t);
1578 int mkfifo(in char*, mode_t);
1579 //int stat(in char*, stat_t*);
1580 mode_t umask(mode_t);
1582 version (CRuntime_Glibc)
1584 static if ( __USE_LARGEFILE64 )
1586 int fstat64(int, stat_t*) @trusted;
1587 alias fstat64 fstat;
1589 int lstat64(in char*, stat_t*);
1590 alias lstat64 lstat;
1592 int stat64(in char*, stat_t*);
1597 int fstat(int, stat_t*) @trusted;
1598 int lstat(in char*, stat_t*);
1599 int stat(in char*, stat_t*);
1602 else version (Solaris)
1606 int fstat(int, stat_t*) @trusted;
1607 int lstat(in char*, stat_t*);
1608 int stat(in char*, stat_t*);
1610 static if (__USE_LARGEFILE64)
1612 alias fstat fstat64;
1613 alias lstat lstat64;
1619 static if (__USE_LARGEFILE64)
1621 int fstat64(int, stat_t*) @trusted;
1622 alias fstat64 fstat;
1624 int lstat64(in char*, stat_t*);
1625 alias lstat64 lstat;
1627 int stat64(in char*, stat_t*);
1632 int fstat(int, stat_t*) @trusted;
1633 int lstat(in char*, stat_t*);
1634 int stat(in char*, stat_t*);
1638 else version (Darwin)
1640 // OS X maintains backwards compatibility with older binaries using 32-bit
1641 // inode functions by appending $INODE64 to newer 64-bit inode functions.
1644 pragma(mangle, "fstat$INODE64") int fstat(int, stat_t*);
1645 pragma(mangle, "lstat$INODE64") int lstat(in char*, stat_t*);
1646 pragma(mangle, "stat$INODE64") int stat(in char*, stat_t*);
1650 int fstat(int, stat_t*);
1651 int lstat(in char*, stat_t*);
1652 int stat(in char*, stat_t*);
1655 else version (FreeBSD)
1657 int fstat(int, stat_t*);
1658 int lstat(in char*, stat_t*);
1659 int stat(in char*, stat_t*);
1661 else version (NetBSD)
1663 int __fstat50(int, stat_t*);
1664 int __lstat50(in char*, stat_t*);
1665 int __stat50(in char*, stat_t*);
1666 alias __fstat50 fstat;
1667 alias __lstat50 lstat;
1668 alias __stat50 stat;
1670 else version (DragonFlyBSD)
1672 int fstat(int, stat_t*);
1673 int lstat(in char*, stat_t*);
1674 int stat(in char*, stat_t*);
1676 else version (CRuntime_Bionic)
1678 int fstat(int, stat_t*) @trusted;
1679 int lstat(in char*, stat_t*);
1680 int stat(in char*, stat_t*);
1682 else version (CRuntime_Musl)
1684 int stat(in char*, stat_t*);
1685 int fstat(int, stat_t*);
1686 int lstat(in char*, stat_t*);
1688 alias fstat fstat64;
1689 alias lstat lstat64;
1692 else version (CRuntime_UClibc)
1694 static if ( __USE_LARGEFILE64 )
1696 int fstat64(int, stat_t*) @trusted;
1697 alias fstat64 fstat;
1699 int lstat64(in char*, stat_t*);
1700 alias lstat64 lstat;
1702 int stat64(in char*, stat_t*);
1707 int fstat(int, stat_t*) @trusted;
1708 int lstat(in char*, stat_t*);
1709 int stat(in char*, stat_t*);
1714 // Typed Memory Objects (TYM)
1733 int mknod(in 3char*, mode_t, dev_t);
1736 version (CRuntime_Glibc)
1738 enum S_IFMT = 0xF000; // octal 0170000
1739 enum S_IFBLK = 0x6000; // octal 0060000
1740 enum S_IFCHR = 0x2000; // octal 0020000
1741 enum S_IFIFO = 0x1000; // octal 0010000
1742 enum S_IFREG = 0x8000; // octal 0100000
1743 enum S_IFDIR = 0x4000; // octal 0040000
1744 enum S_IFLNK = 0xA000; // octal 0120000
1745 enum S_IFSOCK = 0xC000; // octal 0140000
1747 int mknod(in char*, mode_t, dev_t);
1749 else version (Darwin)
1751 enum S_IFMT = 0xF000; // octal 0170000
1752 enum S_IFBLK = 0x6000; // octal 0060000
1753 enum S_IFCHR = 0x2000; // octal 0020000
1754 enum S_IFIFO = 0x1000; // octal 0010000
1755 enum S_IFREG = 0x8000; // octal 0100000
1756 enum S_IFDIR = 0x4000; // octal 0040000
1757 enum S_IFLNK = 0xA000; // octal 0120000
1758 enum S_IFSOCK = 0xC000; // octal 0140000
1760 int mknod(in char*, mode_t, dev_t);
1762 else version (FreeBSD)
1764 enum S_IFMT = 0xF000; // octal 0170000
1765 enum S_IFBLK = 0x6000; // octal 0060000
1766 enum S_IFCHR = 0x2000; // octal 0020000
1767 enum S_IFIFO = 0x1000; // octal 0010000
1768 enum S_IFREG = 0x8000; // octal 0100000
1769 enum S_IFDIR = 0x4000; // octal 0040000
1770 enum S_IFLNK = 0xA000; // octal 0120000
1771 enum S_IFSOCK = 0xC000; // octal 0140000
1773 int mknod(in char*, mode_t, dev_t);
1775 else version (NetBSD)
1777 enum S_IFMT = 0xF000; // octal 0170000
1778 enum S_IFBLK = 0x6000; // octal 0060000
1779 enum S_IFCHR = 0x2000; // octal 0020000
1780 enum S_IFIFO = 0x1000; // octal 0010000
1781 enum S_IFREG = 0x8000; // octal 0100000
1782 enum S_IFDIR = 0x4000; // octal 0040000
1783 enum S_IFLNK = 0xA000; // octal 0120000
1784 enum S_IFSOCK = 0xC000; // octal 0140000
1786 int mknod(in char*, mode_t, dev_t);
1788 else version (DragonFlyBSD)
1790 enum S_IFMT = 0xF000; // octal 0170000
1791 enum S_IFBLK = 0x6000; // octal 0060000
1792 enum S_IFCHR = 0x2000; // octal 0020000
1793 enum S_IFIFO = 0x1000; // octal 0010000
1794 enum S_IFREG = 0x8000; // octal 0100000
1795 enum S_IFDIR = 0x4000; // octal 0040000
1796 enum S_IFLNK = 0xA000; // octal 0120000
1797 enum S_IFSOCK = 0xC000; // octal 0140000
1799 int mknod(in char*, mode_t, dev_t);
1801 else version (Solaris)
1803 enum S_IFMT = 0xF000;
1804 enum S_IFBLK = 0x6000;
1805 enum S_IFCHR = 0x2000;
1806 enum S_IFIFO = 0x1000;
1807 enum S_IFREG = 0x8000;
1808 enum S_IFDIR = 0x4000;
1809 enum S_IFLNK = 0xA000;
1810 enum S_IFSOCK = 0xC000;
1811 enum S_IFDOOR = 0xD000;
1812 enum S_IFPORT = 0xE000;
1814 int mknod(in char*, mode_t, dev_t);
1816 else version (CRuntime_Bionic)
1818 enum S_IFMT = 0xF000; // octal 0170000
1819 enum S_IFBLK = 0x6000; // octal 0060000
1820 enum S_IFCHR = 0x2000; // octal 0020000
1821 enum S_IFIFO = 0x1000; // octal 0010000
1822 enum S_IFREG = 0x8000; // octal 0100000
1823 enum S_IFDIR = 0x4000; // octal 0040000
1824 enum S_IFLNK = 0xA000; // octal 0120000
1825 enum S_IFSOCK = 0xC000; // octal 0140000
1827 int mknod(in char*, mode_t, dev_t);
1829 else version (CRuntime_Musl)
1832 S_IFMT = 0xF000, // octal 0170000
1833 S_IFBLK = 0x6000, // octal 0060000
1834 S_IFCHR = 0x2000, // octal 0020000
1835 S_IFIFO = 0x1000, // octal 0010000
1836 S_IFREG = 0x8000, // octal 0100000
1837 S_IFDIR = 0x4000, // octal 0040000
1838 S_IFLNK = 0xA000, // octal 0120000
1839 S_IFSOCK = 0xC000, // octal 0140000
1842 int mknod(in char*, mode_t, dev_t);
1844 else version (CRuntime_UClibc)
1846 enum S_IFMT = 0xF000; // octal 0170000
1847 enum S_IFBLK = 0x6000; // octal 0060000
1848 enum S_IFCHR = 0x2000; // octal 0020000
1849 enum S_IFIFO = 0x1000; // octal 0010000
1850 enum S_IFREG = 0x8000; // octal 0100000
1851 enum S_IFDIR = 0x4000; // octal 0040000
1852 enum S_IFLNK = 0xA000; // octal 0120000
1853 enum S_IFSOCK = 0xC000; // octal 0140000
1855 int mknod(in char*, mode_t, dev_t);
1859 static assert(false, "Unsupported platform");