| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531 | /** * D header file for POSIX. * * Copyright: Public Domain * License: Public Domain * Authors: Sean Kelly * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition */ module tango.stdc.posix.sys.stat; private import tango.stdc.posix.config; private import tango.stdc.stdint; private import tango.stdc.posix.time; // for timespec public import tango.stdc.stddef; // for size_t public import tango.stdc.posix.sys.types; // for off_t, mode_t private import tango.core.Octal; extern (C): // // Required // /* struct stat { dev_t st_dev; ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; off_t st_size; time_t st_atime; time_t st_mtime; time_t st_ctime; } S_IRWXU S_IRUSR S_IWUSR S_IXUSR S_IRWXG S_IRGRP S_IWGRP S_IXGRP S_IRWXO S_IROTH S_IWOTH S_IXOTH S_ISUID S_ISGID S_ISVTX S_ISBLK(m) S_ISCHR(m) S_ISDIR(m) S_ISFIFO(m) S_ISREG(m) S_ISLNK(m) S_ISSOCK(m) S_TYPEISMQ(buf) S_TYPEISSEM(buf) S_TYPEISSHM(buf) int chmod(in char*, mode_t); int fchmod(int, mode_t); int fstat(int, stat*); int lstat(in char*, stat*); int mkdir(in char*, mode_t); int mkfifo(in char*, mode_t); int stat(in char*, stat*); mode_t umask(mode_t); */ version( linux ) { static if( __USE_LARGEFILE64 ) { private alias uint _pad_t; } else { private alias ushort _pad_t; } align (4) struct stat_t { dev_t st_dev; /* Device. */ version (X86_64) {} else { _pad_t __pad1; } static if( __USE_LARGEFILE64 ) { ino_t __st_ino; /* 32bit file serial number. */ } else { ino_t st_ino; /* File serial number. */ } version (X86_64) { nlink_t st_nlink; mode_t st_mode; } else { mode_t st_mode; /* File mode. */ nlink_t st_nlink; /* Link count. */ } uid_t st_uid; /* User ID of the file's owner. */ gid_t st_gid; /* Group ID of the file's group.*/ version (X86_64) { int pad0; dev_t st_rdev; } else { dev_t st_rdev; /* Device number, if device. */ _pad_t __pad2; } off_t st_size; /* Size of file, in bytes. */ blksize_t st_blksize; /* Optimal block size for I/O. */ blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ static if( false /*__USE_MISC*/ ) // true if _BSD_SOURCE || _SVID_SOURCE { timespec st_atim; timespec st_mtim; timespec st_ctim; alias st_atim.tv_sec st_atime; alias st_mtim.tv_sec st_mtime; alias st_ctim.tv_sec st_ctime; } else { time_t st_atime; c_ulong st_atimensec; time_t st_mtime; c_ulong st_mtimensec; time_t st_ctime; c_ulong st_ctimensec; } version (X86_64) { c_long[3] __unused; } else static if( __USE_LARGEFILE64 ) { ino64_t st_ino; /* File serial number. */ } else { c_ulong __unused4; c_ulong __unused5; } } const S_IRUSR = octal!(400); const S_IWUSR = octal!(200); const S_IXUSR = octal!(100); const S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR; const S_IRGRP = S_IRUSR >> 3; const S_IWGRP = S_IWUSR >> 3; const S_IXGRP = S_IXUSR >> 3; const S_IRWXG = S_IRWXU >> 3; const S_IROTH = S_IRGRP >> 3; const S_IWOTH = S_IWGRP >> 3; const S_IXOTH = S_IXGRP >> 3; const S_IRWXO = S_IRWXG >> 3; const S_ISUID = octal!(4000); const S_ISGID = octal!(2000); const S_ISVTX = octal!(1000); private { extern (D) bool S_ISTYPE( mode_t mode, uint mask ) { return ( mode & S_IFMT ) == mask; } } extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); } extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); } extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); } extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); } extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); } extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); } extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); } static if( true /*__USE_POSIX199309*/ ) { extern bool S_TYPEISMQ( stat_t* buf ) { return false; } extern bool S_TYPEISSEM( stat_t* buf ) { return false; } extern bool S_TYPEISSHM( stat_t* buf ) { return false; } } } else version( darwin ) { struct stat_t { dev_t st_dev; ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; dev_t st_rdev; time_t st_atime; c_ulong st_atimensec; time_t st_mtime; c_ulong st_mtimensec; time_t st_ctime; c_ulong st_ctimensec; off_t st_size; blkcnt_t st_blocks; blksize_t st_blksize; uint st_flags; uint st_gen; int st_lspare; long[2] st_qspare; } const S_IRUSR = octal!(400); const S_IWUSR = octal!(200); const S_IXUSR = octal!(100); const S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR; const S_IRGRP = S_IRUSR >> 3; const S_IWGRP = S_IWUSR >> 3; const S_IXGRP = S_IXUSR >> 3; const S_IRWXG = S_IRWXU >> 3; const S_IROTH = S_IRGRP >> 3; const S_IWOTH = S_IWGRP >> 3; const S_IXOTH = S_IXGRP >> 3; const S_IRWXO = S_IRWXG >> 3; const S_ISUID = octal!(4000); const S_ISGID = octal!(2000); const S_ISVTX = octal!(1000); private { extern (D) bool S_ISTYPE( mode_t mode, uint mask ) { return ( mode & S_IFMT ) == mask; } } extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); } extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); } extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); } extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); } extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); } extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); } extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); } } else version( FreeBSD ) { struct stat_t { dev_t st_dev; ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; dev_t st_rdev; time_t st_atime; c_ulong st_atimensec; time_t st_mtime; c_ulong st_mtimensec; time_t st_ctime; c_ulong st_ctimensec; /* Defined in C as: timespec st_atimespec; timespec st_mtimespec; timespec st_ctimespec; */ off_t st_size; blkcnt_t st_blocks; blksize_t st_blksize; fflags_t st_flags; uint st_gen; int st_lspare; timespec st_birthtimespec; byte[16 - timespec.sizeof] padding; } const S_IRUSR = octal!(400); const S_IWUSR = octal!(200); const S_IXUSR = octal!(100); const S_IRWXU = octal!(700); const S_IRGRP = octal!(40); const S_IWGRP = octal!(20); const S_IXGRP = octal!(10); const S_IRWXG = octal!(70); const S_IROTH = octal!(4); const S_IWOTH = octal!(2); const S_IXOTH = octal!(1); const S_IRWXO = octal!(7); const S_ISUID = octal!(4000); const S_ISGID = octal!(2000); const S_ISVTX = octal!(1000); private { extern (D) bool S_ISTYPE( mode_t mode, uint mask ) { return ( mode & S_IFMT ) == mask; } } extern (D) bool S_ISBLK( mode_t mode ) { return S_ISTYPE( mode, S_IFBLK ); } extern (D) bool S_ISCHR( mode_t mode ) { return S_ISTYPE( mode, S_IFCHR ); } extern (D) bool S_ISDIR( mode_t mode ) { return S_ISTYPE( mode, S_IFDIR ); } extern (D) bool S_ISFIFO( mode_t mode ) { return S_ISTYPE( mode, S_IFIFO ); } extern (D) bool S_ISREG( mode_t mode ) { return S_ISTYPE( mode, S_IFREG ); } extern (D) bool S_ISLNK( mode_t mode ) { return S_ISTYPE( mode, S_IFLNK ); } extern (D) bool S_ISSOCK( mode_t mode ) { return S_ISTYPE( mode, S_IFSOCK ); } } else version( solaris ) { const _ST_FSTYPSZ = 16; /* array size for file system type name */ struct stat_t { version (X86_64) { dev_t st_dev; ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; dev_t st_rdev; off_t st_size; time_t st_atime; c_ulong st_atimensec; time_t st_mtime; c_ulong st_mtimensec; time_t st_ctime; c_ulong st_ctimensec; /* Defined in C as: timespec st_atim; timespec st_mtim; timespec st_ctim; */ blksize_t st_blksize; blkcnt_t st_blocks; char[_ST_FSTYPSZ] st_fstype; } else { dev_t st_dev; c_long[3] st_pad1; /* reserved for network id */ ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; dev_t st_rdev; c_long[2] st_pad2; off_t st_size; static if( !__USE_LARGEFILE64 ) { c_long st_pad3; /* future off_t expansion */ } time_t st_atime; c_ulong st_atimensec; time_t st_mtime; c_ulong st_mtimensec; time_t st_ctime; c_ulong st_ctimensec; /* Defined in C as: timespec st_atim; timespec st_mtim; timespec st_ctim; */ blksize_t st_blksize; blkcnt_t st_blocks; char[_ST_FSTYPSZ] st_fstype; c_long[8] st_pad4; /* expansion area */ } } /* MODE MASKS */ enum { /* de facto standard definitions */ S_IFMT = 0xF000, /* type of file */ S_IAMB = 0x1FF, /* access mode bits */ S_IFIFO = 0x1000, /* fifo */ S_IFCHR = 0x2000, /* character special */ S_IFDIR = 0x4000, /* directory */ /* XENIX definitions are not relevant to Solaris */ S_IFNAM = 0x5000, /* XENIX special named file */ S_INSEM = 0x1, /* XENIX semaphore subtype of IFNAM */ S_INSHD = 0x2, /* XENIX shared data subtype of IFNAM */ S_IFBLK = 0x6000, /* block special */ S_IFREG = 0x8000, /* regular */ S_IFLNK = 0xA000, /* symbolic link */ S_IFSOCK = 0xC000, /* socket */ S_IFDOOR = 0xD000, /* door */ S_IFPORT = 0xE000, /* event port */ S_ISUID = 0x800, /* set user id on execution */ S_ISGID = 0x400, /* set group id on execution */ S_ISVTX = 0x200, /* save swapped text even after use */ S_IREAD = octal!(400), /* read permission, owner */ S_IWRITE = octal!(200), /* write permission, owner */ S_IEXEC = octal!(100), /* execute/search permission, owner */ S_ENFMT = S_ISGID, /* record locking enforcement flag */ S_IRWXU = octal!(700), /* read, write, execute: owner */ S_IRUSR = octal!(400), /* read permission: owner */ S_IWUSR = octal!(200), /* write permission: owner */ S_IXUSR = octal!(100), /* execute permission: owner */ S_IRWXG = octal!(70), /* read, write, execute: group */ S_IRGRP = octal!(40), /* read permission: group */ S_IWGRP = octal!(20), /* write permission: group */ S_IXGRP = octal!(10), /* execute permission: group */ S_IRWXO = octal!(7), /* read, write, execute: other */ S_IROTH = octal!(4), /* read permission: other */ S_IWOTH = octal!(2), /* write permission: other */ S_IXOTH = octal!(1) /* execute permission: other */ } extern (D) bool S_ISFIFO(mode_t mode) { return (mode & 0xF000) == 0x1000; } extern (D) bool S_ISCHR(mode_t mode) { return (mode & 0xF000) == 0x2000; } extern (D) bool S_ISDIR(mode_t mode) { return (mode & 0xF000) == 0x4000; } extern (D) bool S_ISBLK(mode_t mode) { return (mode & 0xF000) == 0x6000; } extern (D) bool S_ISREG(mode_t mode) { return (mode & 0xF000) == 0x8000; } extern (D) bool S_ISLNK(mode_t mode) { return (mode & 0xF000) == 0xa000; } extern (D) bool S_ISSOCK(mode_t mode) { return (mode & 0xF000) == 0xc000; } extern (D) bool S_ISDOOR(mode_t mode) { return (mode & 0xF000) == 0xd000; } extern (D) bool S_ISPORT(mode_t mode) { return (mode & 0xF000) == 0xe000; } } int chmod(in char*, mode_t); int fchmod(int, mode_t); //int fstat(int, stat_t*); //int lstat(in char*, stat_t*); int mkdir(in char*, mode_t); int mkfifo(in char*, mode_t); //int stat(in char*, stat_t*); mode_t umask(mode_t); static if (__USE_LARGEFILE64) { int fstat64(int, stat_t*); alias fstat64 fstat; int lstat64(in char*, stat_t*); alias lstat64 lstat; int stat64(in char*, stat_t*); alias stat64 stat; } else { int fstat(int, stat_t*); int lstat(in char*, stat_t*); int stat(in char*, stat_t*); } // // Typed Memory Objects (TYM) // /* S_TYPEISTMO(buf) */ // // XOpen (XSI) // /* S_IFMT S_IFBLK S_IFCHR S_IFIFO S_IFREG S_IFDIR S_IFLNK S_IFSOCK int mknod(in 3char*, mode_t, dev_t); */ version( linux ) { const S_IFMT = octal!(170000); const S_IFBLK = octal!(60000); const S_IFCHR = octal!(20000); const S_IFIFO = octal!(10000); const S_IFREG = octal!(100000); const S_IFDIR = octal!(40000); const S_IFLNK = octal!(120000); const S_IFSOCK = octal!(140000); int mknod(in char*, mode_t, dev_t); } else version( darwin ) { const S_IFMT = octal!(170000); const S_IFBLK = octal!(60000); const S_IFCHR = octal!(20000); const S_IFIFO = octal!(10000); const S_IFREG = octal!(100000); const S_IFDIR = octal!(40000); const S_IFLNK = octal!(120000); const S_IFSOCK = octal!(140000); int mknod(in char*, mode_t, dev_t); } else version( FreeBSD ) { const S_IFMT = octal!(170000); const S_IFBLK = octal!(60000); const S_IFCHR = octal!(20000); const S_IFIFO = octal!(10000); const S_IFREG = octal!(100000); const S_IFDIR = octal!(40000); const S_IFLNK = octal!(120000); const S_IFSOCK = octal!(140000); int mknod(in char*, mode_t, dev_t); } else version( solaris ) { // Constants defined above int mknod(in char*, mode_t, dev_t); } |