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

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2007-01-22 21:55:18 -08:00
Родитель 196055c2db
Коммит a69e542989
3 изменённых файлов: 40 добавлений и 12 удалений

5
pack.h
Просмотреть файл

@ -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

Просмотреть файл

@ -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;

Просмотреть файл

@ -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;
}