#include "cache.h" #include "pack.h" void fixup_pack_header_footer(int pack_fd, unsigned char *pack_file_sha1, const char *pack_name, uint32_t object_count) { static const int buf_sz = 128 * 1024; SHA_CTX c; struct pack_header hdr; char *buf; if (lseek(pack_fd, 0, SEEK_SET) != 0) die("Failed seeking to start: %s", strerror(errno)); if (read_in_full(pack_fd, &hdr, sizeof(hdr)) != sizeof(hdr)) die("Unable to reread header of %s: %s", pack_name, strerror(errno)); if (lseek(pack_fd, 0, SEEK_SET) != 0) die("Failed seeking to start: %s", strerror(errno)); hdr.hdr_entries = htonl(object_count); write_or_die(pack_fd, &hdr, sizeof(hdr)); SHA1_Init(&c); SHA1_Update(&c, &hdr, sizeof(hdr)); buf = xmalloc(buf_sz); for (;;) { ssize_t n = xread(pack_fd, buf, buf_sz); if (!n) break; if (n < 0) die("Failed to checksum %s: %s", pack_name, strerror(errno)); SHA1_Update(&c, buf, n); } free(buf); SHA1_Final(pack_file_sha1, &c); write_or_die(pack_fd, pack_file_sha1, 20); }