{
struct pack_entry e;
- if (!find_pack_entry(sha1, &e, NULL)) {
- error("cannot read sha1_file for %s", sha1_to_hex(sha1));
+ if (!find_pack_entry(sha1, &e, NULL))
return NULL;
- }
- return unpack_entry(e.p, e.offset, type, size);
+ else
+ return unpack_entry(e.p, e.offset, type, size);
}
void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size)
{
unsigned long mapsize;
void *map, *buf;
- struct pack_entry e;
- if (find_pack_entry(sha1, &e, NULL))
- return read_packed_sha1(sha1, type, size);
+ buf = read_packed_sha1(sha1, type, size);
+ if (buf)
+ return buf;
map = map_sha1_file(sha1, &mapsize);
if (map) {
buf = unpack_sha1_file(map, mapsize, type, size);
return buf;
}
reprepare_packed_git();
- if (find_pack_entry(sha1, &e, NULL))
- return read_packed_sha1(sha1, type, size);
- return NULL;
+ return read_packed_sha1(sha1, type, size);
}
void *read_object_with_reference(const unsigned char *sha1,
/* need to unpack and recompress it by itself */
unpacked = read_packed_sha1(sha1, type, &len);
+ if (!unpacked)
+ error("cannot read sha1_file for %s", sha1_to_hex(sha1));
hdrlen = sprintf(hdr, "%s %lu", type, len) + 1;
}
return 0;
}
+
+int read_pack_header(int fd, struct pack_header *header)
+{
+ char *c = (char*)header;
+ ssize_t remaining = sizeof(struct pack_header);
+ do {
+ ssize_t r = xread(fd, c, remaining);
+ if (r <= 0)
+ /* "eof before pack header was fully read" */
+ return PH_ERROR_EOF;
+ remaining -= r;
+ c += r;
+ } while (remaining > 0);
+ if (header->hdr_signature != htonl(PACK_SIGNATURE))
+ /* "protocol error (pack signature mismatch detected)" */
+ return PH_ERROR_PACK_SIGNATURE;
+ if (!pack_version_ok(header->hdr_version))
+ /* "protocol error (pack version unsupported)" */
+ return PH_ERROR_PROTOCOL;
+ return 0;
+}