Browse Source

Refactor the pack header reading function out of receive-pack.c

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 18 years ago
parent
commit
a69e542989
  1. 5
      pack.h
  2. 26
      receive-pack.c
  3. 21
      sha1_file.c

5
pack.h

@ -44,4 +44,9 @@ struct pack_header { @@ -44,4 +44,9 @@ struct pack_header {
#define PACK_IDX_SIGNATURE 0xff744f63 /* "\377tOc" */

extern int verify_pack(struct packed_git *, int);

#define PH_ERROR_EOF (-1)
#define PH_ERROR_PACK_SIGNATURE (-2)
#define PH_ERROR_PROTOCOL (-3)
extern int read_pack_header(int fd, struct pack_header *);
#endif

26
receive-pack.c

@ -250,20 +250,22 @@ static void read_head_info(void) @@ -250,20 +250,22 @@ static void read_head_info(void)

static const char *parse_pack_header(struct pack_header *hdr)
{
char *c = (char*)hdr;
ssize_t remaining = sizeof(struct pack_header);
do {
ssize_t r = xread(0, c, remaining);
if (r <= 0)
return "eof before pack header was fully read";
remaining -= r;
c += r;
} while (remaining > 0);
if (hdr->hdr_signature != htonl(PACK_SIGNATURE))
switch (read_pack_header(0, hdr)) {
case PH_ERROR_EOF:
return "eof before pack header was fully read";

case PH_ERROR_PACK_SIGNATURE:
return "protocol error (pack signature mismatch detected)";
if (!pack_version_ok(hdr->hdr_version))

case PH_ERROR_PROTOCOL:
return "protocol error (pack version unsupported)";
return NULL;

default:
return "unknown error in parse_pack_header";

case 0:
return NULL;
}
}

static const char *pack_lockfile;

21
sha1_file.c

@ -2048,3 +2048,24 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, int write @@ -2048,3 +2048,24 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, int write
}
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;
}

Loading…
Cancel
Save