]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/sys/stat.h
xnu-7195.50.7.100.1.tar.gz
[apple/xnu.git] / bsd / sys / stat.h
index 2f6dbcbffc3df9b64274d866ddb9d63a2f99c737..ec5858ebdb2cfe574af15a2529cf68040dc0063f 100644 (file)
@@ -1,8 +1,8 @@
 /*
- * Copyright (c) 2000-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2000-2014 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
- * 
+ *
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
  * unlawful or unlicensed copies of an Apple operating system, or to
  * circumvent, violate, or enable the circumvention or violation of, any
  * terms of an Apple operating system software license agreement.
- * 
+ *
  * Please obtain a copy of the License at
  * http://www.opensource.apple.com/apsl/ and read it before using this file.
- * 
+ *
  * The Original Code and all software distributed under the License are
  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
@@ -22,7 +22,7 @@
  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
  * Please see the License for the specific language governing rights and
  * limitations under the License.
- * 
+ *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
@@ -68,7 +68,7 @@
 
 
 #ifndef _SYS_STAT_H_
-#define        _SYS_STAT_H_
+#define _SYS_STAT_H_
 
 #include <sys/_types.h>
 #include <sys/cdefs.h>
@@ -92,7 +92,7 @@
  */
 #include <sys/_types/_blkcnt_t.h>
 #include <sys/_types/_blksize_t.h>
-#include <sys/_types/_dev_t.h>                 /* device number */
+#include <sys/_types/_dev_t.h>                  /* device number */
 #include <sys/_types/_ino_t.h>
 
 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
  * vnode_internal.h).
  */
 struct ostat {
-       __uint16_t      st_dev;         /* inode's device */
-       ino_t           st_ino;         /* inode's number */
-       mode_t          st_mode;        /* inode protection mode */
-       nlink_t         st_nlink;       /* number of hard links */
-       __uint16_t      st_uid;         /* user ID of the file's owner */
-       __uint16_t      st_gid;         /* group ID of the file's group */
-       __uint16_t      st_rdev;        /* device type */
-       __int32_t       st_size;        /* file size, in bytes */
-       struct  timespec st_atimespec;  /* time of last access */
-       struct  timespec st_mtimespec;  /* time of last data modification */
-       struct  timespec st_ctimespec;  /* time of last file status change */
-       __int32_t       st_blksize;     /* optimal blocksize for I/O */
-       __int32_t       st_blocks;      /* blocks allocated for file */
-       __uint32_t      st_flags;       /* user defined flags for file */
-       __uint32_t      st_gen;         /* file generation number */
+       __uint16_t      st_dev;         /* inode's device */
+       ino_t           st_ino;         /* inode's number */
+       mode_t          st_mode;        /* inode protection mode */
+       nlink_t         st_nlink;       /* number of hard links */
+       __uint16_t      st_uid;         /* user ID of the file's owner */
+       __uint16_t      st_gid;         /* group ID of the file's group */
+       __uint16_t      st_rdev;        /* device type */
+       __int32_t       st_size;        /* file size, in bytes */
+       struct  timespec st_atimespec;  /* time of last access */
+       struct  timespec st_mtimespec;  /* time of last data modification */
+       struct  timespec st_ctimespec;  /* time of last file status change */
+       __int32_t       st_blksize;     /* optimal blocksize for I/O */
+       __int32_t       st_blocks;      /* blocks allocated for file */
+       __uint32_t      st_flags;       /* user defined flags for file */
+       __uint32_t      st_gen;         /* file generation number */
 };
 
 #define __DARWIN_STRUCT_STAT64_TIMES \
-       struct timespec st_atimespec;           /* time of last access */ \
-       struct timespec st_mtimespec;           /* time of last data modification */ \
-       struct timespec st_ctimespec;           /* time of last status change */ \
-       struct timespec st_birthtimespec;       /* time of file creation(birth) */
+       struct timespec st_atimespec;           /* time of last access */ \
+       struct timespec st_mtimespec;           /* time of last data modification */ \
+       struct timespec st_ctimespec;           /* time of last status change */ \
+       struct timespec st_birthtimespec;       /* time of file creation(birth) */
 
 #else /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
 
 #define __DARWIN_STRUCT_STAT64_TIMES \
