void **idx_map_)
{
void *idx_map;
- unsigned int *index;
+ uint32_t *index;
unsigned long idx_size;
int nr, i;
int fd = open(path, O_RDONLY);
unsigned long find_pack_entry_one(const unsigned char *sha1,
struct packed_git *p)
{
- unsigned int *level1_ofs = p->index_base;
+ uint32_t *level1_ofs = p->index_base;
int hi = ntohl(level1_ofs[*sha1]);
int lo = ((*sha1 == 0x0) ? 0 : ntohl(level1_ofs[*sha1 - 1]));
void *index = p->index_base + 256;
int mi = (lo + hi) / 2;
int cmp = hashcmp((unsigned char *)index + (24 * mi) + 4, sha1);
if (!cmp)
- return ntohl(*((unsigned int *) ((char *) index + (24 * mi))));
+ return ntohl(*((uint32_t *)((char *)index + (24 * mi))));
if (cmp > 0)
hi = mi;
else
{
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;
+}