Modify the read_index_from function, splitting it up into
one function that stays the same for every index format,
doing the basic operations such as verifying the header,
and a function which is specific for each index version,
which does the real reading of the index.

Signed-off-by: Thomas Gummerer <t.gumme...@gmail.com>
---
 cache.h      |   1 +
 read-cache.c | 108 +++++++++++++++++++++++++++++++++++------------------------
 2 files changed, 66 insertions(+), 43 deletions(-)

diff --git a/cache.h b/cache.h
index d4028ef..3aa70d8 100644
--- a/cache.h
+++ b/cache.h
@@ -435,6 +435,7 @@ extern int init_db(const char *template_dir, unsigned int 
flags);
 /* Initialize and use the cache information */
 extern int read_index(struct index_state *);
 extern int read_index_preload(struct index_state *, const char **pathspec);
+extern void read_index_v2(struct index_state *, void *mmap, int);
 extern int read_index_from(struct index_state *, const char *path);
 extern int is_index_unborn(struct index_state *);
 extern int read_index_unmerged(struct index_state *);
diff --git a/read-cache.c b/read-cache.c
index c44b5f7..3d83f05 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -1247,10 +1247,8 @@ struct ondisk_cache_entry_extended {
                            ondisk_cache_entry_extended_size(ce_namelen(ce)) : \
                            ondisk_cache_entry_size(ce_namelen(ce)))
 
-static int verify_hdr(struct cache_version_header *hdr, unsigned long size)
+static int verify_hdr_version(struct cache_version_header *hdr, unsigned long 
size)
 {
-       git_SHA_CTX c;
-       unsigned char sha1[20];
        int hdr_version;
 
        if (hdr->hdr_signature != htonl(CACHE_SIGNATURE))
@@ -1258,6 +1256,14 @@ static int verify_hdr(struct cache_version_header *hdr, 
unsigned long size)
        hdr_version = ntohl(hdr->hdr_version);
        if (hdr_version < 2 || 4 < hdr_version)
                return error("bad index version %d", hdr_version);
+       return 0;
+}
+
+static int verify_hdr_v2(struct cache_version_header *hdr, unsigned long size)
+{
+       git_SHA_CTX c;
+       unsigned char sha1[20];
+
        git_SHA1_Init(&c);
        git_SHA1_Update(&c, hdr, size - 20);
        git_SHA1_Final(sha1, &c);
@@ -1403,50 +1409,15 @@ static struct cache_entry *create_from_disk(struct 
ondisk_cache_entry *ondisk,
        return ce;
 }
 
-/* remember to discard_cache() before reading a different cache! */
-int read_index_from(struct index_state *istate, const char *path)
+void read_index_v2(struct index_state *istate, void *mmap, int mmap_size)
 {
-       int fd, i;
-       struct stat st;
+       int i;
        unsigned long src_offset;
        struct cache_version_header *hdr;
        struct cache_header_v2 *hdr_v2;
-       void *mmap;
-       size_t mmap_size;
        struct strbuf previous_name_buf = STRBUF_INIT, *previous_name;
 
-       errno = EBUSY;
-       if (istate->initialized)
-               return istate->cache_nr;
-
-       errno = ENOENT;
-       istate->timestamp.sec = 0;
-       istate->timestamp.nsec = 0;
-       fd = open(path, O_RDONLY);
-       if (fd < 0) {
-               if (errno == ENOENT)
-                       return 0;
-               die_errno("index file open failed");
-       }
-
-       if (fstat(fd, &st))
-               die_errno("cannot stat the open index");
-
-       errno = EINVAL;
-       mmap_size = xsize_t(st.st_size);
-       if (mmap_size < sizeof(struct cache_version_header) + 20)
-               die("index file smaller than expected");
-
-       mmap = xmmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 
0);
-       close(fd);
-       if (mmap == MAP_FAILED)
-               die_errno("unable to map index file");
-
        hdr = mmap;
-       hdr_v2 =  mmap + sizeof(*hdr);
-       if (verify_hdr(hdr, mmap_size) < 0)
-               goto unmap;
-
        hdr_v2 = mmap + sizeof(*hdr);
        istate->version = ntohl(hdr->hdr_version);
        istate->cache_nr = ntohl(hdr_v2->hdr_entries);
@@ -1472,8 +1443,6 @@ int read_index_from(struct index_state *istate, const 
char *path)
                src_offset += consumed;
        }
        strbuf_release(&previous_name_buf);
-       istate->timestamp.sec = st.st_mtime;
-       istate->timestamp.nsec = ST_MTIME_NSEC(st);
 
        while (src_offset <= mmap_size - 20 - 8) {
                /* After an array of active_nr index entries,
@@ -1493,12 +1462,65 @@ int read_index_from(struct index_state *istate, const 
char *path)
                src_offset += 8;
                src_offset += extsize;
        }
+       return;
+unmap:
+       munmap(mmap, mmap_size);
+       die("index file corrupt");
+}
+
+/* remember to discard_cache() before reading a different cache! */
+int read_index_from(struct index_state *istate, const char *path)
+{
+       int fd;
+       struct stat st;
+       struct cache_version_header *hdr;
+       void *mmap;
+       size_t mmap_size;
+
+       errno = EBUSY;
+       if (istate->initialized)
+               return istate->cache_nr;
+
+       errno = ENOENT;
+       istate->timestamp.sec = 0;
+       istate->timestamp.nsec = 0;
+       fd = open(path, O_RDONLY);
+       if (fd < 0) {
+               if (errno == ENOENT)
+                       return 0;
+               die_errno("index file open failed");
+       }
+
+       if (fstat(fd, &st))
+               die_errno("cannot stat the open index");
+
+       errno = EINVAL;
+       mmap_size = xsize_t(st.st_size);
+       if (mmap_size < sizeof(struct cache_version_header) + 20)
+               die("index file smaller than expected");
+
+       mmap = xmmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 
0);
+       close(fd);
+       if (mmap == MAP_FAILED)
+               die_errno("unable to map index file");
+
+       hdr = mmap;
+       if (verify_hdr_version(hdr, mmap_size) < 0)
+               goto unmap;
+
+       if (verify_hdr_v2(hdr, mmap_size) < 0)
+               goto unmap;
+
+       read_index_v2(istate, mmap, mmap_size);
+
+       istate->timestamp.sec = st.st_mtime;
+       istate->timestamp.nsec = ST_MTIME_NSEC(st);
+
        munmap(mmap, mmap_size);
        return istate->cache_nr;
 
 unmap:
        munmap(mmap, mmap_size);
-       errno = EINVAL;
        die("index file corrupt");
 }
 
-- 
1.7.10.886.gdf6792c.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to