1 /* Copyright (C) 1991, 1992, 1995-2004, 2005, 2006, 2007, 2009, 2010 2 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, write to the Free 17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18 02111-1307 USA. */ 19 20 /* 21 * POSIX Standard: 5.6 File Characteristics <sys/stat.h> 22 */ 23 24 #ifndef _SYS_STAT_H 25 #define _SYS_STAT_H 1 26 27 #include <features.h> 28 29 #include <bits/types.h> /* For __mode_t and __dev_t. */ 30 31 #if defined __USE_XOPEN || defined __USE_XOPEN2K || defined __USE_MISC \ 32 || defined __USE_ATFILE 33 # if defined __USE_XOPEN || defined __USE_XOPEN2K 34 # define __need_time_t 35 # endif 36 # if defined __USE_MISC || defined __USE_ATFILE 37 # define __need_timespec 38 # endif 39 # include <time.h> /* For time_t resp. timespec. */ 40 #endif 41 42 #if defined __USE_XOPEN || defined __USE_XOPEN2K 43 /* The Single Unix specification says that some more types are 44 available here. */ 45 # ifndef __dev_t_defined 46 typedef __dev_t dev_t; 47 # define __dev_t_defined 48 # endif 49 50 # ifndef __gid_t_defined 51 typedef __gid_t gid_t; 52 # define __gid_t_defined 53 # endif 54 55 # ifndef __ino_t_defined 56 # ifndef __USE_FILE_OFFSET64 57 typedef __ino_t ino_t; 58 # else 59 typedef __ino64_t ino_t; 60 # endif 61 # define __ino_t_defined 62 # endif 63 64 # ifndef __mode_t_defined 65 typedef __mode_t mode_t; 66 # define __mode_t_defined 67 # endif 68 69 # ifndef __nlink_t_defined 70 typedef __nlink_t nlink_t; 71 # define __nlink_t_defined 72 # endif 73 74 # ifndef __off_t_defined 75 # ifndef __USE_FILE_OFFSET64 76 typedef __off_t off_t; 77 # else 78 typedef __off64_t off_t; 79 # endif 80 # define __off_t_defined 81 # endif 82 83 # ifndef __uid_t_defined 84 typedef __uid_t uid_t; 85 # define __uid_t_defined 86 # endif 87 #endif /* X/Open */ 88 89 #ifdef __USE_UNIX98 90 # ifndef __blkcnt_t_defined 91 # ifndef __USE_FILE_OFFSET64 92 typedef __blkcnt_t blkcnt_t; 93 # else 94 typedef __blkcnt64_t blkcnt_t; 95 # endif 96 # define __blkcnt_t_defined 97 # endif 98 99 # ifndef __blksize_t_defined 100 typedef __blksize_t blksize_t; 101 # define __blksize_t_defined 102 # endif 103 #endif /* Unix98 */ 104 105 __BEGIN_DECLS 106 107 #include <bits/stat.h> 108 109 #if defined __USE_BSD || defined __USE_MISC || defined __USE_XOPEN 110 # define S_IFMT __S_IFMT 111 # define S_IFDIR __S_IFDIR 112 # define S_IFCHR __S_IFCHR 113 # define S_IFBLK __S_IFBLK 114 # define S_IFREG __S_IFREG 115 # ifdef __S_IFIFO 116 # define S_IFIFO __S_IFIFO 117 # endif 118 # ifdef __S_IFLNK 119 # define S_IFLNK __S_IFLNK 120 # endif 121 # if (defined __USE_BSD || defined __USE_MISC || defined __USE_UNIX98) \ 122 && defined __S_IFSOCK 123 # define S_IFSOCK __S_IFSOCK 124 # endif 125 #endif 126 127 /* Test macros for file types. */ 128 129 #define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask)) 130 131 #define S_ISDIR(mode) __S_ISTYPE((mode), __S_IFDIR) 132 #define S_ISCHR(mode) __S_ISTYPE((mode), __S_IFCHR) 133 #define S_ISBLK(mode) __S_ISTYPE((mode), __S_IFBLK) 134 #define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG) 135 #ifdef __S_IFIFO 136 # define S_ISFIFO(mode) __S_ISTYPE((mode), __S_IFIFO) 137 #endif 138 #ifdef __S_IFLNK 139 # define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK) 140 #endif 141 142 #if defined __USE_BSD && !defined __S_IFLNK 143 # define S_ISLNK(mode) 0 144 #endif 145 146 #if (defined __USE_BSD || defined __USE_UNIX98 || defined __USE_XOPEN2K) \ 147 && defined __S_IFSOCK 148 # define S_ISSOCK(mode) __S_ISTYPE((mode), __S_IFSOCK) 149 #elif defined __USE_XOPEN2K 150 # define S_ISSOCK(mode) 0 151 #endif 152 153 /* These are from POSIX.1b. If the objects are not implemented using separate 154 distinct file types, the macros always will evaluate to zero. Unlike the 155 other S_* macros the following three take a pointer to a `struct stat' 156 object as the argument. */ 157 #ifdef __USE_POSIX199309 158 # define S_TYPEISMQ(buf) __S_TYPEISMQ(buf) 159 # define S_TYPEISSEM(buf) __S_TYPEISSEM(buf) 160 # define S_TYPEISSHM(buf) __S_TYPEISSHM(buf) 161 #endif 162 163 164 /* Protection bits. */ 165 166 #define S_ISUID __S_ISUID /* Set user ID on execution. */ 167 #define S_ISGID __S_ISGID /* Set group ID on execution. */ 168 169 #if defined __USE_BSD || defined __USE_MISC || defined __USE_XOPEN 170 /* Save swapped text after use (sticky bit). This is pretty well obsolete. */ 171 # define S_ISVTX __S_ISVTX 172 #endif 173 174 #define S_IRUSR __S_IREAD /* Read by owner. */ 175 #define S_IWUSR __S_IWRITE /* Write by owner. */ 176 #define S_IXUSR __S_IEXEC /* Execute by owner. */ 177 /* Read, write, and execute by owner. */ 178 #define S_IRWXU (__S_IREAD|__S_IWRITE|__S_IEXEC) 179 180 #if defined __USE_MISC && defined __USE_BSD 181 # define S_IREAD S_IRUSR 182 # define S_IWRITE S_IWUSR 183 # define S_IEXEC S_IXUSR 184 #endif 185 186 #define S_IRGRP (S_IRUSR >> 3) /* Read by group. */ 187 #define S_IWGRP (S_IWUSR >> 3) /* Write by group. */ 188 #define S_IXGRP (S_IXUSR >> 3) /* Execute by group. */ 189 /* Read, write, and execute by group. */ 190 #define S_IRWXG (S_IRWXU >> 3) 191 192 #define S_IROTH (S_IRGRP >> 3) /* Read by others. */ 193 #define S_IWOTH (S_IWGRP >> 3) /* Write by others. */ 194 #define S_IXOTH (S_IXGRP >> 3) /* Execute by others. */ 195 /* Read, write, and execute by others. */ 196 #define S_IRWXO (S_IRWXG >> 3) 197 198 199 #ifdef __USE_BSD 200 /* Macros for common mode bit masks. */ 201 # define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */ 202 # define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO)/* 07777 */ 203 # define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)/* 0666*/ 204 205 # define S_BLKSIZE 512 /* Block size for `st_blocks'. */ 206 #endif 207 208 209 #ifndef __USE_FILE_OFFSET64 210 /* Get file attributes for FILE and put them in BUF. */ 211 extern int stat (__const char *__restrict __file, 212 struct stat *__restrict __buf) __THROW __nonnull ((1, 2)); 213 214 /* Get file attributes for the file, device, pipe, or socket 215 that file descriptor FD is open on and put them in BUF. */ 216 extern int fstat (int __fd, struct stat *__buf) __THROW __nonnull ((2)); 217 #else 218 # ifdef __REDIRECT_NTH 219 extern int __REDIRECT_NTH (stat, (__const char *__restrict __file, 220 struct stat *__restrict __buf), stat64) 221 __nonnull ((1, 2)); 222 extern int __REDIRECT_NTH (fstat, (int __fd, struct stat *__buf), fstat64) 223 __nonnull ((2)); 224 # else 225 # define stat stat64 226 # define fstat fstat64 227 # endif 228 #endif 229 #ifdef __USE_LARGEFILE64 230 extern int stat64 (__const char *__restrict __file, 231 struct stat64 *__restrict __buf) __THROW __nonnull ((1, 2)); 232 extern int fstat64 (int __fd, struct stat64 *__buf) __THROW __nonnull ((2)); 233 #endif 234 235 #ifdef __USE_ATFILE 236 /* Similar to stat, get the attributes for FILE and put them in BUF. 237 Relative path names are interpreted relative to FD unless FD is 238 AT_FDCWD. */ 239 # ifndef __USE_FILE_OFFSET64 240 extern int fstatat (int __fd, __const char *__restrict __file, 241 struct stat *__restrict __buf, int __flag) 242 __THROW __nonnull ((2, 3)); 243 # else 244 # ifdef __REDIRECT_NTH 245 extern int __REDIRECT_NTH (fstatat, (int __fd, __const char *__restrict __file, 246 struct stat *__restrict __buf, 247 int __flag), 248 fstatat64) __nonnull ((2, 3)); 249 # else 250 # define fstatat fstatat64 251 # endif 252 # endif 253 254 # ifdef __USE_LARGEFILE64 255 extern int fstatat64 (int __fd, __const char *__restrict __file, 256 struct stat64 *__restrict __buf, int __flag) 257 __THROW __nonnull ((2, 3)); 258 # endif 259 #endif 260 261 #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K 262 # ifndef __USE_FILE_OFFSET64 263 /* Get file attributes about FILE and put them in BUF. 264 If FILE is a symbolic link, do not follow it. */ 265 extern int lstat (__const char *__restrict __file, 266 struct stat *__restrict __buf) __THROW __nonnull ((1, 2)); 267 # else 268 # ifdef __REDIRECT_NTH 269 extern int __REDIRECT_NTH (lstat, 270 (__const char *__restrict __file, 271 struct stat *__restrict __buf), lstat64) 272 __nonnull ((1, 2)); 273 # else 274 # define lstat lstat64 275 # endif 276 # endif 277 # ifdef __USE_LARGEFILE64 278 extern int lstat64 (__const char *__restrict __file, 279 struct stat64 *__restrict __buf) 280 __THROW __nonnull ((1, 2)); 281 # endif 282 #endif 283 284 /* Set file access permissions for FILE to MODE. 285 If FILE is a symbolic link, this affects its target instead. */ 286 extern int chmod (__const char *__file, __mode_t __mode) 287 __THROW __nonnull ((1)); 288 289 #ifdef __USE_BSD 290 /* Set file access permissions for FILE to MODE. 291 If FILE is a symbolic link, this affects the link itself 292 rather than its target. */ 293 extern int lchmod (__const char *__file, __mode_t __mode) 294 __THROW __nonnull ((1)); 295 #endif 296 297 /* Set file access permissions of the file FD is open on to MODE. */ 298 #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8 299 extern int fchmod (int __fd, __mode_t __mode) __THROW; 300 #endif 301 302 #ifdef __USE_ATFILE 303 /* Set file access permissions of FILE relative to 304 the directory FD is open on. */ 305 extern int fchmodat (int __fd, __const char *__file, __mode_t __mode, 306 int __flag) 307 __THROW __nonnull ((2)) __wur; 308 #endif /* Use ATFILE. */ 309 310 311 312 /* Set the file creation mask of the current process to MASK, 313 and return the old creation mask. */ 314 extern __mode_t umask (__mode_t __mask) __THROW; 315 316 #ifdef __USE_GNU 317 /* Get the current `umask' value without changing it. 318 This function is only available under the GNU Hurd. */ 319 extern __mode_t getumask (void) __THROW; 320 #endif 321 322 /* Create a new directory named PATH, with permission bits MODE. */ 323 extern int mkdir (__const char *__path, __mode_t __mode) 324 __THROW __nonnull ((1)); 325 326 #ifdef __USE_ATFILE 327 /* Like mkdir, create a new directory with permission bits MODE. But 328 interpret relative PATH names relative to the directory associated 329 with FD. */ 330 extern int mkdirat (int __fd, __const char *__path, __mode_t __mode) 331 __THROW __nonnull ((2)); 332 #endif 333 334 /* Create a device file named PATH, with permission and special bits MODE 335 and device number DEV (which can be constructed from major and minor 336 device numbers with the `makedev' macro above). */ 337 #if defined __USE_MISC || defined __USE_BSD || defined __USE_XOPEN_EXTENDED 338 extern int mknod (__const char *__path, __mode_t __mode, __dev_t __dev) 339 __THROW __nonnull ((1)); 340 341 # ifdef __USE_ATFILE 342 /* Like mknod, create a new device file with permission bits MODE and 343 device number DEV. But interpret relative PATH names relative to 344 the directory associated with FD. */ 345 extern int mknodat (int __fd, __const char *__path, __mode_t __mode, 346 __dev_t __dev) __THROW __nonnull ((2)); 347 # endif 348 #endif 349 350 351 /* Create a new FIFO named PATH, with permission bits MODE. */ 352 extern int mkfifo (__const char *__path, __mode_t __mode) 353 __THROW __nonnull ((1)); 354 355 #ifdef __USE_ATFILE 356 /* Like mkfifo, create a new FIFO with permission bits MODE. But 357 interpret relative PATH names relative to the directory associated 358 with FD. */ 359 extern int mkfifoat (int __fd, __const char *__path, __mode_t __mode) 360 __THROW __nonnull ((2)); 361 #endif 362 363 #ifdef __USE_ATFILE 365 /* Set file access and modification times relative to directory file 366 descriptor. */ 367 extern int utimensat (int __fd, __const char *__path, 368 __const struct timespec __times[2], 369 int __flags) 370 __THROW __nonnull ((2)); 371 #endif 372 373 #ifdef __USE_XOPEN2K8 374 /* Set file access and modification times of the file associated with FD. */ 375 extern int futimens (int __fd, __const struct timespec __times[2]) __THROW; 376 #endif 377 378 /* To allow the `struct stat' structure and the file type `mode_t' 380 bits to vary without changing shared library major version number, 381 the `stat' family of functions and `mknod' are in fact inline 382 wrappers around calls to `xstat', `fxstat', `lxstat', and `xmknod', 383 which all take a leading version-number argument designating the 384 data structure and bits used. <bits/stat.h> defines _STAT_VER with 385 the version number corresponding to `struct stat' as defined in 386 that file; and _MKNOD_VER with the version number corresponding to 387 the S_IF* macros defined therein. It is arranged that when not 388 inlined these function are always statically linked; that way a 389 dynamically-linked executable always encodes the version number 390 corresponding to the data structures it uses, so the `x' functions 391 in the shared library can adapt without needing to recompile all 392 callers. */ 393 394 #ifndef _STAT_VER 395 # define _STAT_VER 0 396 #endif 397 #ifndef _MKNOD_VER 398 # define _MKNOD_VER 0 399 #endif 400 401 /* Wrappers for stat and mknod system calls. */ 402 #ifndef __USE_FILE_OFFSET64 403 extern int __fxstat (int __ver, int __fildes, struct stat *__stat_buf) 404 __THROW __nonnull ((3)); 405 extern int __xstat (int __ver, __const char *__filename, 406 struct stat *__stat_buf) __THROW __nonnull ((2, 3)); 407 extern int __lxstat (int __ver, __const char *__filename, 408 struct stat *__stat_buf) __THROW __nonnull ((2, 3)); 409 extern int __fxstatat (int __ver, int __fildes, __const char *__filename, 410 struct stat *__stat_buf, int __flag) 411 __THROW __nonnull ((3, 4)); 412 #else 413 # ifdef __REDIRECT_NTH 414 extern int __REDIRECT_NTH (__fxstat, (int __ver, int __fildes, 415 struct stat *__stat_buf), __fxstat64) 416 __nonnull ((3)); 417 extern int __REDIRECT_NTH (__xstat, (int __ver, __const char *__filename, 418 struct stat *__stat_buf), __xstat64) 419 __nonnull ((2, 3)); 420 extern int __REDIRECT_NTH (__lxstat, (int __ver, __const char *__filename, 421 struct stat *__stat_buf), __lxstat64) 422 __nonnull ((2, 3)); 423 extern int __REDIRECT_NTH (__fxstatat, (int __ver, int __fildes, 424 __const char *__filename, 425 struct stat *__stat_buf, int __flag), 426 __fxstatat64) __nonnull ((3, 4)); 427 428 # else 429 # define __fxstat __fxstat64 430 # define __xstat __xstat64 431 # define __lxstat __lxstat64 432 # endif 433 #endif 434 435 #ifdef __USE_LARGEFILE64 436 extern int __fxstat64 (int __ver, int __fildes, struct stat64 *__stat_buf) 437 __THROW __nonnull ((3)); 438 extern int __xstat64 (int __ver, __const char *__filename, 439 struct stat64 *__stat_buf) __THROW __nonnull ((2, 3)); 440 extern int __lxstat64 (int __ver, __const char *__filename, 441 struct stat64 *__stat_buf) __THROW __nonnull ((2, 3)); 442 extern int __fxstatat64 (int __ver, int __fildes, __const char *__filename, 443 struct stat64 *__stat_buf, int __flag) 444 __THROW __nonnull ((3, 4)); 445 #endif 446 extern int __xmknod (int __ver, __const char *__path, __mode_t __mode, 447 __dev_t *__dev) __THROW __nonnull ((2, 4)); 448 449 extern int __xmknodat (int __ver, int __fd, __const char *__path, 450 __mode_t __mode, __dev_t *__dev) 451 __THROW __nonnull ((3, 5)); 452 453 #if defined __GNUC__ && __GNUC__ >= 2 && defined __USE_EXTERN_INLINES_IN_LIBC 454 /* Inlined versions of the real stat and mknod functions. */ 455 456 __extern_inline int 457 __NTH (stat (__const char *__path, struct stat *__statbuf)) 458 { 459 return __xstat (_STAT_VER, __path, __statbuf); 460 } 461 462 # if defined __USE_BSD || defined __USE_XOPEN_EXTENDED 463 __extern_inline int 464 __NTH (lstat (__const char *__path, struct stat *__statbuf)) 465 { 466 return __lxstat (_STAT_VER, __path, __statbuf); 467 } 468 # endif 469 470 __extern_inline int 471 __NTH (fstat (int __fd, struct stat *__statbuf)) 472 { 473 return __fxstat (_STAT_VER, __fd, __statbuf); 474 } 475 476 # ifdef __USE_ATFILE 477 __extern_inline int 478 __NTH (fstatat (int __fd, __const char *__filename, struct stat *__statbuf, 479 int __flag)) 480 { 481 return __fxstatat (_STAT_VER, __fd, __filename, __statbuf, __flag); 482 } 483 # endif 484 485 # if defined __USE_MISC || defined __USE_BSD 486 __extern_inline int 487 __NTH (mknod (__const char *__path, __mode_t __mode, __dev_t __dev)) 488 { 489 return __xmknod (_MKNOD_VER, __path, __mode, &__dev); 490 } 491 # endif 492 493 # ifdef __USE_ATFILE 494 __extern_inline int 495 __NTH (mknodat (int __fd, __const char *__path, __mode_t __mode, 496 __dev_t __dev)) 497 { 498 return __xmknodat (_MKNOD_VER, __fd, __path, __mode, &__dev); 499 } 500 # endif 501 502 # if defined __USE_LARGEFILE64 \ 503 && (! defined __USE_FILE_OFFSET64 \ 504 || (defined __REDIRECT_NTH && defined __OPTIMIZE__)) 505 __extern_inline int 506 __NTH (stat64 (__const char *__path, struct stat64 *__statbuf)) 507 { 508 return __xstat64 (_STAT_VER, __path, __statbuf); 509 } 510 511 # if defined __USE_BSD || defined __USE_XOPEN_EXTENDED 512 __extern_inline int 513 __NTH (lstat64 (__const char *__path, struct stat64 *__statbuf)) 514 { 515 return __lxstat64 (_STAT_VER, __path, __statbuf); 516 } 517 # endif 518 519 __extern_inline int 520 __NTH (fstat64 (int __fd, struct stat64 *__statbuf)) 521 { 522 return __fxstat64 (_STAT_VER, __fd, __statbuf); 523 } 524 525 # ifdef __USE_ATFILE 526 __extern_inline int 527 __NTH (fstatat64 (int __fd, __const char *__filename, struct stat64 *__statbuf, 528 int __flag)) 529 { 530 return __fxstatat64 (_STAT_VER, __fd, __filename, __statbuf, __flag); 531 } 532 # endif 533 534 # endif 535 536 #endif 537 538 __END_DECLS 539 540 541 #endif /* sys/stat.h */ 542