#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 { … }; struct stat_data { … }; /* * 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 { … }; #define MTIME_CHANGED … #define CTIME_CHANGED … #define OWNER_CHANGED … #define MODE_CHANGED … #define INODE_CHANGED … #define DATA_CHANGED … #define TYPE_CHANGED … /* * 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) … #else #undef DT_UNKNOWN #undef DT_DIR #undef DT_REG #undef DT_LNK #define DT_UNKNOWN … #define DT_DIR … #define DT_REG … #define DT_LNK … #define DTYPE … #endif #endif