// D import file generated from '../../../../libphobos/libdruntime/core/sys/posix/sys/stat.d'
module core.sys.posix.sys.stat;
private import core.sys.posix.config;

private import core.stdc.stdint;

private import core.sys.posix.time;

public import core.stdc.stddef;

public import core.sys.posix.sys.types;

version (Posix)
{
	extern (C) 
	{
		version (linux)
		{
			version (X86)
			{
				version = AnyX86;
			}
			version (X86_64)
			{
				version = AnyX86;
			}
			version (MIPS)
			{
				version (MIPS_O32)
				{
					struct stat_t
					{
						c_ulong st_dev;
						c_long[3] st_pad1;
						ino_t st_ino;
						mode_t st_mode;
						nlink_t st_nlink;
						uid_t st_uid;
						gid_t st_gid;
						c_ulong st_rdev;
						static if(!__USE_FILE_OFFSET64)
						{
							c_long[2] st_pad2;
							off_t st_size;
							c_long st_pad3;
						}
						else
						{
							c_long[3] st_pad2;
							off_t st_size;
						}
						static if(__USE_MISC || __USE_XOPEN2K8)
						{
							timespec st_atim;
							timespec st_mtim;
							timespec st_ctim;
							extern (D) 
							{
								ref @property time_t st_atime();

								ref @property time_t st_mtime();

								ref @property time_t 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;
						}
						blksize_t st_blksize;
						static if(!__USE_FILE_OFFSET64)
						{
							blkcnt_t st_blocks;
						}
						else
						{
							c_long st_pad4;
							blkcnt_t st_blocks;
						}
						c_long[14] st_pad5;
					}
				}
				else
				{
					struct stat_t
					{
						dev_t st_dev;
						int[3] st_pad1;
						ino_t st_ino;
						mode_t st_mode;
						nlink_t st_nlink;
						uid_t st_uid;
						gid_t st_gid;
						dev_t st_rdev;
						static if(!__USE_FILE_OFFSET64)
						{
							uint[2] st_pad2;
							off_t st_size;
							int st_pad3;
						}
						else
						{
							uint[3] st_pad2;
							off_t st_size;
						}
						static if(__USE_MISC || __USE_XOPEN2K8)
						{
							timespec st_atim;
							timespec st_mtim;
							timespec st_ctim;
							extern (D) 
							{
								ref @property time_t st_atime();

								ref @property time_t st_mtime();

								ref @property time_t 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;
						}
						blksize_t st_blksize;
						uint st_pad4;
						blkcnt_t st_blocks;
						int[14] st_pad5;
					}
				}
			}
			else
			{
				version (AnyX86)
				{
					struct stat_t
					{
						dev_t st_dev;
						static if(__WORDSIZE == 32)
						{
							ushort __pad1;
						}
						static if(!__USE_FILE_OFFSET64 || __WORDSIZE == 64)
						{
							uint st_ino;
						}
						else
						{
							uint __st_ino;
						}
						static if(__WORDSIZE == 32)
						{
							mode_t st_mode;
							nlink_t st_nlink;
						}
						else
						{
							nlink_t st_nlink;
							mode_t st_mode;
						}
						uid_t st_uid;
						gid_t st_gid;
						static if(__WORDSIZE == 64)
						{
							uint pad0;
						}
						dev_t st_rdev;
						static if(__WORDSIZE == 32)
						{
							ushort __pad2;
						}
						off_t st_size;
						blksize_t st_blksize;
						blkcnt_t st_blocks;
						static if(__USE_MISC || __USE_XOPEN2K8)
						{
							timespec st_atim;
							timespec st_mtim;
							timespec st_ctim;
							extern (D) 
							{
								ref @property time_t st_atime();

								ref @property time_t st_mtime();

								ref @property time_t 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;
						}
						static if(__WORDSIZE == 64)
						{
							c_long[3] __unused;
						}
						else
						{
							static if(__USE_FILE_OFFSET64)
							{
								ino_t st_ino;
							}
							else
							{
								c_ulong __unused4;
								c_ulong __unused5;
							}
						}
					}
				}
				else
				{
					static assert(0,"unimplemented");
				}
			}
			enum S_IRUSR = 256;
			enum S_IWUSR = 128;
			enum S_IXUSR = 64;
			enum S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR;
			enum S_IRGRP = S_IRUSR >> 3;
			enum S_IWGRP = S_IWUSR >> 3;
			enum S_IXGRP = S_IXUSR >> 3;
			enum S_IRWXG = S_IRWXU >> 3;
			enum S_IROTH = S_IRGRP >> 3;
			enum S_IWOTH = S_IWGRP >> 3;
			enum S_IXOTH = S_IXGRP >> 3;
			enum S_IRWXO = S_IRWXG >> 3;
			enum S_ISUID = 2048;
			enum S_ISGID = 1024;
			enum S_ISVTX = 512;
			private extern (D) bool S_ISTYPE(mode_t mode, uint mask);


			extern (D) bool S_ISBLK(mode_t mode);

			extern (D) bool S_ISCHR(mode_t mode);

			extern (D) bool S_ISDIR(mode_t mode);

			extern (D) bool S_ISFIFO(mode_t mode);

			extern (D) bool S_ISREG(mode_t mode);

			extern (D) bool S_ISLNK(mode_t mode);

			extern (D) bool S_ISSOCK(mode_t mode);

			static if(true)
			{
				extern bool S_TYPEISMQ(stat_t* buf);

				extern bool S_TYPEISSEM(stat_t* buf);

				extern bool S_TYPEISSHM(stat_t* buf);

			}
		}
		else
		{
			version (OSX)
			{
				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;
					static if(false)
					{
						timespec st_atimespec;
						timespec st_mtimespec;
						timespec st_ctimespec;
					}
					else
					{
						time_t st_atime;
						c_long st_atimensec;
						time_t st_mtime;
						c_long st_mtimensec;
						time_t st_ctime;
						c_long 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;
				}
				enum S_IRUSR = 256;
				enum S_IWUSR = 128;
				enum S_IXUSR = 64;
				enum S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR;
				enum S_IRGRP = S_IRUSR >> 3;
				enum S_IWGRP = S_IWUSR >> 3;
				enum S_IXGRP = S_IXUSR >> 3;
				enum S_IRWXG = S_IRWXU >> 3;
				enum S_IROTH = S_IRGRP >> 3;
				enum S_IWOTH = S_IWGRP >> 3;
				enum S_IXOTH = S_IXGRP >> 3;
				enum S_IRWXO = S_IRWXG >> 3;
				enum S_ISUID = 2048;
				enum S_ISGID = 1024;
				enum S_ISVTX = 512;
				private extern (D) bool S_ISTYPE(mode_t mode, uint mask);


				extern (D) bool S_ISBLK(mode_t mode);

				extern (D) bool S_ISCHR(mode_t mode);

				extern (D) bool S_ISDIR(mode_t mode);

				extern (D) bool S_ISFIFO(mode_t mode);

				extern (D) bool S_ISREG(mode_t mode);

				extern (D) bool S_ISLNK(mode_t mode);

				extern (D) bool S_ISSOCK(mode_t mode);

			}
			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_long __st_atimensec;
						time_t st_mtime;
						c_long __st_mtimensec;
						time_t st_ctime;
						c_long __st_ctimensec;
						off_t st_size;
						blkcnt_t st_blocks;
						blksize_t st_blksize;
						fflags_t st_flags;
						uint st_gen;
						int st_lspare;
						time_t st_birthtime;
						c_long st_birthtimensec;
						ubyte[16 - timespec.sizeof] padding;
					}
					enum S_IRUSR = 256;
					enum S_IWUSR = 128;
					enum S_IXUSR = 64;
					enum S_IRWXU = 448;
					enum S_IRGRP = 32;
					enum S_IWGRP = 16;
					enum S_IXGRP = 8;
					enum S_IRWXG = 56;
					enum S_IROTH = 4;
					enum S_IWOTH = 2;
					enum S_IXOTH = 1;
					enum S_IRWXO = 7;
					enum S_ISUID = 2048;
					enum S_ISGID = 1024;
					enum S_ISVTX = 512;
					private extern (D) bool S_ISTYPE(mode_t mode, uint mask);


					extern (D) bool S_ISBLK(mode_t mode);

					extern (D) bool S_ISCHR(mode_t mode);

					extern (D) bool S_ISDIR(mode_t mode);

					extern (D) bool S_ISFIFO(mode_t mode);

					extern (D) bool S_ISREG(mode_t mode);

					extern (D) bool S_ISLNK(mode_t mode);

					extern (D) bool S_ISSOCK(mode_t mode);

				}
				else
				{
					version (Solaris)
					{
						private enum _ST_FSTYPSZ = 16;

						version (D_LP64)
						{
							struct stat64_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;
								off_t st_size;
								timestruc_t st_atim;
								timestruc_t st_mtim;
								timestruc_t st_ctim;
								blksize_t st_blksize;
								blkcnt_t st_blocks;
								char[_ST_FSTYPSZ] st_fstype;
							}
							alias stat64_t stat32_t;
						}
						else
						{
							struct stat32_t
							{
								dev_t st_dev;
								c_long[3] st_pad1;
								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;
								c_long st_pad3;
								timestruc_t st_atim;
								timestruc_t st_mtim;
								timestruc_t st_ctim;
								blksize_t st_blksize;
								blkcnt_t st_blocks;
								char[_ST_FSTYPSZ] st_fstype;
								c_long[8] st_pad4;
							}
							struct stat64_t
							{
								dev_t st_dev;
								c_long[3] st_pad1;
								ino64_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;
								off64_t st_size;
								c_long st_pad3;
								timestruc_t st_atim;
								timestruc_t st_mtim;
								timestruc_t st_ctim;
								blksize_t st_blksize;
								blkcnt64_t st_blocks;
								char[_ST_FSTYPSZ] st_fstype;
								c_long[8] st_pad4;
							}
						}
						static if(__USE_FILE_OFFSET64)
						{
							alias stat64_t stat_t;
						}
						else
						{
							alias stat32_t stat_t;
						}
						enum S_IRUSR = 256;
						enum S_IWUSR = 128;
						enum S_IXUSR = 64;
						enum S_IRWXU = 448;
						enum S_IRGRP = 32;
						enum S_IWGRP = 16;
						enum S_IXGRP = 8;
						enum S_IRWXG = 56;
						enum S_IROTH = 4;
						enum S_IWOTH = 2;
						enum S_IXOTH = 1;
						enum S_IRWXO = 7;
						enum S_ISUID = 2048;
						enum S_ISGID = 1024;
						enum S_ISVTX = 512;
						private extern (D) bool S_ISTYPE(mode_t mode, uint mask);


						extern (D) bool S_ISBLK(mode_t mode);

						extern (D) bool S_ISCHR(mode_t mode);

						extern (D) bool S_ISDIR(mode_t mode);

						extern (D) bool S_ISFIFO(mode_t mode);

						extern (D) bool S_ISREG(mode_t mode);

						extern (D) bool S_ISLNK(mode_t mode);

						extern (D) bool S_ISSOCK(mode_t mode);

					}
					else
					{
						static assert(false,"Unsupported platform");
					}
				}
			}
		}
		version (Posix)
		{
			int chmod(in char*, mode_t);
			int fchmod(int, mode_t);
			int mkdir(in char*, mode_t);
			int mkfifo(in char*, mode_t);
			mode_t umask(mode_t);
		}
		version (linux)
		{
			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*);
			}
		}
		else
		{
			version (Solaris)
			{
				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*);
				}
			}
			else
			{
				version (Posix)
				{
					int fstat(int, stat_t*);
					int lstat(in char*, stat_t*);
					int stat(in char*, stat_t*);
				}
			}
		}
		version (linux)
		{
			enum S_IFMT = 61440;
			enum S_IFBLK = 24576;
			enum S_IFCHR = 8192;
			enum S_IFIFO = 4096;
			enum S_IFREG = 32768;
			enum S_IFDIR = 16384;
			enum S_IFLNK = 40960;
			enum S_IFSOCK = 49152;
			int mknod(in char*, mode_t, dev_t);
		}
		else
		{
			version (OSX)
			{
				enum S_IFMT = 61440;
				enum S_IFBLK = 24576;
				enum S_IFCHR = 8192;
				enum S_IFIFO = 4096;
				enum S_IFREG = 32768;
				enum S_IFDIR = 16384;
				enum S_IFLNK = 40960;
				enum S_IFSOCK = 49152;
				int mknod(in char*, mode_t, dev_t);
			}
			else
			{
				version (FreeBSD)
				{
					enum S_IFMT = 61440;
					enum S_IFBLK = 24576;
					enum S_IFCHR = 8192;
					enum S_IFIFO = 4096;
					enum S_IFREG = 32768;
					enum S_IFDIR = 16384;
					enum S_IFLNK = 40960;
					enum S_IFSOCK = 49152;
					int mknod(in char*, mode_t, dev_t);
				}
				else
				{
					version (Solaris)
					{
						enum S_IFMT = 61440;
						enum S_IFBLK = 24576;
						enum S_IFCHR = 8192;
						enum S_IFIFO = 4096;
						enum S_IFREG = 32768;
						enum S_IFDIR = 16384;
						enum S_IFLNK = 40960;
						enum S_IFSOCK = 49152;
						int mknod(in char*, mode_t, dev_t);
					}
					else
					{
						static assert(false,"Unsupported platform");
					}
				}
			}
		}
	}
}