-       time_t          st_atime;               /* [XSI] Time of last access */ \
-       long            st_atimensec;           /* nsec of last access */ \
-       time_t          st_mtime;               /* [XSI] Last data modification time */ \
-       long            st_mtimensec;           /* last data modification nsec */ \
-       time_t          st_ctime;               /* [XSI] Time of last status change */ \
-       long            st_ctimensec;           /* nsec of last status change */ \
-       time_t          st_birthtime;           /*  File creation time(birth)  */ \
-       long            st_birthtimensec;       /* nsec of File creation time */
+       time_t          st_atime;               /* [XSI] Time of last access */ \
+       long            st_atimensec;           /* nsec of last access */ \
+       time_t          st_mtime;               /* [XSI] Last data modification time */ \
+       long            st_mtimensec;           /* last data modification nsec */ \
+       time_t          st_ctime;               /* [XSI] Time of last status change */ \
+       long            st_ctimensec;           /* nsec of last status change */ \
+       time_t          st_birthtime;           /*  File creation time(birth)  */ \
+       long            st_birthtimensec;       /* nsec of File creation time */
 
 #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
 
@@ -164,21 +164,21 @@ struct ostat {
  * number instead of 32bit ino_t and the addition of create(birth) time.
  */
 #define __DARWIN_STRUCT_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 */ \
-       __darwin_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 */ \
+       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 */ \
+       __darwin_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 */ \
        __DARWIN_STRUCT_STAT64_TIMES \
-       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! */ \
+       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! */ \
 }
 
 /*
@@ -192,32 +192,32 @@ struct stat __DARWIN_STRUCT_STAT64;
 #else /* !__DARWIN_64_BIT_INO_T */
 
 struct 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 */
+       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  timespec st_atimespec;  /* time of last access */
-       struct  timespec st_mtimespec;  /* time of last data modification */
-       struct  timespec st_ctimespec;  /* time of last status change */
+       struct  timespec st_atimespec;  /* time of last access */
+       struct  timespec st_mtimespec;  /* time of last data modification */
+       struct  timespec st_ctimespec;  /* time of last status change */
 #else
-       time_t          st_atime;       /* [XSI] Time of last access */
-       long            st_atimensec;   /* nsec of last access */
-       time_t          st_mtime;       /* [XSI] Last data modification time */
-       long            st_mtimensec;   /* last data modification nsec */
-       time_t          st_ctime;       /* [XSI] Time of last status change */
-       long            st_ctimensec;   /* nsec of last status change */
+       time_t          st_atime;       /* [XSI] Time of last access */
+       long            st_atimensec;   /* nsec of last access */
+       time_t          st_mtime;       /* [XSI] Last data modification time */
+       long            st_mtimensec;   /* last data modification nsec */
+       time_t          st_ctime;       /* [XSI] Time of last status change */
+       long            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! */
+       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! */
 };
 
 #endif /* __DARWIN_64_BIT_INO_T */
@@ -235,38 +235,38 @@ struct stat64 __DARWIN_STRUCT_STAT64;
 
 #ifdef KERNEL
 #ifdef BSD_KERNEL_PRIVATE
-/* LP64 version of struct stat.  time_t (see timespec) is a long and must 
+/* 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 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) */
-       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 */
+       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  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_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
-       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 */
+       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 */
-       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! */
+       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! */
 };
 
 /* ILP32 version of struct stat.
@@ -274,32 +274,32 @@ struct user64_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 */
+       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 */
+       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 */
+       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! */
+       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);
@@ -307,68 +307,78 @@ extern void munge_user32_stat(struct stat *sbp, struct user32_stat *usbp);
 
 
 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 */
-       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 */
+       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 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) */
+       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
-       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 */
+       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 */
-       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! */
+       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! */
 };
 
 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 */
+       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) */
+       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! */
+#if defined(__x86_64__)
+/*
+ * This packing is required to ensure symmetry between userspace and kernelspace
+ * when the kernel is 64-bit and the user application is 32-bit. All currently
+ * supported ARM slices (arm64/armv7k/arm64_32) contain the same struct
+ * alignment ABI so this packing isn't needed for ARM.
+ */
+} __attribute__((packed, aligned(4)));
 #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);
