| #ifndef STATINFO_H |
| #define STATINFO_H |
| |
| struct index_state; |
| |
| /* |
| * The "cache_time" is just the low 32 bits of the |
| * time. It doesn't matter if it overflows - we only |
| * check it for equality in the 32 bits we save. |
| */ |
| struct cache_time { |
| uint32_t sec; |
| uint32_t nsec; |
| }; |
| |
| struct stat_data { |
| struct cache_time sd_ctime; |
| struct cache_time sd_mtime; |
| unsigned int sd_dev; |
| unsigned int sd_ino; |
| unsigned int sd_uid; |
| unsigned int sd_gid; |
| unsigned int sd_size; |
| }; |
| |
| /* |
| * A struct to encapsulate the concept of whether a file has changed |
| * since we last checked it. This uses criteria similar to those used |
| * for the index. |
| */ |
| struct stat_validity { |
| struct stat_data *sd; |
| }; |
| |
| #define MTIME_CHANGED 0x0001 |
| #define CTIME_CHANGED 0x0002 |
| #define OWNER_CHANGED 0x0004 |
| #define MODE_CHANGED 0x0008 |
| #define INODE_CHANGED 0x0010 |
| #define DATA_CHANGED 0x0020 |
| #define TYPE_CHANGED 0x0040 |
| |
| /* |
| * Record to sd the data from st that we use to check whether a file |
| * might have changed. |
| */ |
| void fill_stat_data(struct stat_data *sd, struct stat *st); |
| |
| /* |
| * The inverse of the above. When we know the cache_entry that |
| * contains sd is up-to-date, but still need to pretend we called |
| * lstat() to learn that fact, this function fills "st" enough to |
| * fool ie_match_stat(). |
| */ |
| void fake_lstat_data(const struct stat_data *sd, struct stat *st); |
| |
| /* |
| * Return 0 if st is consistent with a file not having been changed |
| * since sd was filled. If there are differences, return a |
| * combination of MTIME_CHANGED, CTIME_CHANGED, OWNER_CHANGED, |
| * INODE_CHANGED, and DATA_CHANGED. |
| */ |
| int match_stat_data(const struct stat_data *sd, struct stat *st); |
| |
| void stat_validity_clear(struct stat_validity *sv); |
| |
| /* |
| * Returns 1 if the path is a regular file (or a symlink to a regular |
| * file) and matches the saved stat_validity, 0 otherwise. A missing |
| * or inaccessible file is considered a match if the struct was just |
| * initialized, or if the previous update found an inaccessible file. |
| */ |
| int stat_validity_check(struct stat_validity *sv, const char *path); |
| |
| /* |
| * Update the stat_validity from a file opened at descriptor fd. If |
| * the file is missing, inaccessible, or not a regular file, then |
| * future calls to stat_validity_check will match iff one of those |
| * conditions continues to be true. |
| */ |
| void stat_validity_update(struct stat_validity *sv, int fd); |
| |
| #if defined(DT_UNKNOWN) && !defined(NO_D_TYPE_IN_DIRENT) |
| #define DTYPE(de) ((de)->d_type) |
| #else |
| #undef DT_UNKNOWN |
| #undef DT_DIR |
| #undef DT_REG |
| #undef DT_LNK |
| #define DT_UNKNOWN 0 |
| #define DT_DIR 1 |
| #define DT_REG 2 |
| #define DT_LNK 3 |
| #define DTYPE(de) DT_UNKNOWN |
| #endif |
| |
| #endif |