summaryrefslogtreecommitdiff
path: root/csum-file.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2011-07-19 09:54:51 -0700
committerJunio C Hamano <gitster@pobox.com>2011-07-19 09:54:51 -0700
commitd907bf8ef327cd47433d4a4bb0a1bb4e96b6e340 (patch)
tree2475a33111f13c32a4e8540fb9d273bee0c5c601 /csum-file.c
parent54dbc1f9e6451b6673835259ce8aa450489fc420 (diff)
parent3de89c9d4216d0fdc11bd1141c419ac4d0d35fed (diff)
downloadgit-d907bf8ef327cd47433d4a4bb0a1bb4e96b6e340.tar.gz
Merge branch 'jc/index-pack'
* jc/index-pack: verify-pack: use index-pack --verify index-pack: show histogram when emulating "verify-pack -v" index-pack: start learning to emulate "verify-pack -v" index-pack: a miniscule refactor index-pack --verify: read anomalous offsets from v2 idx file write_idx_file: need_large_offset() helper function index-pack: --verify write_idx_file: introduce a struct to hold idx customization options index-pack: group the delta-base array entries also by type Conflicts: builtin/verify-pack.c cache.h sha1_file.c
Diffstat (limited to 'csum-file.c')
-rw-r--r--csum-file.c46
1 files changed, 45 insertions, 1 deletions
diff --git a/csum-file.c b/csum-file.c
index be49d5fcf9..fc97d6e045 100644
--- a/csum-file.c
+++ b/csum-file.c
@@ -11,8 +11,20 @@
#include "progress.h"
#include "csum-file.h"
-static void flush(struct sha1file *f, void * buf, unsigned int count)
+static void flush(struct sha1file *f, void *buf, unsigned int count)
{
+ if (0 <= f->check_fd && count) {
+ unsigned char check_buffer[8192];
+ ssize_t ret = read_in_full(f->check_fd, check_buffer, count);
+
+ if (ret < 0)
+ die_errno("%s: sha1 file read error", f->name);
+ if (ret < count)
+ die("%s: sha1 file truncated", f->name);
+ if (memcmp(buf, check_buffer, count))
+ die("sha1 file '%s' validation error", f->name);
+ }
+
for (;;) {
int ret = xwrite(f->fd, buf, count);
if (ret > 0) {
@@ -59,6 +71,17 @@ int sha1close(struct sha1file *f, unsigned char *result, unsigned int flags)
fd = 0;
} else
fd = f->fd;
+ if (0 <= f->check_fd) {
+ char discard;
+ int cnt = read_in_full(f->check_fd, &discard, 1);
+ if (cnt < 0)
+ die_errno("%s: error when reading the tail of sha1 file",
+ f->name);
+ if (cnt)
+ die("%s: sha1 file has trailing garbage", f->name);
+ if (close(f->check_fd))
+ die_errno("%s: sha1 file error on close", f->name);
+ }
free(f);
return fd;
}
@@ -101,10 +124,31 @@ struct sha1file *sha1fd(int fd, const char *name)
return sha1fd_throughput(fd, name, NULL);
}
+struct sha1file *sha1fd_check(const char *name)
+{
+ int sink, check;
+ struct sha1file *f;
+
+ sink = open("/dev/null", O_WRONLY);
+ if (sink < 0)
+ return NULL;
+ check = open(name, O_RDONLY);
+ if (check < 0) {
+ int saved_errno = errno;
+ close(sink);
+ errno = saved_errno;
+ return NULL;
+ }
+ f = sha1fd(sink, name);
+ f->check_fd = check;
+ return f;
+}
+
struct sha1file *sha1fd_throughput(int fd, const char *name, struct progress *tp)
{
struct sha1file *f = xmalloc(sizeof(*f));
f->fd = fd;
+ f->check_fd = -1;
f->offset = 0;
f->total = 0;
f->tp = tp;