Git fork
at reftables-rust 97 lines 2.6 kB view raw
1#ifndef STATINFO_H 2#define STATINFO_H 3 4struct index_state; 5 6/* 7 * The "cache_time" is just the low 32 bits of the 8 * time. It doesn't matter if it overflows - we only 9 * check it for equality in the 32 bits we save. 10 */ 11struct cache_time { 12 uint32_t sec; 13 uint32_t nsec; 14}; 15 16struct stat_data { 17 struct cache_time sd_ctime; 18 struct cache_time sd_mtime; 19 unsigned int sd_dev; 20 unsigned int sd_ino; 21 unsigned int sd_uid; 22 unsigned int sd_gid; 23 unsigned int sd_size; 24}; 25 26/* 27 * A struct to encapsulate the concept of whether a file has changed 28 * since we last checked it. This uses criteria similar to those used 29 * for the index. 30 */ 31struct stat_validity { 32 struct stat_data *sd; 33}; 34 35#define MTIME_CHANGED 0x0001 36#define CTIME_CHANGED 0x0002 37#define OWNER_CHANGED 0x0004 38#define MODE_CHANGED 0x0008 39#define INODE_CHANGED 0x0010 40#define DATA_CHANGED 0x0020 41#define TYPE_CHANGED 0x0040 42 43/* 44 * Record to sd the data from st that we use to check whether a file 45 * might have changed. 46 */ 47void fill_stat_data(struct stat_data *sd, struct stat *st); 48 49/* 50 * The inverse of the above. When we know the cache_entry that 51 * contains sd is up-to-date, but still need to pretend we called 52 * lstat() to learn that fact, this function fills "st" enough to 53 * fool ie_match_stat(). 54 */ 55void fake_lstat_data(const struct stat_data *sd, struct stat *st); 56 57/* 58 * Return 0 if st is consistent with a file not having been changed 59 * since sd was filled. If there are differences, return a 60 * combination of MTIME_CHANGED, CTIME_CHANGED, OWNER_CHANGED, 61 * INODE_CHANGED, and DATA_CHANGED. 62 */ 63int match_stat_data(const struct stat_data *sd, struct stat *st); 64 65void stat_validity_clear(struct stat_validity *sv); 66 67/* 68 * Returns 1 if the path is a regular file (or a symlink to a regular 69 * file) and matches the saved stat_validity, 0 otherwise. A missing 70 * or inaccessible file is considered a match if the struct was just 71 * initialized, or if the previous update found an inaccessible file. 72 */ 73int stat_validity_check(struct stat_validity *sv, const char *path); 74 75/* 76 * Update the stat_validity from a file opened at descriptor fd. If 77 * the file is missing, inaccessible, or not a regular file, then 78 * future calls to stat_validity_check will match iff one of those 79 * conditions continues to be true. 80 */ 81void stat_validity_update(struct stat_validity *sv, int fd); 82 83#if defined(DT_UNKNOWN) && !defined(NO_D_TYPE_IN_DIRENT) 84#define DTYPE(de) ((de)->d_type) 85#else 86#undef DT_UNKNOWN 87#undef DT_DIR 88#undef DT_REG 89#undef DT_LNK 90#define DT_UNKNOWN 0 91#define DT_DIR 1 92#define DT_REG 2 93#define DT_LNK 3 94#define DTYPE(de) DT_UNKNOWN 95#endif 96 97#endif