diff options
Diffstat (limited to 'read-cache.c')
-rw-r--r-- | read-cache.c | 56 |
1 files changed, 29 insertions, 27 deletions
diff --git a/read-cache.c b/read-cache.c index 8e90d2c3b..4173b4e45 100644 --- a/read-cache.c +++ b/read-cache.c @@ -283,30 +283,32 @@ int cache_match_stat(struct cache_entry *ce, struct stat *st) { unsigned int changed = 0; - /* nsec seems unreliable - not all filesystems support it, so - * as long as it is in the inode cache you get right nsec - * but after it gets flushed, you get zero nsec. */ - if (ce->mtime.sec != (unsigned int)st->st_mtim.tv_sec -#ifdef NSEC - || ce->mtime.nsec != (unsigned int)st->st_mtim.tv_nsec -#endif - ) + if (ce->ce_mtime.sec != htonl(st->st_mtime)) changed |= MTIME_CHANGED; - if (ce->ctime.sec != (unsigned int)st->st_ctim.tv_sec + if (ce->ce_ctime.sec != htonl(st->st_ctime)) + changed |= CTIME_CHANGED; + #ifdef NSEC - || ce->ctime.nsec != (unsigned int)st->st_ctim.tv_nsec -#endif - ) + /* + * nsec seems unreliable - not all filesystems support it, so + * as long as it is in the inode cache you get right nsec + * but after it gets flushed, you get zero nsec. + */ + if (ce->ce_mtime.nsec != htonl(st->st_mtim.tv_nsec) + changed |= MTIME_CHANGED; + if (ce->ce_ctime.nsec != htonl(st->st_ctim.tv_nsec) changed |= CTIME_CHANGED; - if (ce->st_uid != (unsigned int)st->st_uid || - ce->st_gid != (unsigned int)st->st_gid) +#endif + + if (ce->ce_uid != htonl(st->st_uid) || + ce->ce_gid != htonl(st->st_gid)) changed |= OWNER_CHANGED; - if (ce->st_mode != (unsigned int)st->st_mode) + if (ce->ce_mode != htonl(st->st_mode)) changed |= MODE_CHANGED; - if (ce->st_dev != (unsigned int)st->st_dev || - ce->st_ino != (unsigned int)st->st_ino) + if (ce->ce_dev != htonl(st->st_dev) || + ce->ce_ino != htonl(st->st_ino)) changed |= INODE_CHANGED; - if (ce->st_size != (unsigned int)st->st_size) + if (ce->ce_size != htonl(st->st_size)) changed |= DATA_CHANGED; return changed; } @@ -335,7 +337,7 @@ int cache_name_pos(const char *name, int namelen) while (last > first) { int next = (last + first) >> 1; struct cache_entry *ce = active_cache[next]; - int cmp = cache_name_compare(name, namelen, ce->name, ce->namelen); + int cmp = cache_name_compare(name, namelen, ce->name, ce_namelen(ce)); if (!cmp) return next; if (cmp < 0) { @@ -362,7 +364,7 @@ int add_cache_entry(struct cache_entry *ce, int ok_to_add) { int pos; - pos = cache_name_pos(ce->name, ce->namelen); + pos = cache_name_pos(ce->name, ce_namelen(ce)); /* existing match? Just replace it */ if (pos >= 0) { @@ -393,9 +395,9 @@ static int verify_hdr(struct cache_header *hdr, unsigned long size) SHA_CTX c; unsigned char sha1[20]; - if (hdr->signature != CACHE_SIGNATURE) + if (hdr->hdr_signature != htonl(CACHE_SIGNATURE)) return error("bad signature"); - if (hdr->version != 1) + if (hdr->hdr_version != htonl(1)) return error("bad version"); SHA1_Init(&c); SHA1_Update(&c, hdr, offsetof(struct cache_header, sha1)); @@ -443,12 +445,12 @@ int read_cache(void) if (verify_hdr(hdr, size) < 0) goto unmap; - active_nr = hdr->entries; + active_nr = ntohl(hdr->hdr_entries); active_alloc = alloc_nr(active_nr); active_cache = calloc(active_alloc, sizeof(struct cache_entry *)); offset = sizeof(*hdr); - for (i = 0; i < hdr->entries; i++) { + for (i = 0; i < active_nr; i++) { struct cache_entry *ce = map + offset; offset = offset + ce_size(ce); active_cache[i] = ce; @@ -467,9 +469,9 @@ int write_cache(int newfd, struct cache_entry **cache, int entries) struct cache_header hdr; int i; - hdr.signature = CACHE_SIGNATURE; - hdr.version = 1; - hdr.entries = entries; + hdr.hdr_signature = htonl(CACHE_SIGNATURE); + hdr.hdr_version = htonl(1); + hdr.hdr_entries = htonl(entries); SHA1_Init(&c); SHA1_Update(&c, &hdr, offsetof(struct cache_header, sha1)); |