/*
- * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2014 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
#include <sys/cdefs.h>
#ifdef KERNEL
#include <machine/types.h>
+#else /* !KERNEL */
+#include <Availability.h>
#endif /* KERNEL */
/* [XSI] The timespec structure may be defined as described in <time.h> */
-#define __need_struct_timespec
+#include <sys/_types/_timespec.h>
#ifdef KERNEL
-#define __need_struct_user_timespec
+#include <sys/_types/_user64_timespec.h>
+#include <sys/_types/_user32_timespec.h>
#endif /* KERNEL */
-#include <sys/_structs.h>
/*
* [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
* <sys/types.h>.
*/
-#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 <sys/_types/_blkcnt_t.h>
+#include <sys/_types/_blksize_t.h>
+#include <sys/_types/_dev_t.h> /* device number */
+#include <sys/_types/_ino_t.h>
#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 <sys/_types/_ino64_t.h>
#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 <sys/_types/_mode_t.h>
+#include <sys/_types/_nlink_t.h>
+#include <sys/_types/_uid_t.h>
+#include <sys/_types/_gid_t.h>
+#include <sys/_types/_off_t.h>
+#include <sys/_types/_time_t.h>
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
/*
#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) */
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 */
__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 */
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 */
__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)
* [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 <sys/_types/_s_ifmt.h>
/*
* [XSI] The following macros shall be provided to test whether a file is
* 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
/*
* 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 compressed (some file-systems) */
+
+/* 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 */
/*
* Super-user changeable flags.
*/
+#define SF_SUPPORTED 0x001f0000 /* mask of superuser supported flags */
#define SF_SETTABLE 0xffff0000 /* mask of superuser changeable flags */
#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 */
+#define SF_NOUNLINK 0x00100000 /* Item may not be removed, renamed or mounted on */
+
/*
* The following two bits are reserved for FreeBSD. They are not
* implemented in Mac OS X.
*/
-/* #define SF_NOUNLINK 0x00100000 */ /* file may not be removed or renamed */
/* #define SF_SNAPSHOT 0x00200000 */ /* snapshot inode */
/* NOTE: There is no SF_HIDDEN bit. */
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 <sys/_types/_filesec_t.h>
+
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_ */