11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved.
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met:
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *  * Redistributions of source code must retain the above copyright
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *  * Redistributions in binary form must reproduce the above copyright
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer in
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    the documentation and/or other materials provided with the
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    distribution.
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE.
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _SYS_STAT_H_
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _SYS_STAT_H_
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h>
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h>
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/time.h>
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <linux/stat.h>
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <endian.h>
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
40b8fa5b1ca9fc9b8b92875d2d9f33df3c8310aa09Elliott Hughes#if defined(__aarch64__)
41db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes#define __STAT64_BODY \
42db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_dev; \
43db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_ino; \
44db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_mode; \
45db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_nlink; \
466b5559315d959347fcc01781669f771746cbb2eeElliott Hughes  uid_t st_uid; \
476b5559315d959347fcc01781669f771746cbb2eeElliott Hughes  gid_t st_gid; \
48db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_rdev; \
49db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long __pad1; \
50db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  long st_size; \
51db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  int st_blksize; \
52db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  int __pad2; \
53db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  long st_blocks; \
54db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  long st_atime; \
55db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_atime_nsec; \
56db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  long st_mtime; \
57db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_mtime_nsec; \
58db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  long st_ctime; \
59db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_ctime_nsec; \
60db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int __unused4; \
61db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int __unused5; \
62db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes
63b8fa5b1ca9fc9b8b92875d2d9f33df3c8310aa09Elliott Hughes#elif defined(__mips__)
64db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes#define __STAT64_BODY \
65db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_dev; \
66db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int __pad0[3]; \
67db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long long st_ino; \
68db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_mode; \
69db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_nlink; \
706b5559315d959347fcc01781669f771746cbb2eeElliott Hughes  uid_t st_uid; \
716b5559315d959347fcc01781669f771746cbb2eeElliott Hughes  gid_t st_gid; \
72db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_rdev; \
73db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int __pad1[3]; \
74db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  long long st_size; \
75db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_atime; \
76db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_atime_nsec; \
77db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_mtime; \
78db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_mtime_nsec; \
79db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_ctime; \
80db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_ctime_nsec; \
81db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_blksize; \
82db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int __pad2; \
83db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long long st_blocks; \
84db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes
85b8fa5b1ca9fc9b8b92875d2d9f33df3c8310aa09Elliott Hughes#elif defined(__x86_64__)
86db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes#define __STAT64_BODY \
87db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_dev; \
88db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_ino; \
89db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_nlink; \
90db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_mode; \
916b5559315d959347fcc01781669f771746cbb2eeElliott Hughes  uid_t st_uid; \
926b5559315d959347fcc01781669f771746cbb2eeElliott Hughes  gid_t st_gid; \
93db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int __pad0; \
94db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_rdev; \
95db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  long st_size; \
96db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  long st_blksize; \
97db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  long st_blocks; \
98db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_atime; \
99db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_atime_nsec; \
100db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_mtime; \
101db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_mtime_nsec; \
102db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_ctime; \
103db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_ctime_nsec; \
104db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  long __pad3[3]; \
105db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes
1066437eac15a5b595ab26ef51834509c44695eb7e4Raghu Gandham#else
107db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes#define __STAT64_BODY \
108db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long long st_dev; \
109db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned char __pad0[4]; \
110db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long __st_ino; \
111db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_mode; \
112db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned int st_nlink; \
1136b5559315d959347fcc01781669f771746cbb2eeElliott Hughes  uid_t st_uid; \
1146b5559315d959347fcc01781669f771746cbb2eeElliott Hughes  gid_t st_gid; \
115db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long long st_rdev; \
116db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned char __pad3[4]; \
117db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  long long st_size; \
118db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_blksize; \
119db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long long st_blocks; \
120db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_atime; \
121db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_atime_nsec; \
122db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_mtime; \
123db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_mtime_nsec; \
124db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_ctime; \
125db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long st_ctime_nsec; \
126db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes  unsigned long long st_ino; \
127db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes
1286437eac15a5b595ab26ef51834509c44695eb7e4Raghu Gandham#endif
1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
130db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesstruct stat { __STAT64_BODY };
131db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesstruct stat64 { __STAT64_BODY };
132db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes
133f963da22ecc25c51971d802037736ae540321441Calin Juravle#undef __STAT64_BODY
134f963da22ecc25c51971d802037736ae540321441Calin Juravle
135db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes#define st_atimensec st_atime_nsec
136db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes#define st_mtimensec st_mtime_nsec
137db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes#define st_ctimensec st_ctime_nsec
13809baf4e881c78e67c7849aa81432ceb34e72e913David 'Digit' Turner
139f27b7fb0567a9cbb642be9d98298cb6668e7db39Hakan Kvist#ifdef __USE_BSD
140f27b7fb0567a9cbb642be9d98298cb6668e7db39Hakan Kvist/* Permission macros provided by glibc for compatibility with BSDs. */
141f27b7fb0567a9cbb642be9d98298cb6668e7db39Hakan Kvist#define ACCESSPERMS (S_IRWXU | S_IRWXG | S_IRWXO) /* 0777 */
142f27b7fb0567a9cbb642be9d98298cb6668e7db39Hakan Kvist#define ALLPERMS    (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO) /* 07777 */
143f27b7fb0567a9cbb642be9d98298cb6668e7db39Hakan Kvist#define DEFFILEMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) /* 0666 */
144f27b7fb0567a9cbb642be9d98298cb6668e7db39Hakan Kvist#endif
145f27b7fb0567a9cbb642be9d98298cb6668e7db39Hakan Kvist
146db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesextern int chmod(const char*, mode_t);
147db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesextern int fchmod(int, mode_t);
148db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesextern int mkdir(const char*, mode_t);
1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
150db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesextern int fstat(int, struct stat*);
151db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesextern int fstat64(int, struct stat64*);
152db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesextern int fstatat(int, const char*, struct stat*, int);
153db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesextern int fstatat64(int, const char*, struct stat64*, int);
154db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesextern int lstat(const char*, struct stat*);
155db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesextern int lstat64(const char*, struct stat64*);
156db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesextern int stat(const char*, struct stat*);
157db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesextern int stat64(const char*, struct stat64*);
158db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes
159db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughesextern int mknod(const char*, mode_t, dev_t);
1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern mode_t umask(mode_t);
1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
162cd587701c8590fb34bb69804b5d3b3c14d3d2508Nick Kralevichextern mode_t __umask_chk(mode_t);
163d87d401ab134996d1f25f5b63cefb48b5b5877c8Elliott Hughesextern mode_t __umask_real(mode_t) __RENAME(umask);
164a641c18f0c62c31f5678f8c159a74486010ea851Nick Kralevich__errordecl(__umask_invalid_mode, "umask called with invalid mode");
165cd587701c8590fb34bb69804b5d3b3c14d3d2508Nick Kralevich
16655ee845b8ec0861d09197b32fbb5f2d34320155dDan Albert#if defined(__BIONIC_FORTIFY)
16755ee845b8ec0861d09197b32fbb5f2d34320155dDan Albert
168cd587701c8590fb34bb69804b5d3b3c14d3d2508Nick Kralevich__BIONIC_FORTIFY_INLINE
169cd587701c8590fb34bb69804b5d3b3c14d3d2508Nick Kralevichmode_t umask(mode_t mode) {
170a6cde392765eb955cb4be5faa6ee62dcf77e8aa5Nick Kralevich#if !defined(__clang__)
171cd587701c8590fb34bb69804b5d3b3c14d3d2508Nick Kralevich  if (__builtin_constant_p(mode)) {
172cd587701c8590fb34bb69804b5d3b3c14d3d2508Nick Kralevich    if ((mode & 0777) != mode) {
173a641c18f0c62c31f5678f8c159a74486010ea851Nick Kralevich      __umask_invalid_mode();
174cd587701c8590fb34bb69804b5d3b3c14d3d2508Nick Kralevich    }
175cd587701c8590fb34bb69804b5d3b3c14d3d2508Nick Kralevich    return __umask_real(mode);
176cd587701c8590fb34bb69804b5d3b3c14d3d2508Nick Kralevich  }
177a6cde392765eb955cb4be5faa6ee62dcf77e8aa5Nick Kralevich#endif
178cd587701c8590fb34bb69804b5d3b3c14d3d2508Nick Kralevich  return __umask_chk(mode);
179cd587701c8590fb34bb69804b5d3b3c14d3d2508Nick Kralevich}
180a6cde392765eb955cb4be5faa6ee62dcf77e8aa5Nick Kralevich#endif /* defined(__BIONIC_FORTIFY) */
181cd587701c8590fb34bb69804b5d3b3c14d3d2508Nick Kralevich
182594b1a4af204aa9de2b4913182f4556e38d71648Elliott Hughesextern int mkfifo(const char*, mode_t);
1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
184f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int fchmodat(int, const char*, mode_t, int);
185f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int mkdirat(int, const char*, mode_t);
186f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int mknodat(int, const char*, mode_t, dev_t);
1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
188db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes#define UTIME_NOW  ((1L << 30) - 1L)
189db1ea3474899ebbd783aba872d3005f95a816d0fElliott Hughes#define UTIME_OMIT ((1L << 30) - 2L)
190d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughesextern int utimensat(int fd, const char *path, const struct timespec times[2], int flags);
191d0be7c8f9a06b3ca8ea7647ea35c8f9dc63f0fe1Elliott Hughesextern int futimens(int fd, const struct timespec times[2]);
192ae2d5ba31412c4f382ef405000baa866f35dd736Ken Sumrall
1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _SYS_STAT_H_ */
196