@@ -397,15 +407,15 @@ extern void munge_user32_stat64(struct stat64 *sbp, struct user32_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) & 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 */
+#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) & S_IFMT) == S_IFWHT)     /* OBSOLETE: whiteout */
+#define S_ISWHT(m)      (((m) & S_IFMT) == S_IFWHT)     /* OBSOLETE: whiteout */
 #endif
 
 /*
@@ -423,9 +433,9 @@ extern void munge_user32_stat64(struct stat64 *sbp, struct user32_stat64 *usbp);
  *             provides these macros to ensure source compatability with
  *             implementations which do.
  */
-#define        S_TYPEISMQ(buf)         (0)     /* Test for a message queue */
-#define        S_TYPEISSEM(buf)        (0)     /* Test for a semaphore */
-#define        S_TYPEISSHM(buf)        (0)     /* Test for a shared memory object */
+#define S_TYPEISMQ(buf)         (0)     /* Test for a message queue */
+#define S_TYPEISSEM(buf)        (0)     /* Test for a semaphore */
+#define S_TYPEISSHM(buf)        (0)     /* Test for a shared memory object */
 
 /*
  * [TYM] The implementation may implement typed memory objects as distinct
@@ -441,103 +451,160 @@ extern void munge_user32_stat64(struct stat64 *sbp, struct user32_stat64 *usbp);
  *             provides this macro to ensure source compatability with
  *             implementations which do.
  */
-#define        S_TYPEISTMO(buf)        (0)     /* Test for a typed memory object */
+#define S_TYPEISTMO(buf)        (0)     /* Test for a typed memory object */
 
 
 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
-#define        ACCESSPERMS     (S_IRWXU|S_IRWXG|S_IRWXO)       /* 0777 */
-                                                       /* 7777 */
-#define        ALLPERMS        (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO)
-                                                       /* 0666 */
-#define        DEFFILEMODE     (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
+#define ACCESSPERMS     (S_IRWXU|S_IRWXG|S_IRWXO)       /* 0777 */
+                                                        /* 7777 */
+#define ALLPERMS        (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO)
+/* 0666 */
+#define DEFFILEMODE     (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
 
-#define S_BLKSIZE      512             /* block size used in the stat struct */
+#define S_BLKSIZE       512             /* block size used in the stat struct */
 
 /*
  * Definitions of flags stored in file flags word.
  *
  * Super-user and owner changeable flags.
  */
-#define        UF_SETTABLE     0x0000ffff      /* mask of owner changeable flags */
-#define        UF_NODUMP       0x00000001      /* do not dump file */
-#define        UF_IMMUTABLE    0x00000002      /* file may not be changed */
-#define        UF_APPEND       0x00000004      /* writes to file may only append */
-#define UF_OPAQUE      0x00000008      /* directory is opaque wrt. union */
+#define UF_SETTABLE     0x0000ffff      /* mask of owner changeable flags */
+#define UF_NODUMP       0x00000001      /* do not dump file */
+#define UF_IMMUTABLE    0x00000002      /* file may not be changed */
+#define UF_APPEND       0x00000004      /* writes to file may only append */
+#define UF_OPAQUE       0x00000008      /* directory is opaque wrt. union */
 /*
  * The following bit is reserved for FreeBSD.  It is not implemented
  * in Mac OS X.
  */
 /* #define UF_NOUNLINK 0x00000010 */   /* file may not be removed or renamed */
-#define UF_COMPRESSED  0x00000020      /* file is hfs-compressed */
-#define UF_TRACKED             0x00000040      /* file renames and deletes are tracked */
-/* Bits 0x0080 through 0x4000 are currently undefined. */
-#define UF_HIDDEN      0x00008000      /* hint that this item should not be */
-                                       /* displayed in a GUI */
+#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
+
+#define UF_DATAVAULT    0x00000080      /* entitlement required for reading */
+                                        /* and writing */
+
+/* Bits 0x0100 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_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_SUPPORTED    0x009f0000      /* mask of superuser supported flags */
+#define SF_SETTABLE     0x3fff0000      /* mask of superuser changeable flags */
+#define SF_SYNTHETIC    0xc0000000      /* mask of system read-only synthetic 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      /* entitlement required for writing */
+#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. */
 
