Code

Merge branch 'maint'
[git.git] / csum-file.c
index 6a7b40fd09ea9aa365d70dc8019f83e481192c07..9ab997120d04c5be0aa9d3ff3ba090ba12b7bec8 100644 (file)
@@ -10,7 +10,7 @@
 #include "cache.h"
 #include "csum-file.h"
 
-static int sha1flush(struct sha1file *f, unsigned int count)
+static void sha1flush(struct sha1file *f, unsigned int count)
 {
        void *buf = f->buffer;
 
@@ -21,7 +21,7 @@ static int sha1flush(struct sha1file *f, unsigned int count)
                        count -= ret;
                        if (count)
                                continue;
-                       return 0;
+                       return;
                }
                if (!ret)
                        die("sha1 file '%s' write error. Out of diskspace", f->name);
@@ -29,18 +29,20 @@ static int sha1flush(struct sha1file *f, unsigned int count)
        }
 }
 
-int sha1close(struct sha1file *f, unsigned char *result, int update)
+int sha1close(struct sha1file *f, unsigned char *result, int final)
 {
        unsigned offset = f->offset;
        if (offset) {
                SHA1_Update(&f->ctx, f->buffer, offset);
                sha1flush(f, offset);
+               f->offset = 0;
        }
+       if (!final)
+               return 0;       /* only want to flush (no checksum write, no close) */
        SHA1_Final(f->buffer, &f->ctx);
        if (result)
-               memcpy(result, f->buffer, 20);
-       if (update)
-               sha1flush(f, 20);
+               hashcpy(result, f->buffer);
+       sha1flush(f, 20);
        if (close(f->fd))
                die("%s: sha1 file error on close (%s)", f->name, strerror(errno));
        free(f);
@@ -49,6 +51,8 @@ int sha1close(struct sha1file *f, unsigned char *result, int update)
 
 int sha1write(struct sha1file *f, void *buf, unsigned int count)
 {
+       if (f->do_crc)
+               f->crc32 = crc32(f->crc32, buf, count);
        while (count) {
                unsigned offset = f->offset;
                unsigned left = sizeof(f->buffer) - offset;
@@ -69,32 +73,6 @@ int sha1write(struct sha1file *f, void *buf, unsigned int count)
        return 0;
 }
 
-struct sha1file *sha1create(const char *fmt, ...)
-{
-       struct sha1file *f;
-       unsigned len;
-       va_list arg;
-       int fd;
-
-       f = xmalloc(sizeof(*f));
-
-       va_start(arg, fmt);
-       len = vsnprintf(f->name, sizeof(f->name), fmt, arg);
-       va_end(arg);
-       if (len >= PATH_MAX)
-               die("you wascally wabbit, you");
-       f->namelen = len;
-
-       fd = open(f->name, O_CREAT | O_EXCL | O_WRONLY, 0666);
-       if (fd < 0)
-               die("unable to open %s (%s)", f->name, strerror(errno));
-       f->fd = fd;
-       f->error = 0;
-       f->offset = 0;
-       SHA1_Init(&f->ctx);
-       return f;
-}
-
 struct sha1file *sha1fd(int fd, const char *name)
 {
        struct sha1file *f;
@@ -111,36 +89,19 @@ struct sha1file *sha1fd(int fd, const char *name)
        f->fd = fd;
        f->error = 0;
        f->offset = 0;
+       f->do_crc = 0;
        SHA1_Init(&f->ctx);
        return f;
 }
 
-int sha1write_compressed(struct sha1file *f, void *in, unsigned int size)
+void crc32_begin(struct sha1file *f)
 {
-       z_stream stream;
-       unsigned long maxsize;
-       void *out;
-
-       memset(&stream, 0, sizeof(stream));
-       deflateInit(&stream, zlib_compression_level);
-       maxsize = deflateBound(&stream, size);
-       out = xmalloc(maxsize);
-
-       /* Compress it */
-       stream.next_in = in;
-       stream.avail_in = size;
-
-       stream.next_out = out;
-       stream.avail_out = maxsize;
-
-       while (deflate(&stream, Z_FINISH) == Z_OK)
-               /* nothing */;
-       deflateEnd(&stream);
-
-       size = stream.total_out;
-       sha1write(f, out, size);
-       free(out);
-       return size;
+       f->crc32 = crc32(0, Z_NULL, 0);
+       f->do_crc = 1;
 }
 
-
+uint32_t crc32_end(struct sha1file *f)
+{
+       f->do_crc = 0;
+       return f->crc32;
+}