98 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
| #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
 |