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 */ 564