1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
  24  */
  25 
  26 /*      Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
  27 /*      Copyright (c) 1984, 1986, 1987, 1988, 1989, 1990 AT&T       */
  28 /*      All Rights Reserved     */
  29 
  30 #ifndef _SYS_STAT_H
  31 #define _SYS_STAT_H
  32 
  33 #include <sys/feature_tests.h>
  34 #include <sys/types.h>
  35 
  36 #ifdef  __cplusplus
  37 extern "C" {
  38 #endif
  39 
  40 /*
  41  * The implementation specific header <sys/time_impl.h> includes a
  42  * definition for timestruc_t needed by the stat structure.  However,
  43  * including either <time.h>, which includes <sys/time_impl.h>, or
  44  * including <sys/time_impl.h> directly will break both X/Open and
  45  * POSIX namespace. Preceeding tag, structure, and structure member
  46  * names with underscores eliminates the namespace breakage and at the
  47  * same time, with unique type names, eliminates the possibility of
  48  * timespec_t or timestruct_t naming conflicts that could otherwise
  49  * result based on the order of inclusion of <sys/stat.h> and
  50  * <sys/time.h>.  The header <sys/time_std_impl.h> contains the
  51  * standards namespace safe versions of these definitions.
  52  */
  53 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
  54 #include <sys/time_impl.h>
  55 #else
  56 #include <sys/time_std_impl.h>
  57 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
  58 
  59 #define _ST_FSTYPSZ 16          /* array size for file system type name */
  60 
  61 /*
  62  * stat structure, used by stat(2) and fstat(2)
  63  */
  64 
  65 #if defined(_KERNEL)
  66 
  67         /* Expanded stat structure */
  68 
  69 #if defined(_LP64)
  70 
  71 struct stat {
  72         dev_t           st_dev;
  73         ino_t           st_ino;
  74         mode_t          st_mode;
  75         nlink_t         st_nlink;
  76         uid_t           st_uid;
  77         gid_t           st_gid;
  78         dev_t           st_rdev;
  79         off_t           st_size;
  80         timestruc_t     st_atim;
  81         timestruc_t     st_mtim;
  82         timestruc_t     st_ctim;
  83         blksize_t       st_blksize;
  84         blkcnt_t        st_blocks;
  85         char            st_fstype[_ST_FSTYPSZ];
  86 };
  87 
  88 struct stat64 {
  89         dev_t           st_dev;
  90         ino_t           st_ino;
  91         mode_t          st_mode;
  92         nlink_t         st_nlink;
  93         uid_t           st_uid;
  94         gid_t           st_gid;
  95         dev_t           st_rdev;
  96         off_t           st_size;
  97         timestruc_t     st_atim;
  98         timestruc_t     st_mtim;
  99         timestruc_t     st_ctim;
 100         blksize_t       st_blksize;
 101         blkcnt_t        st_blocks;
 102         char            st_fstype[_ST_FSTYPSZ];
 103 };
 104 
 105 #else   /* _LP64 */
 106 
 107 struct  stat {
 108         dev_t           st_dev;
 109         long            st_pad1[3];     /* reserve for dev expansion, */
 110                                         /* sysid definition */
 111         ino_t           st_ino;
 112         mode_t          st_mode;
 113         nlink_t         st_nlink;
 114         uid_t           st_uid;
 115         gid_t           st_gid;
 116         dev_t           st_rdev;
 117         long            st_pad2[2];
 118         off_t           st_size;
 119         long            st_pad3;        /* pad for future off_t expansion */
 120         timestruc_t     st_atim;
 121         timestruc_t     st_mtim;
 122         timestruc_t     st_ctim;
 123         blksize_t       st_blksize;
 124         blkcnt_t        st_blocks;
 125         char            st_fstype[_ST_FSTYPSZ];
 126         long            st_pad4[8];     /* expansion area */
 127 };
 128 
 129 struct  stat64 {
 130         dev_t           st_dev;
 131         long            st_pad1[3];     /* reserve for dev expansion, */
 132                                 /* sysid definition */
 133         ino64_t         st_ino;
 134         mode_t          st_mode;
 135         nlink_t         st_nlink;
 136         uid_t           st_uid;
 137         gid_t           st_gid;
 138         dev_t           st_rdev;
 139         long            st_pad2[2];
 140         off64_t         st_size;        /* large file support */
 141         timestruc_t     st_atim;
 142         timestruc_t     st_mtim;
 143         timestruc_t     st_ctim;
 144         blksize_t       st_blksize;
 145         blkcnt64_t      st_blocks;      /* large file support */
 146         char            st_fstype[_ST_FSTYPSZ];
 147         long            st_pad4[8];     /* expansion area */
 148 };
 149 
 150 #endif  /* _LP64 */
 151 
 152 #else /* !defined(_KERNEL) */
 153 
 154 /*
 155  * large file compilation environment setup
 156  */
 157 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
 158 #ifdef  __PRAGMA_REDEFINE_EXTNAME
 159 #pragma redefine_extname        fstat   fstat64
 160 #pragma redefine_extname        stat    stat64
 161 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) || \
 162         defined(_ATFILE_SOURCE)
 163 #pragma redefine_extname        fstatat fstatat64
 164 #endif /* defined (_ATFILE_SOURCE) */
 165 
 166 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG_2) || defined(__EXTENSIONS__)
 167 #pragma redefine_extname        lstat   lstat64
 168 #endif
 169 #else   /* __PRAGMA_REDEFINE_EXTNAME */
 170 #define fstat   fstat64
 171 #define stat    stat64
 172 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) || \
 173         defined(_ATFILE_SOURCE)
 174 #define fstatat fstatat64
 175 #endif /* defined (_ATFILE_SOURCE) */
 176 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG_2) || defined(__EXTENSIONS__)
 177 #define lstat   lstat64
 178 #endif
 179 #endif  /* __PRAGMA_REDEFINE_EXTNAME */
 180 #endif  /* !_LP64 && _FILE_OFFSET_BITS == 64 */
 181 
 182 /*
 183  * In the LP64 compilation environment, map large file interfaces
 184  * back to native versions where possible.
 185  */
 186 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
 187 #ifdef  __PRAGMA_REDEFINE_EXTNAME
 188 #pragma redefine_extname        fstat64 fstat
 189 #pragma redefine_extname        stat64  stat
 190 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) || \
 191         defined(_ATFILE_SOURCE)
 192 #pragma redefine_extname        fstatat64 fstatat
 193 #endif /* defined (_ATFILE_SOURCE) */
 194 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG_2) || defined(__EXTENSIONS__)
 195 #pragma redefine_extname        lstat64 lstat
 196 #endif
 197 #else   /* __PRAGMA_REDEFINE_EXTNAME */
 198 #define fstat64 fstat
 199 #define stat64  stat
 200 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) || \
 201         defined(_ATFILE_SOURCE)
 202 #define fstatat64       fstatat
 203 #endif /* defined (_ATFILE_SOURCE) */
 204 #if !defined(__XOPEN_OR_POSIX) || defined(_XPG_2) || defined(__EXTENSIONS__)
 205 #define lstat64 lstat
 206 #endif
 207 #endif  /* __PRAGMA_REDEFINE_EXTNAME */
 208 #endif  /* _LP64 && _LARGEFILE64_SOURCE */
 209 
 210 /*
 211  * User level stat structure definitions.
 212  */
 213 
 214 #if defined(_LP64)
 215 
 216 struct stat {
 217         dev_t           st_dev;
 218         ino_t           st_ino;
 219         mode_t          st_mode;
 220         nlink_t         st_nlink;
 221         uid_t           st_uid;
 222         gid_t           st_gid;
 223         dev_t           st_rdev;
 224         off_t           st_size;
 225 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
 226         timestruc_t     st_atim;
 227         timestruc_t     st_mtim;
 228         timestruc_t     st_ctim;
 229 #else
 230         _timestruc_t    st_atim;
 231         _timestruc_t    st_mtim;
 232         _timestruc_t    st_ctim;
 233 #endif
 234         blksize_t       st_blksize;
 235         blkcnt_t        st_blocks;
 236         char            st_fstype[_ST_FSTYPSZ];
 237 };
 238 
 239 #else   /* _LP64 */
 240 
 241 struct  stat {
 242         dev_t           st_dev;
 243         long            st_pad1[3];     /* reserved for network id */
 244         ino_t           st_ino;
 245         mode_t          st_mode;
 246         nlink_t         st_nlink;
 247         uid_t           st_uid;
 248         gid_t           st_gid;
 249         dev_t           st_rdev;
 250         long            st_pad2[2];
 251         off_t           st_size;
 252 #if _FILE_OFFSET_BITS != 64
 253         long            st_pad3;        /* future off_t expansion */
 254 #endif
 255 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
 256         timestruc_t     st_atim;
 257         timestruc_t     st_mtim;
 258         timestruc_t     st_ctim;
 259 #else
 260         _timestruc_t    st_atim;
 261         _timestruc_t    st_mtim;
 262         _timestruc_t    st_ctim;
 263 #endif
 264         blksize_t       st_blksize;
 265         blkcnt_t        st_blocks;
 266         char            st_fstype[_ST_FSTYPSZ];
 267         long            st_pad4[8];     /* expansion area */
 268 };
 269 
 270 #endif  /* _LP64 */
 271 
 272 /* transitional large file interface version */
 273 #if     defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
 274             !defined(__PRAGMA_REDEFINE_EXTNAME))
 275 #if defined(_LP64)
 276 
 277 struct stat64 {
 278         dev_t           st_dev;
 279         ino_t           st_ino;
 280         mode_t          st_mode;
 281         nlink_t         st_nlink;
 282         uid_t           st_uid;
 283         gid_t           st_gid;
 284         dev_t           st_rdev;
 285         off_t           st_size;
 286 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
 287         timestruc_t     st_atim;
 288         timestruc_t     st_mtim;
 289         timestruc_t     st_ctim;
 290 #else
 291         _timestruc_t    st_atim;
 292         _timestruc_t    st_mtim;
 293         _timestruc_t    st_ctim;
 294 #endif
 295         blksize_t       st_blksize;
 296         blkcnt_t        st_blocks;
 297         char            st_fstype[_ST_FSTYPSZ];
 298 };
 299 
 300 #else   /* _LP64 */
 301 
 302 struct  stat64 {
 303         dev_t           st_dev;
 304         long            st_pad1[3];     /* reserved for network id */
 305         ino64_t         st_ino;
 306         mode_t          st_mode;
 307         nlink_t         st_nlink;
 308         uid_t           st_uid;
 309         gid_t           st_gid;
 310         dev_t           st_rdev;
 311         long            st_pad2[2];
 312         off64_t         st_size;
 313 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
 314         timestruc_t     st_atim;
 315         timestruc_t     st_mtim;
 316         timestruc_t     st_ctim;
 317 #else
 318         _timestruc_t    st_atim;
 319         _timestruc_t    st_mtim;
 320         _timestruc_t    st_ctim;
 321 #endif
 322         blksize_t       st_blksize;
 323         blkcnt64_t      st_blocks;
 324         char            st_fstype[_ST_FSTYPSZ];
 325         long            st_pad4[8];     /* expansion area */
 326 };
 327 
 328 #endif  /* _LP64 */
 329 #endif
 330 
 331 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__)
 332 #define st_atime        st_atim.tv_sec
 333 #define st_mtime        st_mtim.tv_sec
 334 #define st_ctime        st_ctim.tv_sec
 335 #else
 336 #define st_atime        st_atim.__tv_sec
 337 #define st_mtime        st_mtim.__tv_sec
 338 #define st_ctime        st_ctim.__tv_sec
 339 #endif /* !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) */
 340 
 341 #endif /* end defined(_KERNEL) */
 342 
 343 #if defined(_SYSCALL32)
 344 
 345 /*
 346  * Kernel's view of user ILP32 stat and stat64 structures
 347  */
 348 
 349 struct stat32 {
 350         dev32_t         st_dev;
 351         int32_t         st_pad1[3];
 352         ino32_t         st_ino;
 353         mode32_t        st_mode;
 354         nlink32_t       st_nlink;
 355         uid32_t         st_uid;
 356         gid32_t         st_gid;
 357         dev32_t         st_rdev;
 358         int32_t         st_pad2[2];
 359         off32_t         st_size;
 360         int32_t         st_pad3;
 361         timestruc32_t   st_atim;
 362         timestruc32_t   st_mtim;
 363         timestruc32_t   st_ctim;
 364         int32_t         st_blksize;
 365         blkcnt32_t      st_blocks;
 366         char            st_fstype[_ST_FSTYPSZ];
 367         int32_t         st_pad4[8];
 368 };
 369 
 370 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
 371 #pragma pack(4)
 372 #endif
 373 
 374 struct stat64_32 {
 375         dev32_t         st_dev;
 376         int32_t         st_pad1[3];
 377         ino64_t         st_ino;
 378         mode32_t        st_mode;
 379         nlink32_t       st_nlink;
 380         uid32_t         st_uid;
 381         gid32_t         st_gid;
 382         dev32_t         st_rdev;
 383         int32_t         st_pad2[2];
 384         off64_t         st_size;
 385         timestruc32_t   st_atim;
 386         timestruc32_t   st_mtim;
 387         timestruc32_t   st_ctim;
 388         int32_t         st_blksize;
 389         blkcnt64_t      st_blocks;
 390         char            st_fstype[_ST_FSTYPSZ];
 391         int32_t         st_pad4[8];
 392 };
 393 
 394 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
 395 #pragma pack()
 396 #endif
 397 
 398 #endif  /* _SYSCALL32 */
 399 
 400 /* MODE MASKS */
 401 
 402 /* de facto standard definitions */
 403 
 404 #define S_IFMT          0xF000  /* type of file */
 405 #define S_IAMB          0x1FF   /* access mode bits */
 406 #define S_IFIFO         0x1000  /* fifo */
 407 #define S_IFCHR         0x2000  /* character special */
 408 #define S_IFDIR         0x4000  /* directory */
 409 /* XENIX definitions are not relevant to Solaris */
 410 #define S_IFNAM         0x5000  /* XENIX special named file */
 411 #define S_INSEM         0x1     /* XENIX semaphore subtype of IFNAM */
 412 #define S_INSHD         0x2     /* XENIX shared data subtype of IFNAM */
 413 #define S_IFBLK         0x6000  /* block special */
 414 #define S_IFREG         0x8000  /* regular */
 415 #define S_IFLNK         0xA000  /* symbolic link */
 416 #define S_IFSOCK        0xC000  /* socket */
 417 #define S_IFDOOR        0xD000  /* door */
 418 #define S_IFPORT        0xE000  /* event port */
 419 #define S_ISUID         0x800   /* set user id on execution */
 420 #define S_ISGID         0x400   /* set group id on execution */
 421 #define S_ISVTX         0x200   /* save swapped text even after use */
 422 #define S_IREAD         00400   /* read permission, owner */
 423 #define S_IWRITE        00200   /* write permission, owner */
 424 #define S_IEXEC         00100   /* execute/search permission, owner */
 425 #define S_ENFMT         S_ISGID /* record locking enforcement flag */
 426 
 427 /* the following macros are for POSIX conformance */
 428 
 429 #define S_IRWXU         00700   /* read, write, execute: owner */
 430 #define S_IRUSR         00400   /* read permission: owner */
 431 #define S_IWUSR         00200   /* write permission: owner */
 432 #define S_IXUSR         00100   /* execute permission: owner */
 433 #define S_IRWXG         00070   /* read, write, execute: group */
 434 #define S_IRGRP         00040   /* read permission: group */
 435 #define S_IWGRP         00020   /* write permission: group */
 436 #define S_IXGRP         00010   /* execute permission: group */
 437 #define S_IRWXO         00007   /* read, write, execute: other */
 438 #define S_IROTH         00004   /* read permission: other */
 439 #define S_IWOTH         00002   /* write permission: other */
 440 #define S_IXOTH         00001   /* execute permission: other */
 441 
 442 
 443 #define S_ISFIFO(mode)  (((mode)&0xF000) == 0x1000)
 444 #define S_ISCHR(mode)   (((mode)&0xF000) == 0x2000)
 445 #define S_ISDIR(mode)   (((mode)&0xF000) == 0x4000)
 446 #define S_ISBLK(mode)   (((mode)&0xF000) == 0x6000)
 447 #define S_ISREG(mode)   (((mode)&0xF000) == 0x8000)
 448 #define S_ISLNK(mode)   (((mode)&0xF000) == 0xa000)
 449 #define S_ISSOCK(mode)  (((mode)&0xF000) == 0xc000)
 450 #define S_ISDOOR(mode)  (((mode)&0xF000) == 0xd000)
 451 #define S_ISPORT(mode)  (((mode)&0xF000) == 0xe000)
 452 
 453 /* POSIX.4 macros */
 454 #define S_TYPEISMQ(_buf)        (0)
 455 #define S_TYPEISSEM(_buf)       (0)
 456 #define S_TYPEISSHM(_buf)       (0)
 457 
 458 #if defined(__i386) || (defined(__i386_COMPAT) && defined(_KERNEL))
 459 
 460 /*
 461  * A version number is included in the x86 SVR4 stat and mknod interfaces
 462  * so that SVR4 binaries can be supported.  An LP64 kernel that supports
 463  * the i386 ABI need to be aware of this too.
 464  */
 465 
 466 #define _R3_MKNOD_VER   1       /* SVR3.0 mknod */
 467 #define _MKNOD_VER      2       /* current version of mknod */
 468 #define _R3_STAT_VER    1       /* SVR3.0 stat */
 469 #define _STAT_VER       2       /* current version of stat */
 470 
 471 #endif  /* __i386 || (__i386_COMPAT && _KERNEL) */
 472 
 473 #if defined(__EXTENSIONS__) || \
 474         (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
 475         /* || defined(_XPG7) */
 476 /* for use with futimens() and utimensat() */
 477 #define UTIME_NOW       -1L
 478 #define UTIME_OMIT      -2L
 479 #endif  /* defined(__EXTENSIONS__) ... */
 480 
 481 #if !defined(_KERNEL) || defined(_BOOT)
 482 
 483 #if defined(__STDC__)
 484 
 485 #if !defined(__XOPEN_OR_POSIX) || (_POSIX_C_SOURCE > 2) || \
 486         defined(_XPG4_2) || defined(__EXTENSIONS__)
 487 extern int fchmod(int, mode_t);
 488 #endif /* !defined(__XOPEN_OR_POSIX) || (_POSIX_C_SOURCE > 2)... */
 489 
 490 extern int chmod(const char *, mode_t);
 491 extern int mkdir(const char *, mode_t);
 492 extern int mkfifo(const char *, mode_t);
 493 extern mode_t umask(mode_t);
 494 
 495 /* transitional large file interfaces */
 496 #if     defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
 497             !defined(__PRAGMA_REDEFINE_EXTNAME))
 498 extern int fstat64(int, struct stat64 *);
 499 extern int stat64(const char *_RESTRICT_KYWD, struct stat64 *_RESTRICT_KYWD);
 500 extern int lstat64(const char *_RESTRICT_KYWD, struct stat64 *_RESTRICT_KYWD);
 501 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) || \
 502         defined(_ATFILE_SOURCE)
 503 extern int fstatat64(int, const char *, struct stat64 *, int);
 504 #endif /* defined (_ATFILE_SOURCE) */
 505 #endif
 506 
 507 #if defined(__EXTENSIONS__) || defined(_ATFILE_SOURCE) || \
 508         (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
 509         /* || defined(_XPG7) */
 510 extern int mkdirat(int, const char *, mode_t);
 511 extern int mkfifoat(int, const char *, mode_t);
 512 extern int mknodat(int, const char *, mode_t, dev_t);
 513 extern int fchmodat(int, const char *, mode_t, int);
 514 extern int futimens(int, const struct timespec[2]);
 515 extern int utimensat(int, const char *, const struct timespec[2], int);
 516 #endif  /* defined(__EXTENSIONS__) ... */
 517 
 518 #else /* !__STDC__ */
 519 
 520 #if !defined(__XOPEN_OR_POSIX) || (_POSIX_C_SOURCE > 2) || \
 521         defined(_XPG4_2) || defined(__EXTENSIONS__)
 522 extern int fchmod();
 523 #endif /* !defined(__XOPEN_OR_POSIX) || (_POSIX_C_SOURCE > 2)... */
 524 
 525 extern int chmod();
 526 extern int mkdir();
 527 extern int mkfifo();
 528 extern mode_t umask();
 529 
 530 /* transitional large file interfaces */
 531 #if     defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
 532             !defined(__PRAGMA_REDEFINE_EXTNAME))
 533 extern int fstat64();
 534 extern int stat64();
 535 extern int lstat64();
 536 #if !defined(__XOPEN_OR_POSIX) || defined(__EXTENSIONS__) || \
 537         defined(_ATFILE_SOURCE)
 538 extern int fstatat64();
 539 #endif /* defined (_ATFILE_SOURCE) */
 540 #endif
 541 
 542 #if defined(__EXTENSIONS__) || defined(_ATFILE_SOURCE) || \
 543         (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX))
 544         /* || defined(_XPG7) */
 545 extern int mkdirat();
 546 extern int mkfifoat();
 547 extern int mknodat();
 548 extern int fchmodat();
 549 extern int futimens();
 550 extern int utimensat();
 551 #endif  /* defined(__EXTENSIONS__) ... */
 552 
 553 #endif /* defined(__STDC__) */
 554 
 555 #include <sys/stat_impl.h>
 556 
 557 #endif /* !defined(_KERNEL) */
 558 
 559 #ifdef  __cplusplus
 560 }
 561 #endif
 562 
 563 #endif  /* _SYS_STAT_H */