+#define SF_FIRMLINK     0x00800000      /* file is a firmlink */
+
+/*
+ * Synthetic flags.
+ *
+ * These are read-only.  We keep them out of SF_SUPPORTED so that
+ * attempts to set them will fail.
+ */
+#define SF_DATALESS     0x40000000     /* file is dataless object */
+
+#ifdef PRIVATE
+/*
+ * Protected flags.
+ *
+ * These flags are read-write, but can only be changed using the safe
+ * mechanism (FSIOC_CAS_BSDFLAGS).  The standard chflags(2) mechanism
+ * will simply preserve these bits as they are in the inode.
+ */
+#define UF_SF_PROTECTED (UF_COMPRESSED)
+#endif
+
 #ifdef KERNEL
 /*
  * Shorthand abbreviations of above.
  */
-#define        OPAQUE          (UF_OPAQUE)
-#define        APPEND          (UF_APPEND | SF_APPEND)
-#define        IMMUTABLE       (UF_IMMUTABLE | SF_IMMUTABLE)
+#define OPAQUE          (UF_OPAQUE)
+#define APPEND          (UF_APPEND | SF_APPEND)
+#define IMMUTABLE       (UF_IMMUTABLE | SF_IMMUTABLE)
 #endif
 #endif
 
+#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
+/*
+ * Extended flags ("EF") returned by ATTR_CMNEXT_EXT_FLAGS from getattrlist/getattrlistbulk
+ */
+#define EF_MAY_SHARE_BLOCKS     0x00000001      /* file may share blocks with another file */
+#define EF_NO_XATTRS            0x00000002      /* file has no xattrs at all */
+#define EF_IS_SYNC_ROOT         0x00000004      /* file is a sync root for iCloud */
+#define EF_IS_PURGEABLE         0x00000008      /* file is purgeable */
+#define EF_IS_SPARSE            0x00000010      /* file has at least one sparse region */
+#define EF_IS_SYNTHETIC         0x00000020      /* a synthetic directory/symlink */
+#endif
+
+
 #ifndef KERNEL
 
 __BEGIN_DECLS
 /* [XSI] */
-int    chmod(const char *, mode_t) __DARWIN_ALIAS(chmod);
-int    fchmod(int, mode_t) __DARWIN_ALIAS(fchmod);
-int    fstat(int, struct stat *) __DARWIN_INODE64(fstat);
-int    lstat(const char *, struct stat *) __DARWIN_INODE64(lstat);
-int    mkdir(const char *, mode_t);
-int    mkfifo(const char *, mode_t);
-int    stat(const char *, struct stat *) __DARWIN_INODE64(stat);
-int    mknod(const char *, mode_t, dev_t);
-mode_t umask(mode_t);
+int     chmod(const char *, mode_t) __DARWIN_ALIAS(chmod);
+int     fchmod(int, mode_t) __DARWIN_ALIAS(fchmod);
+int     fstat(int, struct stat *) __DARWIN_INODE64(fstat);
+int     lstat(const char *, struct stat *) __DARWIN_INODE64(lstat);
+int     mkdir(const char *, mode_t);
+int     mkfifo(const char *, mode_t);
+int     stat(const char *, struct stat *) __DARWIN_INODE64(stat);
+int     mknod(const char *, mode_t, dev_t);
+mode_t  umask(mode_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);
+
+#define UTIME_NOW       -1
+#define UTIME_OMIT      -2
+
+int     futimens(int __fd, const struct timespec __times[2]) __API_AVAILABLE(macosx(10.13), ios(11.0), tvos(11.0), watchos(4.0));
+int     utimensat(int __fd, const char *__path, const struct timespec __times[2],
+    int __flag) __API_AVAILABLE(macosx(10.13), ios(11.0), tvos(11.0), watchos(4.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) __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) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_4,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
+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) __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) __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);
+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) */