File: /usr/include/sys/stat.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       1: /*
       2:  * Copyright (c) 2000-2014 Apple Inc. All rights reserved.
       3:  *
       4:  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
       5:  * 
       6:  * This file contains Original Code and/or Modifications of Original Code
       7:  * as defined in and that are subject to the Apple Public Source License
       8:  * Version 2.0 (the 'License'). You may not use this file except in
       9:  * compliance with the License. The rights granted to you under the License
      10:  * may not be used to create, or enable the creation or redistribution of,
      11:  * unlawful or unlicensed copies of an Apple operating system, or to
      12:  * circumvent, violate, or enable the circumvention or violation of, any
      13:  * terms of an Apple operating system software license agreement.
      14:  * 
      15:  * Please obtain a copy of the License at
      16:  * http://www.opensource.apple.com/apsl/ and read it before using this file.
      17:  * 
      18:  * The Original Code and all software distributed under the License are
      19:  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
      20:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
      21:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
      22:  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
      23:  * Please see the License for the specific language governing rights and
      24:  * limitations under the License.
      25:  * 
      26:  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
      27:  */
      28: /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
      29: /*-
      30:  * Copyright (c) 1982, 1986, 1989, 1993
      31:  *    The Regents of the University of California.  All rights reserved.
      32:  * (c) UNIX System Laboratories, Inc.
      33:  * All or some portions of this file are derived from material licensed
      34:  * to the University of California by American Telephone and Telegraph
      35:  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
      36:  * the permission of UNIX System Laboratories, Inc.
      37:  *
      38:  * Redistribution and use in source and binary forms, with or without
      39:  * modification, are permitted provided that the following conditions
      40:  * are met:
      41:  * 1. Redistributions of source code must retain the above copyright
      42:  *    notice, this list of conditions and the following disclaimer.
      43:  * 2. Redistributions in binary form must reproduce the above copyright
      44:  *    notice, this list of conditions and the following disclaimer in the
      45:  *    documentation and/or other materials provided with the distribution.
      46:  * 3. All advertising materials mentioning features or use of this software
      47:  *    must display the following acknowledgement:
      48:  *    This product includes software developed by the University of
      49:  *    California, Berkeley and its contributors.
      50:  * 4. Neither the name of the University nor the names of its contributors
      51:  *    may be used to endorse or promote products derived from this software
      52:  *    without specific prior written permission.
      53:  *
      54:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      55:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      56:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      57:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      58:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      59:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      60:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      61:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      62:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      63:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      64:  * SUCH DAMAGE.
      65:  *
      66:  *    @(#)stat.h    8.9 (Berkeley) 8/17/94
      67:  */
      68: 
      69: 
      70: #ifndef _SYS_STAT_H_
      71: #define    _SYS_STAT_H_
      72: 
      73: #include <sys/_types.h>
      74: #include <sys/cdefs.h>
      75: #include <Availability.h>
      76: 
      77: /* [XSI] The timespec structure may be defined as described in <time.h> */
      78: #include <sys/_types/_timespec.h>
      79: 
      80: /*
      81:  * [XSI] The blkcnt_t, blksize_t, dev_t, ino_t, mode_t, nlink_t, uid_t,
      82:  * gid_t, off_t, and time_t types shall be defined as described in
      83:  * <sys/types.h>.
      84:  */
      85: #include <sys/_types/_blkcnt_t.h>
      86: #include <sys/_types/_blksize_t.h>
      87: #include <sys/_types/_dev_t.h>            /* device number */
      88: #include <sys/_types/_ino_t.h>
      89: 
      90: #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
      91: #include <sys/_types/_ino64_t.h>
      92: #endif /* !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) */
      93: 
      94: #include <sys/_types/_mode_t.h>
      95: #include <sys/_types/_nlink_t.h>
      96: #include <sys/_types/_uid_t.h>
      97: #include <sys/_types/_gid_t.h>
      98: #include <sys/_types/_off_t.h>
      99: #include <sys/_types/_time_t.h>
     100: 
     101: #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
     102: /*
     103:  * XXX So deprecated, it would make your head spin
     104:  *
     105:  * The old stat structure.  In fact, this is not used by the kernel at all,
     106:  * and should not be used by user space, and should be removed from this
     107:  * header file entirely (along with the unused cvtstat() prototype in
     108:  * vnode_internal.h).
     109:  */
     110: struct ostat {
     111:     __uint16_t    st_dev;        /* inode's device */
     112:     ino_t        st_ino;        /* inode's number */
     113:     mode_t        st_mode;    /* inode protection mode */
     114:     nlink_t        st_nlink;    /* number of hard links */
     115:     __uint16_t    st_uid;        /* user ID of the file's owner */
     116:     __uint16_t    st_gid;        /* group ID of the file's group */
     117:     __uint16_t    st_rdev;    /* device type */
     118:     __int32_t    st_size;    /* file size, in bytes */
     119:     struct    timespec st_atimespec;    /* time of last access */
     120:     struct    timespec st_mtimespec;    /* time of last data modification */
     121:     struct    timespec st_ctimespec;    /* time of last file status change */
     122:     __int32_t    st_blksize;    /* optimal blocksize for I/O */
     123:     __int32_t    st_blocks;    /* blocks allocated for file */
     124:     __uint32_t    st_flags;    /* user defined flags for file */
     125:     __uint32_t    st_gen;        /* file generation number */
     126: };
     127: 
     128: #define __DARWIN_STRUCT_STAT64_TIMES \
     129:     struct timespec st_atimespec;        /* time of last access */ \
     130:     struct timespec st_mtimespec;        /* time of last data modification */ \
     131:     struct timespec st_ctimespec;        /* time of last status change */ \
     132:     struct timespec st_birthtimespec;    /* time of file creation(birth) */
     133: 
     134: #else /* (_POSIX_C_SOURCE && !_DARWIN_C_SOURCE) */
     135: 
     136: #define __DARWIN_STRUCT_STAT64_TIMES \
     137:     time_t        st_atime;        /* [XSI] Time of last access */ \
     138:     long        st_atimensec;        /* nsec of last access */ \
     139:     time_t        st_mtime;        /* [XSI] Last data modification time */ \
     140:     long        st_mtimensec;        /* last data modification nsec */ \
     141:     time_t        st_ctime;        /* [XSI] Time of last status change */ \
     142:     long        st_ctimensec;        /* nsec of last status change */ \
     143:     time_t        st_birthtime;        /*  File creation time(birth)  */ \
     144:     long        st_birthtimensec;    /* nsec of File creation time */
     145: 
     146: #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
     147: 
     148: /*
     149:  * This structure is used as the second parameter to the fstat64(),
     150:  * lstat64(), and stat64() functions, and for struct stat when
     151:  * __DARWIN_64_BIT_INO_T is set. __DARWIN_STRUCT_STAT64 is defined
     152:  * above, depending on whether we use struct timespec or the direct
     153:  * components.
     154:  *
     155:  * This is simillar to stat except for 64bit inode number
     156:  * number instead of 32bit ino_t and the addition of create(birth) time.
     157:  */
     158: #define __DARWIN_STRUCT_STAT64 { \
     159:     dev_t        st_dev;            /* [XSI] ID of device containing file */ \
     160:     mode_t        st_mode;        /* [XSI] Mode of file (see below) */ \
     161:     nlink_t        st_nlink;        /* [XSI] Number of hard links */ \
     162:     __darwin_ino64_t st_ino;        /* [XSI] File serial number */ \
     163:     uid_t        st_uid;            /* [XSI] User ID of the file */ \
     164:     gid_t        st_gid;            /* [XSI] Group ID of the file */ \
     165:     dev_t        st_rdev;        /* [XSI] Device ID */ \
     166:     __DARWIN_STRUCT_STAT64_TIMES \
     167:     off_t        st_size;        /* [XSI] file size, in bytes */ \
     168:     blkcnt_t    st_blocks;        /* [XSI] blocks allocated for file */ \
     169:     blksize_t    st_blksize;        /* [XSI] optimal blocksize for I/O */ \
     170:     __uint32_t    st_flags;        /* user defined flags for file */ \
     171:     __uint32_t    st_gen;            /* file generation number */ \
     172:     __int32_t    st_lspare;        /* RESERVED: DO NOT USE! */ \
     173:     __int64_t    st_qspare[2];        /* RESERVED: DO NOT USE! */ \
     174: }
     175: 
     176: /*
     177:  * [XSI] This structure is used as the second parameter to the fstat(),
     178:  * lstat(), and stat() functions.
     179:  */
     180: #if __DARWIN_64_BIT_INO_T
     181: 
     182: struct stat __DARWIN_STRUCT_STAT64;
     183: 
     184: #else /* !__DARWIN_64_BIT_INO_T */
     185: 
     186: struct stat {
     187:     dev_t         st_dev;        /* [XSI] ID of device containing file */
     188:     ino_t          st_ino;        /* [XSI] File serial number */
     189:     mode_t         st_mode;    /* [XSI] Mode of file (see below) */
     190:     nlink_t        st_nlink;    /* [XSI] Number of hard links */
     191:     uid_t        st_uid;        /* [XSI] User ID of the file */
     192:     gid_t        st_gid;        /* [XSI] Group ID of the file */
     193:     dev_t        st_rdev;    /* [XSI] Device ID */
     194: #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
     195:     struct    timespec st_atimespec;    /* time of last access */
     196:     struct    timespec st_mtimespec;    /* time of last data modification */
     197:     struct    timespec st_ctimespec;    /* time of last status change */
     198: #else
     199:     time_t        st_atime;    /* [XSI] Time of last access */
     200:     long        st_atimensec;    /* nsec of last access */
     201:     time_t        st_mtime;    /* [XSI] Last data modification time */
     202:     long        st_mtimensec;    /* last data modification nsec */
     203:     time_t        st_ctime;    /* [XSI] Time of last status change */
     204:     long        st_ctimensec;    /* nsec of last status change */
     205: #endif
     206:     off_t        st_size;    /* [XSI] file size, in bytes */
     207:     blkcnt_t    st_blocks;    /* [XSI] blocks allocated for file */
     208:     blksize_t    st_blksize;    /* [XSI] optimal blocksize for I/O */
     209:     __uint32_t    st_flags;    /* user defined flags for file */
     210:     __uint32_t    st_gen;        /* file generation number */
     211:     __int32_t    st_lspare;    /* RESERVED: DO NOT USE! */
     212:     __int64_t    st_qspare[2];    /* RESERVED: DO NOT USE! */
     213: };
     214: 
     215: #endif /* __DARWIN_64_BIT_INO_T */
     216: 
     217: #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
     218: 
     219: #if !__DARWIN_ONLY_64_BIT_INO_T
     220: 
     221: struct stat64 __DARWIN_STRUCT_STAT64;
     222: 
     223: #endif /* !__DARWIN_ONLY_64_BIT_INO_T */
     224: 
     225: #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
     226: 
     227: 
     228: 
     229: 
     230: #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
     231: #define st_atime st_atimespec.tv_sec
     232: #define st_mtime st_mtimespec.tv_sec
     233: #define st_ctime st_ctimespec.tv_sec
     234: #define st_birthtime st_birthtimespec.tv_sec
     235: #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
     236: 
     237: /*
     238:  * [XSI] The following are symbolic names for the values of type mode_t.  They
     239:  * are bitmap values.
     240:  */
     241: #include <sys/_types/_s_ifmt.h>
     242: 
     243: /*
     244:  * [XSI] The following macros shall be provided to test whether a file is
     245:  * of the specified type.  The value m supplied to the macros is the value
     246:  * of st_mode from a stat structure.  The macro shall evaluate to a non-zero
     247:  * value if the test is true; 0 if the test is false.
     248:  */
     249: #define    S_ISBLK(m)    (((m) & S_IFMT) == S_IFBLK)    /* block special */
     250: #define    S_ISCHR(m)    (((m) & S_IFMT) == S_IFCHR)    /* char special */
     251: #define    S_ISDIR(m)    (((m) & S_IFMT) == S_IFDIR)    /* directory */
     252: #define    S_ISFIFO(m)    (((m) & S_IFMT) == S_IFIFO)    /* fifo or socket */
     253: #define    S_ISREG(m)    (((m) & S_IFMT) == S_IFREG)    /* regular file */
     254: #define    S_ISLNK(m)    (((m) & S_IFMT) == S_IFLNK)    /* symbolic link */
     255: #define    S_ISSOCK(m)    (((m) & S_IFMT) == S_IFSOCK)    /* socket */
     256: #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
     257: #define    S_ISWHT(m)    (((m) & S_IFMT) == S_IFWHT)    /* OBSOLETE: whiteout */
     258: #endif
     259: 
     260: /*
     261:  * [XSI] The implementation may implement message queues, semaphores, or
     262:  * shared memory objects as distinct file types.  The following macros
     263:  * shall be provided to test whether a file is of the specified type.
     264:  * The value of the buf argument supplied to the macros is a pointer to
     265:  * a stat structure.  The macro shall evaluate to a non-zero value if
     266:  * the specified object is implemented as a distinct file type and the
     267:  * specified file type is contained in the stat structure referenced by
     268:  * buf.  Otherwise, the macro shall evaluate to zero.
     269:  *
     270:  * NOTE:    The current implementation does not do this, although
     271:  *        this may change in future revisions, and co currently only
     272:  *        provides these macros to ensure source compatability with
     273:  *        implementations which do.
     274:  */
     275: #define    S_TYPEISMQ(buf)        (0)    /* Test for a message queue */
     276: #define    S_TYPEISSEM(buf)    (0)    /* Test for a semaphore */
     277: #define    S_TYPEISSHM(buf)    (0)    /* Test for a shared memory object */
     278: 
     279: /*
     280:  * [TYM] The implementation may implement typed memory objects as distinct
     281:  * file types, and the following macro shall test whether a file is of the
     282:  * specified type.  The value of the buf argument supplied to the macros is
     283:  * a pointer to a stat structure.  The macro shall evaluate to a non-zero
     284:  * value if the specified object is implemented as a distinct file type and
     285:  * the specified file type is contained in the stat structure referenced by
     286:  * buf.  Otherwise, the macro shall evaluate to zero.
     287:  *
     288:  * NOTE:    The current implementation does not do this, although
     289:  *        this may change in future revisions, and co currently only
     290:  *        provides this macro to ensure source compatability with
     291:  *        implementations which do.
     292:  */
     293: #define    S_TYPEISTMO(buf)    (0)    /* Test for a typed memory object */
     294: 
     295: 
     296: #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
     297: #define    ACCESSPERMS    (S_IRWXU|S_IRWXG|S_IRWXO)    /* 0777 */
     298:                             /* 7777 */
     299: #define    ALLPERMS    (S_ISUID|S_ISGID|S_ISTXT|S_IRWXU|S_IRWXG|S_IRWXO)
     300:                             /* 0666 */
     301: #define    DEFFILEMODE    (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
     302: 
     303: #define S_BLKSIZE    512        /* block size used in the stat struct */
     304: 
     305: /*
     306:  * Definitions of flags stored in file flags word.
     307:  *
     308:  * Super-user and owner changeable flags.
     309:  */
     310: #define    UF_SETTABLE    0x0000ffff    /* mask of owner changeable flags */
     311: #define    UF_NODUMP    0x00000001    /* do not dump file */
     312: #define    UF_IMMUTABLE    0x00000002    /* file may not be changed */
     313: #define    UF_APPEND    0x00000004    /* writes to file may only append */
     314: #define UF_OPAQUE    0x00000008    /* directory is opaque wrt. union */
     315: /*
     316:  * The following bit is reserved for FreeBSD.  It is not implemented
     317:  * in Mac OS X.
     318:  */
     319: /* #define UF_NOUNLINK    0x00000010 */    /* file may not be removed or renamed */
     320: #define UF_COMPRESSED    0x00000020    /* file is hfs-compressed */
     321: 
     322: /* UF_TRACKED is used for dealing with document IDs.  We no longer issue
     323:    notifications for deletes or renames for files which have UF_TRACKED set. */
     324: #define UF_TRACKED        0x00000040
     325: 
     326: /* Bits 0x0080 through 0x4000 are currently undefined. */
     327: #define UF_HIDDEN    0x00008000    /* hint that this item should not be */
     328:                     /* displayed in a GUI */
     329: /*
     330:  * Super-user changeable flags.
     331:  */
     332: #define    SF_SUPPORTED    0x001f0000    /* mask of superuser supported flags */
     333: #define    SF_SETTABLE    0xffff0000    /* mask of superuser changeable flags */
     334: #define    SF_ARCHIVED    0x00010000    /* file is archived */
     335: #define    SF_IMMUTABLE    0x00020000    /* file may not be changed */
     336: #define    SF_APPEND    0x00040000    /* writes to file may only append */
     337: #define SF_RESTRICTED    0x00080000    /* restricted access */
     338: #define SF_NOUNLINK    0x00100000    /* Item may not be removed, renamed or mounted on */
     339: 
     340: /*
     341:  * The following two bits are reserved for FreeBSD.  They are not
     342:  * implemented in Mac OS X.
     343:  */
     344: /* #define SF_SNAPSHOT    0x00200000 */    /* snapshot inode */
     345: /* NOTE: There is no SF_HIDDEN bit. */
     346: 
     347: #endif
     348: 
     349: 
     350: __BEGIN_DECLS
     351: /* [XSI] */
     352: int    chmod(const char *, mode_t) __DARWIN_ALIAS(chmod);
     353: int    fchmod(int, mode_t) __DARWIN_ALIAS(fchmod);
     354: int    fstat(int, struct stat *) __DARWIN_INODE64(fstat);
     355: int    lstat(const char *, struct stat *) __DARWIN_INODE64(lstat);
     356: int    mkdir(const char *, mode_t);
     357: int    mkfifo(const char *, mode_t);
     358: int    stat(const char *, struct stat *) __DARWIN_INODE64(stat);
     359: int    mknod(const char *, mode_t, dev_t);
     360: mode_t    umask(mode_t);
     361: 
     362: #if __DARWIN_C_LEVEL >= 200809L
     363: int    fchmodat(int, const char *, mode_t, int) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
     364: int    fstatat(int, const char *, struct stat *, int) __DARWIN_INODE64(fstatat) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
     365: int    mkdirat(int, const char *, mode_t) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
     366: #endif
     367: 
     368: #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
     369: 
     370: #include <sys/_types/_filesec_t.h>
     371: 
     372: int    chflags(const char *, __uint32_t);
     373: int    chmodx_np(const char *, filesec_t);
     374: int    fchflags(int, __uint32_t);
     375: int    fchmodx_np(int, filesec_t);
     376: int    fstatx_np(int, struct stat *, filesec_t) __DARWIN_INODE64(fstatx_np);
     377: int    lchflags(const char *, __uint32_t) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
     378: int    lchmod(const char *, mode_t) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
     379: int    lstatx_np(const char *, struct stat *, filesec_t) __DARWIN_INODE64(lstatx_np);
     380: int    mkdirx_np(const char *, filesec_t);
     381: int    mkfifox_np(const char *, filesec_t);
     382: int    statx_np(const char *, struct stat *, filesec_t) __DARWIN_INODE64(statx_np);
     383: int    umaskx_np(filesec_t) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_4,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
     384: 
     385: #if !__DARWIN_ONLY_64_BIT_INO_T
     386: /* The following deprecated routines are simillar to stat and friends except provide struct stat64 instead of struct stat  */
     387: int    fstatx64_np(int, struct stat64 *, filesec_t) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
     388: int    lstatx64_np(const char *, struct stat64 *, filesec_t) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
     389: int    statx64_np(const char *, struct stat64 *, filesec_t) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
     390: int    fstat64(int, struct stat64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
     391: int    lstat64(const char *, struct stat64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
     392: int    stat64(const char *, struct stat64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
     393: #endif /* !__DARWIN_ONLY_64_BIT_INO_T */
     394: #endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
     395: 
     396: __END_DECLS
     397: #endif /* !_SYS_STAT_H_ */
     398: