| 1 | #ifndef STATINFO_H |
| 2 | #define STATINFO_H |
| 3 | |
| 4 | struct 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 | */ |
| 11 | struct cache_time { |
| 12 | uint32_t sec; |
| 13 | uint32_t nsec; |
| 14 | }; |
| 15 | |
| 16 | struct 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 | */ |
| 31 | struct 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 | */ |
| 47 | void 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 | */ |
| 55 | void 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 | */ |
| 63 | int match_stat_data(const struct stat_data *sd, struct stat *st); |
| 64 | |
| 65 | void 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 | */ |
| 73 | int 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 | */ |
| 81 | void 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 |