Add "unpack_sha1_header()" helper function

It's for people who aren't necessarily interested in the whole
unpacked file, but do want to know the header information (size,
type, etc..)

For example, the delta code can use this to figure out whether
an object is already a delta object, and what it is a delta
against, without actually bothering to unpack all of the actual
data in the delta.
This commit is contained in:
Linus Torvalds
2005-06-01 17:54:59 -07:00
parent f35ca9ed3e
commit c4483576b8
2 changed files with 16 additions and 12 deletions

View File

@ -307,6 +307,19 @@ void *map_sha1_file(const unsigned char *sha1, unsigned long *size)
return map;
}
int unpack_sha1_header(z_stream *stream, void *map, unsigned long mapsize, void *buffer, unsigned long size)
{
/* Get the data stream */
memset(stream, 0, sizeof(*stream));
stream->next_in = map;
stream->avail_in = mapsize;
stream->next_out = buffer;
stream->avail_out = size;
inflateInit(stream);
return inflate(stream, 0);
}
void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned long *size)
{
int ret, bytes;
@ -314,18 +327,8 @@ void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned l
char buffer[8192];
unsigned char *buf;
/* Get the data stream */
memset(&stream, 0, sizeof(stream));
stream.next_in = map;
stream.avail_in = mapsize;
stream.next_out = (unsigned char *)buffer;
stream.avail_out = sizeof(buffer);
inflateInit(&stream);
ret = inflate(&stream, 0);
if (ret < Z_OK)
return NULL;
if (sscanf(buffer, "%10s %lu", type, size) != 2)
ret = unpack_sha1_header(&stream, map, mapsize, buffer, sizeof(buffer));
if (ret < Z_OK || sscanf(buffer, "%10s %lu", type, size) != 2)
return NULL;
bytes = strlen(buffer) + 1;