| #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 |