X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/2d21ac55c334faf3a56e5634905ed6987fc787d4..c18c124eaa464aaaa5549e99e5a70fc9cbb50944:/bsd/sys/stat.h diff --git a/bsd/sys/stat.h b/bsd/sys/stat.h index f60c65821..3614aaac2 100644 --- a/bsd/sys/stat.h +++ b/bsd/sys/stat.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2007 Apple Inc. All rights reserved. + * Copyright (c) 2000-2014 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -74,77 +74,37 @@ #include #ifdef KERNEL #include +#else /* !KERNEL */ +#include #endif /* KERNEL */ /* [XSI] The timespec structure may be defined as described in */ -#define __need_struct_timespec +#include #ifdef KERNEL -#define __need_struct_user_timespec +#include +#include #endif /* KERNEL */ -#include /* * [XSI] The blkcnt_t, blksize_t, dev_t, ino_t, mode_t, nlink_t, uid_t, * gid_t, off_t, and time_t types shall be defined as described in * . */ -#ifndef _BLKCNT_T -typedef __darwin_blkcnt_t blkcnt_t; -#define _BLKCNT_T -#endif - -#ifndef _BLKSIZE_T -typedef __darwin_blksize_t blksize_t; -#define _BLKSIZE_T -#endif - -#ifndef _DEV_T -typedef __darwin_dev_t dev_t; /* device number */ -#define _DEV_T -#endif - -#ifndef _INO_T -typedef __darwin_ino_t ino_t; /* inode number */ -#define _INO_T -#endif +#include +#include +#include /* device number */ +#include #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#ifndef _INO64_T -typedef __darwin_ino64_t ino64_t; /* 64bit inode number */ -#define _INO64_T -#endif +#include #endif /* !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) */ -#ifndef _MODE_T -typedef __darwin_mode_t mode_t; -#define _MODE_T -#endif - -#ifndef _NLINK_T -typedef __uint16_t nlink_t; /* link count */ -#define _NLINK_T -#endif - -#ifndef _UID_T -typedef __darwin_uid_t uid_t; /* user id */ -#define _UID_T -#endif - -#ifndef _GID_T -typedef __darwin_gid_t gid_t; -#define _GID_T -#endif - -#ifndef _OFF_T -typedef __darwin_off_t off_t; -#define _OFF_T -#endif - -#ifndef _TIME_T -#define _TIME_T -typedef __darwin_time_t time_t; -#endif - +#include +#include +#include +#include +#include +#include #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) /* @@ -264,18 +224,23 @@ struct stat { #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) +#if !__DARWIN_ONLY_64_BIT_INO_T + struct stat64 __DARWIN_STRUCT_STAT64; +#endif /* !__DARWIN_ONLY_64_BIT_INO_T */ + #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ #ifdef KERNEL +#ifdef BSD_KERNEL_PRIVATE /* LP64 version of struct stat. time_t (see timespec) is a long and must * grow when we're dealing with a 64-bit process. * WARNING - keep in sync with struct stat */ -struct user_stat { +struct user64_stat { dev_t st_dev; /* [XSI] ID of device containing file */ ino_t st_ino; /* [XSI] File serial number */ mode_t st_mode; /* [XSI] Mode of file (see below) */ @@ -284,16 +249,16 @@ struct user_stat { gid_t st_gid; /* [XSI] Group ID of the file */ dev_t st_rdev; /* [XSI] Device ID */ #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) - struct user_timespec st_atimespec; /* time of last access */ - struct user_timespec st_mtimespec; /* time of last data modification */ - struct user_timespec st_ctimespec; /* time of last status change */ + struct user64_timespec st_atimespec; /* time of last access */ + struct user64_timespec st_mtimespec; /* time of last data modification */ + struct user64_timespec st_ctimespec; /* time of last status change */ #else - user_time_t st_atime; /* [XSI] Time of last access */ - __int64_t st_atimensec; /* nsec of last access */ - user_time_t st_mtime; /* [XSI] Last data modification */ - __int64_t st_mtimensec; /* last data modification nsec */ - user_time_t st_ctime; /* [XSI] Time of last status change */ - __int64_t st_ctimensec; /* nsec of last status change */ + user64_time_t st_atime; /* [XSI] Time of last access */ + user64_long_t st_atimensec; /* nsec of last access */ + user64_time_t st_mtime; /* [XSI] Last data modification */ + user64_long_t st_mtimensec; /* last data modification nsec */ + user64_time_t st_ctime; /* [XSI] Time of last status change */ + user64_long_t st_ctimensec; /* nsec of last status change */ #endif off_t st_size; /* [XSI] File size, in bytes */ blkcnt_t st_blocks; /* [XSI] Blocks allocated for file */ @@ -304,10 +269,44 @@ struct user_stat { __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */ }; -extern void munge_stat(struct stat *sbp, struct user_stat *usbp); +/* ILP32 version of struct stat. + * WARNING - keep in sync with struct stat + */ +struct user32_stat { + dev_t st_dev; /* [XSI] ID of device containing file */ + ino_t st_ino; /* [XSI] File serial number */ + mode_t st_mode; /* [XSI] Mode of file (see below) */ + nlink_t st_nlink; /* [XSI] Number of hard links */ + uid_t st_uid; /* [XSI] User ID of the file */ + gid_t st_gid; /* [XSI] Group ID of the file */ + dev_t st_rdev; /* [XSI] Device ID */ +#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) + struct user32_timespec st_atimespec; /* time of last access */ + struct user32_timespec st_mtimespec; /* time of last data modification */ + struct user32_timespec st_ctimespec; /* time of last status change */ +#else + user32_time_t st_atime; /* [XSI] Time of last access */ + user32_long_t st_atimensec; /* nsec of last access */ + user32_time_t st_mtime; /* [XSI] Last data modification */ + user32_long_t st_mtimensec; /* last data modification nsec */ + user32_time_t st_ctime; /* [XSI] Time of last status change */ + user32_long_t st_ctimensec; /* nsec of last status change */ +#endif + off_t st_size; /* [XSI] File size, in bytes */ + blkcnt_t st_blocks; /* [XSI] Blocks allocated for file */ + blksize_t st_blksize; /* [XSI] Optimal blocksize for I/O */ + __uint32_t st_flags; /* user defined flags for file */ + __uint32_t st_gen; /* file generation number */ + __int32_t st_lspare; /* RESERVED: DO NOT USE! */ + __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */ +}; + +extern void munge_user64_stat(struct stat *sbp, struct user64_stat *usbp); +extern void munge_user32_stat(struct stat *sbp, struct user32_stat *usbp); -struct user_stat64 { + +struct user64_stat64 { dev_t st_dev; /* [XSI] ID of device containing file */ mode_t st_mode; /* [XSI] Mode of file (see below) */ nlink_t st_nlink; /* [XSI] Number of hard links */ @@ -316,19 +315,19 @@ struct user_stat64 { gid_t st_gid; /* [XSI] Group ID of the file */ dev_t st_rdev; /* [XSI] Device ID */ #ifndef _POSIX_C_SOURCE - struct user_timespec st_atimespec; /* time of last access */ - struct user_timespec st_mtimespec; /* time of last data modification */ - struct user_timespec st_ctimespec; /* time of last status change */ - struct user_timespec st_birthtimespec; /* time of file creation(birth) */ + struct user64_timespec st_atimespec; /* time of last access */ + struct user64_timespec st_mtimespec; /* time of last data modification */ + struct user64_timespec st_ctimespec; /* time of last status change */ + struct user64_timespec st_birthtimespec; /* time of file creation(birth) */ #else - user_time_t st_atime; /* [XSI] Time of last access */ - __int64_t st_atimensec; /* nsec of last access */ - user_time_t st_mtime; /* [XSI] Last data modification time */ - __int64_t st_mtimensec; /* last data modification nsec */ - user_time_t st_ctime; /* [XSI] Time of last status change */ - __int64_t st_ctimensec; /* nsec of last status change */ - user_time_t st_birthtime; /* File creation time(birth) */ - __int64_t st_birthtimensec; /* nsec of File creation time */ + user64_time_t st_atime; /* [XSI] Time of last access */ + user64_long_t st_atimensec; /* nsec of last access */ + user64_time_t st_mtime; /* [XSI] Last data modification time */ + user64_long_t st_mtimensec; /* last data modification nsec */ + user64_time_t st_ctime; /* [XSI] Time of last status change */ + user64_long_t st_ctimensec; /* nsec of last status change */ + user64_time_t st_birthtime; /* File creation time(birth) */ + user64_long_t st_birthtimensec; /* nsec of File creation time */ #endif off_t st_size; /* [XSI] file size, in bytes */ blkcnt_t st_blocks; /* [XSI] blocks allocated for file */ @@ -339,9 +338,44 @@ struct user_stat64 { __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */ }; -extern void munge_stat64(struct stat64 *sbp, struct user_stat64 *usbp); +struct user32_stat64 { + dev_t st_dev; /* [XSI] ID of device containing file */ + mode_t st_mode; /* [XSI] Mode of file (see below) */ + nlink_t st_nlink; /* [XSI] Number of hard links */ + ino64_t st_ino; /* [XSI] File serial number */ + uid_t st_uid; /* [XSI] User ID of the file */ + gid_t st_gid; /* [XSI] Group ID of the file */ + dev_t st_rdev; /* [XSI] Device ID */ +#ifndef _POSIX_C_SOURCE + struct user32_timespec st_atimespec; /* time of last access */ + struct user32_timespec st_mtimespec; /* time of last data modification */ + struct user32_timespec st_ctimespec; /* time of last status change */ + struct user32_timespec st_birthtimespec; /* time of file creation(birth) */ +#else + user32_time_t st_atime; /* [XSI] Time of last access */ + user32_long_t st_atimensec; /* nsec of last access */ + user32_time_t st_mtime; /* [XSI] Last data modification time */ + user32_long_t st_mtimensec; /* last data modification nsec */ + user32_time_t st_ctime; /* [XSI] Time of last status change */ + user32_long_t st_ctimensec; /* nsec of last status change */ + user32_time_t st_birthtime; /* File creation time(birth) */ + user32_long_t st_birthtimensec; /* nsec of File creation time */ +#endif + off_t st_size; /* [XSI] file size, in bytes */ + blkcnt_t st_blocks; /* [XSI] blocks allocated for file */ + blksize_t st_blksize; /* [XSI] optimal blocksize for I/O */ + __uint32_t st_flags; /* user defined flags for file */ + __uint32_t st_gen; /* file generation number */ + __uint32_t st_lspare; /* RESERVED: DO NOT USE! */ + __int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */ +} __attribute__((packed,aligned(4))); + +extern void munge_user64_stat64(struct stat64 *sbp, struct user64_stat64 *usbp); +extern void munge_user32_stat64(struct stat64 *sbp, struct user32_stat64 *usbp); -#endif // KERNEL +#endif /* BSD_KERNEL_PRIVATE */ + +#endif /* KERNEL */ #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) @@ -355,49 +389,7 @@ extern void munge_stat64(struct stat64 *sbp, struct user_stat64 *usbp); * [XSI] The following are symbolic names for the values of type mode_t. They * are bitmap values. */ -#ifndef S_IFMT -/* File type */ -#define S_IFMT 0170000 /* [XSI] type of file mask */ -#define S_IFIFO 0010000 /* [XSI] named pipe (fifo) */ -#define S_IFCHR 0020000 /* [XSI] character special */ -#define S_IFDIR 0040000 /* [XSI] directory */ -#define S_IFBLK 0060000 /* [XSI] block special */ -#define S_IFREG 0100000 /* [XSI] regular */ -#define S_IFLNK 0120000 /* [XSI] symbolic link */ -#define S_IFSOCK 0140000 /* [XSI] socket */ -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define S_IFWHT 0160000 /* whiteout */ -#define S_IFXATTR 0200000 /* extended attribute */ -#endif - -/* File mode */ -/* Read, write, execute/search by owner */ -#define S_IRWXU 0000700 /* [XSI] RWX mask for owner */ -#define S_IRUSR 0000400 /* [XSI] R for owner */ -#define S_IWUSR 0000200 /* [XSI] W for owner */ -#define S_IXUSR 0000100 /* [XSI] X for owner */ -/* Read, write, execute/search by group */ -#define S_IRWXG 0000070 /* [XSI] RWX mask for group */ -#define S_IRGRP 0000040 /* [XSI] R for group */ -#define S_IWGRP 0000020 /* [XSI] W for group */ -#define S_IXGRP 0000010 /* [XSI] X for group */ -/* Read, write, execute/search by others */ -#define S_IRWXO 0000007 /* [XSI] RWX mask for other */ -#define S_IROTH 0000004 /* [XSI] R for other */ -#define S_IWOTH 0000002 /* [XSI] W for other */ -#define S_IXOTH 0000001 /* [XSI] X for other */ - -#define S_ISUID 0004000 /* [XSI] set user id on execution */ -#define S_ISGID 0002000 /* [XSI] set group id on execution */ -#define S_ISVTX 0001000 /* [XSI] directory restrcted delete */ - -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define S_ISTXT S_ISVTX /* sticky bit: not supported */ -#define S_IREAD S_IRUSR /* backward compatability */ -#define S_IWRITE S_IWUSR /* backward compatability */ -#define S_IEXEC S_IXUSR /* backward compatability */ -#endif -#endif /* !S_IFMT */ +#include /* * [XSI] The following macros shall be provided to test whether a file is @@ -405,16 +397,15 @@ extern void munge_stat64(struct stat64 *sbp, struct user_stat64 *usbp); * of st_mode from a stat structure. The macro shall evaluate to a non-zero * value if the test is true; 0 if the test is false. */ -#define S_ISBLK(m) (((m) & 0170000) == 0060000) /* block special */ -#define S_ISCHR(m) (((m) & 0170000) == 0020000) /* char special */ -#define S_ISDIR(m) (((m) & 0170000) == 0040000) /* directory */ -#define S_ISFIFO(m) (((m) & 0170000) == 0010000) /* fifo or socket */ -#define S_ISREG(m) (((m) & 0170000) == 0100000) /* regular file */ -#define S_ISLNK(m) (((m) & 0170000) == 0120000) /* symbolic link */ -#define S_ISSOCK(m) (((m) & 0170000) == 0140000) /* socket */ +#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) /* block special */ +#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) /* char special */ +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) /* directory */ +#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) /* fifo or socket */ +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) /* regular file */ +#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) /* symbolic link */ +#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) /* socket */ #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#define S_ISWHT(m) (((m) & 0170000) == 0160000) /* whiteout */ -#define S_ISXATTR(m) (((m) & 0200000) == 0200000) /* extended attribute */ +#define S_ISWHT(m) (((m) & S_IFMT) == S_IFWHT) /* OBSOLETE: whiteout */ #endif /* @@ -477,7 +468,13 @@ extern void munge_stat64(struct stat64 *sbp, struct user_stat64 *usbp); * in Mac OS X. */ /* #define UF_NOUNLINK 0x00000010 */ /* file may not be removed or renamed */ -/* Bits 0x0020 through 0x4000 are currently undefined. */ +#define UF_COMPRESSED 0x00000020 /* file is hfs-compressed */ + +/* UF_TRACKED is used for dealing with document IDs. We no longer issue + notifications for deletes or renames for files which have UF_TRACKED set. */ +#define UF_TRACKED 0x00000040 + +/* Bits 0x0080 through 0x4000 are currently undefined. */ #define UF_HIDDEN 0x00008000 /* hint that this item should not be */ /* displayed in a GUI */ /* @@ -487,6 +484,8 @@ extern void munge_stat64(struct stat64 *sbp, struct user_stat64 *usbp); #define SF_ARCHIVED 0x00010000 /* file is archived */ #define SF_IMMUTABLE 0x00020000 /* file may not be changed */ #define SF_APPEND 0x00040000 /* writes to file may only append */ +#define SF_RESTRICTED 0x00080000 /* restricted access */ + /* * The following two bits are reserved for FreeBSD. They are not * implemented in Mac OS X. @@ -519,33 +518,40 @@ int stat(const char *, struct stat *) __DARWIN_INODE64(stat); int mknod(const char *, mode_t, dev_t); mode_t umask(mode_t); -#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) -#ifndef _FILESEC_T -struct _filesec; -typedef struct _filesec *filesec_t; -#define _FILESEC_T +#if __DARWIN_C_LEVEL >= 200809L +int fchmodat(int, const char *, mode_t, int) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); +int fstatat(int, const char *, struct stat *, int) __DARWIN_INODE64(fstatat) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); +int mkdirat(int, const char *, mode_t) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); #endif + +#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) + +#include + int chflags(const char *, __uint32_t); int chmodx_np(const char *, filesec_t); int fchflags(int, __uint32_t); int fchmodx_np(int, filesec_t); int fstatx_np(int, struct stat *, filesec_t) __DARWIN_INODE64(fstatx_np); -int lchflags(const char *, __uint32_t); -int lchmod(const char *, mode_t); +int lchflags(const char *, __uint32_t) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); +int lchmod(const char *, mode_t) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); int lstatx_np(const char *, struct stat *, filesec_t) __DARWIN_INODE64(lstatx_np); int mkdirx_np(const char *, filesec_t); int mkfifox_np(const char *, filesec_t); int statx_np(const char *, struct stat *, filesec_t) __DARWIN_INODE64(statx_np); -int umaskx_np(filesec_t); -/* The following are simillar to stat and friends except provide struct stat64 instead of struct stat */ -int fstatx64_np(int, struct stat64 *, filesec_t); -int lstatx64_np(const char *, struct stat64 *, filesec_t); -int statx64_np(const char *, struct stat64 *, filesec_t); -int fstat64(int, struct stat64 *); -int lstat64(const char *, struct stat64 *); -int stat64(const char *, struct stat64 *); +int umaskx_np(filesec_t) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_4,__MAC_10_6,__IPHONE_NA,__IPHONE_NA); + +#if !__DARWIN_ONLY_64_BIT_INO_T +/* The following deprecated routines are simillar to stat and friends except provide struct stat64 instead of struct stat */ +int fstatx64_np(int, struct stat64 *, filesec_t) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA); +int lstatx64_np(const char *, struct stat64 *, filesec_t) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA); +int statx64_np(const char *, struct stat64 *, filesec_t) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA); +int fstat64(int, struct stat64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA); +int lstat64(const char *, struct stat64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA); +int stat64(const char *, struct stat64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA); +#endif /* !__DARWIN_ONLY_64_BIT_INO_T */ #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */ __END_DECLS -#endif +#endif /* !KERNEL */ #endif /* !_SYS_STAT_H_ */