diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-26 22:01:46 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-26 22:01:46 -0700 |
commit | e18088451d92fbf83bfb57fd48201eda117f8103 (patch) | |
tree | 718ae283382872ae99ce7b49406679b0d3f498ab /csum-file.c | |
parent | c38138cd78f284b261a02323e8f18a1dee87c7fa (diff) | |
download | git-e18088451d92fbf83bfb57fd48201eda117f8103.tar.gz |
csum-file interface updates: return resulting SHA1
Also, make the writing of the SHA1 as a end-header be conditional: not
every user will necessarily want to write the SHA1 to the file itself,
even though current users do (but we migh end up using the same helper
functions for the object files themselves, that don't do this).
This also makes the packed index file contain the SHA1 of the packed
data file at the end (just before its own SHA1). That way you can
validate the pairing of the two if you want to.
Diffstat (limited to 'csum-file.c')
-rw-r--r-- | csum-file.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/csum-file.c b/csum-file.c index 98cb59ddda..9f9553ae03 100644 --- a/csum-file.c +++ b/csum-file.c @@ -24,14 +24,14 @@ static int sha1flush(struct sha1file *f, unsigned int count) return 0; } if (!ret) - die("sha1 file write error. Out of diskspace"); + die("sha1 file '%s' write error. Out of diskspace", f->name); if (errno == EAGAIN || errno == EINTR) continue; - die("sha1 file write error (%s)", strerror(errno)); + die("sha1 file '%s' write error (%s)", f->name, strerror(errno)); } } -int sha1close(struct sha1file *f) +int sha1close(struct sha1file *f, unsigned char *result, int update) { unsigned offset = f->offset; if (offset) { @@ -39,7 +39,12 @@ int sha1close(struct sha1file *f) sha1flush(f, offset); } SHA1_Final(f->buffer, &f->ctx); - sha1flush(f, 20); + if (result) + memcpy(result, f->buffer, 20); + if (update) + sha1flush(f, 20); + if (close(f->fd)) + die("%s: sha1 file error on close (%s)", f->name, strerror(errno)); return 0; } @@ -66,22 +71,23 @@ int sha1write(struct sha1file *f, void *buf, unsigned int count) struct sha1file *sha1create(const char *fmt, ...) { - static char filename[PATH_MAX]; struct sha1file *f; unsigned len; va_list arg; int fd; + f = xmalloc(sizeof(*f)); + va_start(arg, fmt); - len = vsnprintf(filename, PATH_MAX, fmt, arg); + len = vsnprintf(f->name, sizeof(f->name), fmt, arg); va_end(arg); - if (len >= PATH_MAX) die("you wascally wabbit, you"); - fd = open(filename, O_CREAT | O_EXCL | O_WRONLY, 0644); + f->namelen = len; + + fd = open(f->name, O_CREAT | O_EXCL | O_WRONLY, 0644); if (fd < 0) - die("unable to open %s (%s)", filename, strerror(errno)); - f = xmalloc(sizeof(*f)); + die("unable to open %s (%s)", f->name, strerror(errno)); f->fd = fd; f->error = 0; f->offset = 0; |