| Elliott Hughes | 21b56eb | 2017-10-20 17:57:17 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2017 The Android Open Source Project | 
 | 3 |  * All rights reserved. | 
 | 4 |  * | 
 | 5 |  * Redistribution and use in source and binary forms, with or without | 
 | 6 |  * modification, are permitted provided that the following conditions | 
 | 7 |  * are met: | 
 | 8 |  *  * Redistributions of source code must retain the above copyright | 
 | 9 |  *    notice, this list of conditions and the following disclaimer. | 
 | 10 |  *  * Redistributions in binary form must reproduce the above copyright | 
 | 11 |  *    notice, this list of conditions and the following disclaimer in | 
 | 12 |  *    the documentation and/or other materials provided with the | 
 | 13 |  *    distribution. | 
 | 14 |  * | 
 | 15 |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
 | 16 |  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
 | 17 |  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | 
 | 18 |  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | 
 | 19 |  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | 
 | 20 |  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | 
 | 21 |  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS | 
 | 22 |  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED | 
 | 23 |  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
 | 24 |  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | 
 | 25 |  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
 | 26 |  * SUCH DAMAGE. | 
 | 27 |  */ | 
 | 28 |  | 
 | 29 | #include <sys/stat.h> | 
 | 30 |  | 
 | 31 | #include "header_checks.h" | 
 | 32 |  | 
 | 33 | static void sys_stat_h() { | 
 | 34 |   TYPE(struct stat); | 
 | 35 | #if defined(__BIONIC__) && (defined(__arm__) || defined(__i386__)) | 
 | 36 |   STRUCT_MEMBER(struct stat, unsigned long long, st_dev); | 
 | 37 | #else | 
 | 38 |   STRUCT_MEMBER(struct stat, dev_t, st_dev); | 
 | 39 | #endif | 
| Goran Jakovljevic | cd91a16 | 2017-12-15 16:00:19 +0100 | [diff] [blame] | 40 | #if defined(__BIONIC__) && !defined(__LP64__) | 
| Elliott Hughes | 21b56eb | 2017-10-20 17:57:17 -0700 | [diff] [blame] | 41 |   STRUCT_MEMBER(struct stat, unsigned long long, st_ino); | 
 | 42 | #else | 
 | 43 |   STRUCT_MEMBER(struct stat, ino_t, st_ino); | 
 | 44 | #endif | 
 | 45 | #if defined(__BIONIC__) && (defined(__arm__) || defined(__i386__)) | 
 | 46 |   STRUCT_MEMBER(struct stat, unsigned int, st_mode); | 
 | 47 | #else | 
 | 48 |   STRUCT_MEMBER(struct stat, mode_t, st_mode); | 
 | 49 | #endif | 
 | 50 | #if defined(__BIONIC__) && defined(__x86_64__) | 
 | 51 |   // We can't just fix the x86_64 nlink_t because it's ABI via <fts.h>. | 
 | 52 |   STRUCT_MEMBER(struct stat, unsigned long, st_nlink); | 
 | 53 | #else | 
 | 54 |   STRUCT_MEMBER(struct stat, nlink_t, st_nlink); | 
 | 55 | #endif | 
 | 56 |   STRUCT_MEMBER(struct stat, uid_t, st_uid); | 
 | 57 |   STRUCT_MEMBER(struct stat, gid_t, st_gid); | 
 | 58 | #if defined(__BIONIC__) && (defined(__arm__) || defined(__i386__)) | 
 | 59 |   STRUCT_MEMBER(struct stat, unsigned long long, st_rdev); | 
 | 60 | #else | 
 | 61 |   STRUCT_MEMBER(struct stat, dev_t, st_rdev); | 
 | 62 | #endif | 
| Goran Jakovljevic | cd91a16 | 2017-12-15 16:00:19 +0100 | [diff] [blame] | 63 | #if defined(__BIONIC__) && !defined(__LP64__) | 
| Elliott Hughes | 21b56eb | 2017-10-20 17:57:17 -0700 | [diff] [blame] | 64 |   STRUCT_MEMBER(struct stat, long long, st_size); | 
 | 65 | #else | 
 | 66 |   STRUCT_MEMBER(struct stat, off_t, st_size); | 
 | 67 | #endif | 
 | 68 |   STRUCT_MEMBER(struct stat, struct timespec, st_atim); | 
 | 69 |   STRUCT_MEMBER(struct stat, struct timespec, st_mtim); | 
 | 70 |   STRUCT_MEMBER(struct stat, struct timespec, st_ctim); | 
 | 71 | #if defined(__BIONIC__) | 
| Goran Jakovljevic | cd91a16 | 2017-12-15 16:00:19 +0100 | [diff] [blame] | 72 | #if defined(__aarch64__) || (defined(__mips__) && defined(__LP64__)) | 
| Elliott Hughes | 21b56eb | 2017-10-20 17:57:17 -0700 | [diff] [blame] | 73 |   STRUCT_MEMBER(struct stat, int, st_blksize); | 
| Goran Jakovljevic | cd91a16 | 2017-12-15 16:00:19 +0100 | [diff] [blame] | 74 | #elif defined(__mips__) && !defined(__LP64__) | 
 | 75 |   STRUCT_MEMBER(struct stat, unsigned int, st_blksize); | 
| Elliott Hughes | 21b56eb | 2017-10-20 17:57:17 -0700 | [diff] [blame] | 76 | #elif defined(__x86_64__) | 
 | 77 |   STRUCT_MEMBER(struct stat, long, st_blksize); | 
 | 78 | #else | 
 | 79 |   STRUCT_MEMBER(struct stat, unsigned long, st_blksize); | 
 | 80 | #endif | 
 | 81 | #else | 
 | 82 |   STRUCT_MEMBER(struct stat, blksize_t, st_blksize); | 
 | 83 | #endif | 
 | 84 | #if defined(__BIONIC__) | 
| Goran Jakovljevic | cd91a16 | 2017-12-15 16:00:19 +0100 | [diff] [blame] | 85 | #if defined(__LP64__) | 
| Elliott Hughes | 21b56eb | 2017-10-20 17:57:17 -0700 | [diff] [blame] | 86 |   STRUCT_MEMBER(struct stat, long, st_blocks); | 
 | 87 | #else | 
 | 88 |   STRUCT_MEMBER(struct stat, unsigned long long, st_blocks); | 
 | 89 | #endif | 
 | 90 | #else | 
 | 91 |   STRUCT_MEMBER(struct stat, blkcnt_t, st_blocks); | 
 | 92 | #endif | 
 | 93 |  | 
 | 94 |   TYPE(blkcnt_t); | 
 | 95 |   TYPE(blksize_t); | 
 | 96 |   TYPE(dev_t); | 
 | 97 |   TYPE(ino_t); | 
 | 98 |   TYPE(mode_t); | 
 | 99 |   TYPE(nlink_t); | 
 | 100 |   TYPE(uid_t); | 
 | 101 |   TYPE(gid_t); | 
 | 102 |   TYPE(off_t); | 
 | 103 |   TYPE(time_t); | 
 | 104 |  | 
 | 105 |   TYPE(struct timespec); | 
 | 106 |  | 
 | 107 | #if !defined(st_atime) | 
 | 108 | #error st_atime | 
 | 109 | #endif | 
 | 110 | #if !defined(st_ctime) | 
 | 111 | #error st_ctime | 
 | 112 | #endif | 
 | 113 | #if !defined(st_mtime) | 
 | 114 | #error st_mtime | 
 | 115 | #endif | 
 | 116 |  | 
 | 117 | #include "sys_stat_h_mode_constants.h" | 
 | 118 | #include "sys_stat_h_file_type_test_macros.h" | 
 | 119 |  | 
 | 120 | #if !defined(S_TYPEISMQ) | 
 | 121 | #error S_TYPEISMQ | 
 | 122 | #endif | 
 | 123 | #if !defined(S_TYPEISSEM) | 
 | 124 | #error S_TYPEISSEM | 
 | 125 | #endif | 
 | 126 | #if !defined(S_TYPEISSHM) | 
 | 127 | #error S_TYPEISSHM | 
 | 128 | #endif | 
 | 129 |  | 
 | 130 | #if !defined(__BIONIC__) && !defined(__GLIBC__) | 
 | 131 | #if !defined(S_TYPEISTMO) | 
 | 132 | #error S_TYPEISTMO | 
 | 133 | #endif | 
 | 134 | #endif | 
 | 135 |  | 
 | 136 |   MACRO(UTIME_NOW); | 
 | 137 |   MACRO(UTIME_OMIT); | 
 | 138 |  | 
 | 139 |   FUNCTION(chmod, int (*f)(const char*, mode_t)); | 
 | 140 |   FUNCTION(fchmod, int (*f)(int, mode_t)); | 
 | 141 |   FUNCTION(fchmodat, int (*f)(int, const char*, mode_t, int)); | 
 | 142 |   FUNCTION(fstat, int (*f)(int, struct stat*)); | 
 | 143 |   FUNCTION(fstatat, int (*f)(int, const char*, struct stat*, int)); | 
 | 144 |   FUNCTION(futimens, int (*f)(int, const struct timespec[2])); | 
 | 145 |   FUNCTION(lstat, int (*f)(const char*, struct stat*)); | 
 | 146 |   FUNCTION(lstat, int (*f)(const char*, struct stat*)); | 
 | 147 |   FUNCTION(mkdir, int (*f)(const char*, mode_t)); | 
 | 148 |   FUNCTION(mkdirat, int (*f)(int, const char*, mode_t)); | 
 | 149 |   FUNCTION(mkfifo, int (*f)(const char*, mode_t)); | 
 | 150 |   FUNCTION(mkfifoat, int (*f)(int, const char*, mode_t)); | 
 | 151 |   FUNCTION(mknod, int (*f)(const char*, mode_t, dev_t)); | 
 | 152 |   FUNCTION(mknodat, int (*f)(int, const char*, mode_t, dev_t)); | 
 | 153 |   FUNCTION(stat, int (*f)(const char*, struct stat*)); | 
 | 154 |   FUNCTION(umask, mode_t (*f)(mode_t)); | 
 | 155 |   FUNCTION(utimensat, int (*f)(int, const char*, const struct timespec[2], int)); | 
 | 156 | } |