Factor out "read_sha1_file" into mapping/inflating/unmapping.
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 8 Apr 2005 21:42:29 +0000 (14:42 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 8 Apr 2005 21:42:29 +0000 (14:42 -0700)
This allows us to also actually check the sha1 hash using these
routines. Needed for the "fsck" thing.

cache.h
read-cache.c

diff --git a/cache.h b/cache.h
index b1313c503c7b3eca327133d683d4a4cc36159131..17328597657d2ae4a944a49b337a4beef60942ec 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -81,8 +81,10 @@ extern char *sha1_file_name(unsigned char *sha1);
 extern int write_sha1_buffer(unsigned char *sha1, void *buf, unsigned int size);
 
 /* Read and unpack a sha1 file into memory, write memory to a sha1 file */
+extern void * map_sha1_file(unsigned char *sha1, unsigned long *size);
 extern void * read_sha1_file(unsigned char *sha1, char *type, unsigned long *size);
 extern int write_sha1_file(char *buf, unsigned len);
+extern int check_sha1_signature(unsigned char *sha1, void *buf, unsigned long size);
 
 /* Convert to/from hex/sha1 representation */
 extern int get_sha1_hex(char *hex, unsigned char *sha1);
index 60a0b5b2e78f403047f3a5e2cac1c5c7965091a1..4d750506e97af68013aa25e192c569da557701fd 100644 (file)
@@ -84,33 +84,40 @@ char *sha1_file_name(unsigned char *sha1)
        return base;
 }
 
-void * read_sha1_file(unsigned char *sha1, char *type, unsigned long *size)
+void *map_sha1_file(unsigned char *sha1, unsigned long *size)
 {
-       z_stream stream;
-       char buffer[8192];
-       struct stat st;
-       int fd, ret, bytes;
-       void *map, *buf;
        char *filename = sha1_file_name(sha1);
+       int fd = open(filename, O_RDONLY);
+       struct stat st;
+       void *map;
 
-       fd = open(filename, O_RDONLY);
        if (fd < 0) {
                perror(filename);
                return NULL;
        }
        if (fstat(fd, &st) < 0) {
-               close(fd);
+               close(fd);  
                return NULL;
        }
        map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
        close(fd);
        if (-1 == (int)(long)map)
                return NULL;
+       *size = st.st_size;
+       return map;
+}
+
+void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned long *size)
+{
+       int ret, bytes;
+       z_stream stream;
+       char buffer[8192];
+       char *buf;
 
        /* Get the data stream */
        memset(&stream, 0, sizeof(stream));
        stream.next_in = map;
-       stream.avail_in = st.st_size;
+       stream.avail_in = mapsize;
        stream.next_out = buffer;
        stream.avail_out = sizeof(buffer);
 
@@ -118,6 +125,7 @@ void * read_sha1_file(unsigned char *sha1, char *type, unsigned long *size)
        ret = inflate(&stream, 0);
        if (sscanf(buffer, "%10s %lu", type, size) != 2)
                return NULL;
+
        bytes = strlen(buffer) + 1;
        buf = malloc(*size);
        if (!buf)
@@ -135,6 +143,20 @@ void * read_sha1_file(unsigned char *sha1, char *type, unsigned long *size)
        return buf;
 }
 
+void * read_sha1_file(unsigned char *sha1, char *type, unsigned long *size)
+{
+       unsigned long mapsize;
+       void *map, *buf;
+
+       map = map_sha1_file(sha1, &mapsize);
+       if (map) {
+               buf = unpack_sha1_file(map, mapsize, type, size);
+               munmap(map, mapsize);
+               return buf;
+       }
+       return NULL;
+}
+
 int write_sha1_file(char *buf, unsigned len)
 {
        int size;